在openalpr上使用2个视频流和GPU硬件加速

时间:2019-06-04 23:23:05

标签: python-3.x openalpr

我正在使用带有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上使用多个摄像头?

谢谢

0 个答案:

没有答案