目前有个需求,希望可以使用python代码实现接入多个摄像头的数据,对不同路的摄像头数据,进行多个模型的并行推理,然后将每路视频流的预测结果,进行视频流外推操作。 尝试了很久,目前还是没有解决。
我目前的代码大致结构是:
q_frames = [mp.Queue() for _ in sources_list] # 根据视频流路数,创建相同数量的原始图片帧存放队列
sources = [source['uri'] for source in sources_list] # 单独获取每路uri地址
models = load_model(models_info.keys()) # 预加载模型,分配给各个线程
q_infers = [[mp.Queue() for _ in src_id] for src_id in src_model_ids.values()] # 为进程下的线程建立各自的推理结果存放队列。 ---目前是为每路视频搭建一个进程,然后每个路视频下的多个模型起相应的线程(即每个模型起一个线程)进行并行推理操作。
processes = [CameraProcess(source, q_frame) for source, q_frame in zip(sources, q_frames)] # 根据视频流路数,起相应的进程数---CameraProcess用于获取每路视频流的图片帧,放到各自的队列中。这里是起多进程操作
threads = []
for source_id in range(len(sources_list)):
each_threads = []
for i, model_file in enumerate(src_model_ids[str(source_id)]): # 根据模型的数量,起相应的线程。model_file为模型文件的路径。这里是起多线程的操作。
each_threads.append(Thread(target=model_infer, args=(q_frames[source_id], q_infers[source_id][i], models[model_file], models_info[model_file], sources_list[source_id]['frame-interval-dectect'])))
threads.append(each_threads)
for source_id, p in enumerate(processes):
p.start()
for t in threads[source_id]:
t.start()
try:
while True:
for source_id in range(len(sources_list)):
final_dets = [ ]
for i in range(len(src_model_ids[str(source_id)])): # 按模型数量进行遍历,获取指定队列的数据
res_det, frame = q_infers[source_id][i].get() # 获取每个线程下的模型推理结果,进行每路视频的结果合并,确保一路视频经过多个模型的推理,结果合并到一起。
final_dets.append(res_det) # 合并检测结果
res_img = vis(frame, final_dets, class_names)
cv2.imwrite('res.jpg', res_img)
except KeyboardInterrupt:
cv2.destroyAllWindows()
print("ctrl + c, exit main!")
sys.exit()
for source_id, p in enumerate(processes):
p.join()
for t in threads[source_id]:
t.join()
我运行了代码,发现程序可以正常跑起来,但是预测的时候,发现貌似预测结果很奇怪,有些图片有预测结果,很大部分的图片,却预测不出结果。。程序运行一段时间后,会卡住不再继续执行。。
实现想不通是为什么。想请各位指点下!
我听我这边开发图像识别的,python没办法并行,只能挨个摄像头轮询
感谢答复。。没法并行的话,具体是什么原因呢??
我用多进程读取同一个摄像头,貌似不行? 发现其中一个摄像头读取会提示失败。而调用2次函数,则都是正常的?
博主大佬您好,请问您现在解决这个问题了嘛,能否给一份您的完整代码学习学习,感谢。