如何使用python代码进行多路视频多个模型并行推理的操作?

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

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

您的代码结构看起来比较复杂,其中包含多个进程和线程,同时也有多个队列用于传递数据。这种情况下,调试问题比较困难,需要逐步排除问题可能出现的地方。

从您提供的信息中,我们可以推测出一些可能存在的问题:

摄像头数据获取问题:在程序中,您使用了多进程同时读取多路视频流的帧数据,这可能会导致摄像头数据的丢失或重复读取。您可以检查一下每个进程读取的数据是否正确,以及每个进程读取数据的时间间隔是否合适。

模型推理问题:在程序中,您使用了多线程对每路视频流进行多模型并行推理。这可能会导致模型推理速度不均衡,某些模型的推理速度较慢,导致队列中的数据阻塞。您可以检查一下每个线程的推理速度是否正常,以及每个队列中的数据是否正常传递。

结果合并问题:在程序中,您对每路视频流的预测结果进行了合并,这可能会导致结果的不准确或丢失。您可以检查一下每个线程中的预测结果是否正确,以及合并的方式是否合理。

为了更好地排除问题,您可以使用日志记录程序的执行过程,以便更好地追踪问题所在。另外,您可以使用调试工具检查程序执行过程中的各个参数和变量,以便更好地理解程序的执行过程。