lmw0320 2023-04-03 11:36 采纳率: 75%
浏览 28

如何使用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()

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

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-03 15:44
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 4月3日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来