首页 新闻 会员 周边

如何实现python代码对多路视频,多个模型进行多进程、多线程的并行化处理?

0
悬赏园豆:30 [待解决问题]

目前有个需求,希望可以使用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()

我运行了代码,发现程序可以正常跑起来,但是预测的时候,发现貌似预测结果很奇怪,有些图片有预测结果,很大部分的图片,却预测不出结果。。程序运行一段时间后,会卡住不再继续执行。。
实现想不通是为什么。想请各位指点下!

老笨啊的主页 老笨啊 | 初学一级 | 园豆:6
提问于:2023-04-03 11:38
< >
分享
所有回答(2)
0

我听我这边开发图像识别的,python没办法并行,只能挨个摄像头轮询

echo_lovely | 园豆:1437 (小虾三级) | 2023-04-07 09:00

感谢答复。。没法并行的话,具体是什么原因呢??
我用多进程读取同一个摄像头,貌似不行? 发现其中一个摄像头读取会提示失败。而调用2次函数,则都是正常的?

支持(0) 反对(0) 老笨啊 | 园豆:6 (初学一级) | 2023-04-10 16:00
0

博主大佬您好,请问您现在解决这个问题了嘛,能否给一份您的完整代码学习学习,感谢。

净乐思 | 园豆:202 (菜鸟二级) | 2024-01-14 23:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册