我正在使用带有Python3绑定的最新版本的openALPR SDK。
我们正在具有GTX1050的Windows笔记本电脑上使用openALPR GPU加速功能。当使用一个摄像头流(使用alprstream对象)时,一切似乎运行良好,但是当使用两个启用GPU加速功能的摄像头时,我开始遇到读/写内存访问冲突,诸如“图像高度为错误”,以及其他一些与GPU相关的异常。执行以下代码(由两个线程执行)时会发生崩溃:
def start_feed(self):
while True:
while self.alpr_stream.video_file_active() and self.alpr_stream.get_queue_size() > 0:
self.alpr_stream.process_batch(self.alpr)
active_groups = len(self.alpr_stream.peek_active_groups())
if active_groups > 0:
groups = self.alpr_stream.pop_completed_groups()
for group in groups:
print("=" * 50)
print(json.dumps(group, indent=4))
print("Group ({}-{}): {} ({:.2f}% confident)".format(
group['epoch_start'], group['epoch_end'],
group['best_plate']['plate'], group['best_plate']['confidence']))
print("=" * 50)
group['best_plate']['camera_id'] = group['camera_id']
self.signal.emit(group['best_plate'])
特别是,它在此行崩溃:
self.alpr_stream.process_batch(self.alpr)
每个视频流都有自己的线程,alpr和alprstream对象。但是,似乎处理流/ GPU批处理是共享的,因为仅当两个相机流都使用process_batch()函数时,应用程序才会崩溃。
我曾尝试通过互斥Mutex.acquire()和Mutex.release()来阻止同时访问该功能,但这没用。
以下是我遇到的一些例外情况:
''' OSError:异常:访问冲突写入0x00000000E50A1CA0 '''
''' OSError:异常:访问冲突读取0x0000000000000000 '''
以下是有关我们正在使用的内容的更多详细信息:
openALPR SDK版本:2.6.103
Python版本:3.6.8
gpu_batch = 10
alprstream frame_queue_size = 10(对于每个流)
我们现在可以使2个视频流正常工作的唯一方法是将一个流分配给GPU,将另一个分配给CPU,但是CPU流比GPU慢得多。
问题: 知道为什么会这样吗?以及我们如何在同一个GPU上使用多个摄像头?
谢谢