刘虾 2025-03-12 23:55 采纳率: 50%
浏览 147
已结题

求yolov11高效率推理代码,支持cpu多线程调用的

因有1000张图片,实时检测要求,2-3秒出结果,求yolov11高效率推理代码,支持cpu多线程,用线程池管理调用的,每100张图片分一组得到线程数(即一个线程处理100张图片或者50张),不要说gpu,没有gpu电脑就普通电脑

  • 写回答

6条回答 默认 最新

  • 彬彬侠 优质创作者: 人工智能技术领域 2025-03-13 11:34
    关注

    下面提供一个使用 Python 和 ThreadPoolExecutor 对 YOLOv11 模型在 CPU 上进行高效推理的示例代码。代码假设已有 1000 张图片存放在某个文件夹中,每 100 张图片分为一组,每组由一个线程处理,达到并行加速推理的目的。代码仅包含模型加载和前向推理,不涉及图像预处理和后处理(可以根据需要自行添加)。

    请注意:

    • 使用 CPU 推理时,性能会受限于 CPU 核心数和模型规模,实际 2-3 秒内处理 1000 张图片需要较高性能的 CPU。
    • YOLOv11 模型文件(如 "yolov11.pt")需事先准备好。
    • 本示例采用 Ultralytics YOLO 接口,如非该实现,可根据自己模型接口做相应调整。

    import os
    import glob
    import time
    import cv2
    import torch
    from concurrent.futures import ThreadPoolExecutor, as_completed
    from ultralytics import YOLO  # 请确保已安装 ultralytics 包
    
    def process_batch(image_paths, model):
        """
        对一个图片批次进行推理
        :param image_paths: 图片路径列表
        :param model: 已加载的 YOLOv11 模型
        :return: 当前批次所有图片的推理结果列表
        """
        batch_results = []
        for img_path in image_paths:
            # 读取图片(不含复杂预处理,仅做读取)
            img = cv2.imread(img_path)
            if img is None:
                continue  # 跳过读取失败的图片
            # 调用模型进行前向推理
            # 注意:这里调用 model(img) 内部会处理必要的尺寸变换,返回原始预测结果
            result = model(img, verbose=False)  # 无后处理,仅得到 raw output
            batch_results.append(result)
        return batch_results
    
    def main():
        # 设定模型运行设备为 CPU
        device = "cpu"
        # 加载 YOLOv11 模型(确保 yolov11.pt 权重文件存在)
        model = YOLO("yolov11.pt")
        model.model.to(device)
        model.model.eval()  # 切换到评估模式
    
        # 获取所有图片路径(假设图片格式为 jpg,可根据需要修改)
        image_folder = "path/to/images"  # 替换为图片所在目录
        image_paths = glob.glob(os.path.join(image_folder, "*.jpg"))
        total_images = len(image_paths)
        print(f"共找到 {total_images} 张图片")
    
        # 按批次划分,每批处理100张图片
        batch_size = 100
        batches = [image_paths[i:i+batch_size] for i in range(0, total_images, batch_size)]
        print(f"共分成 {len(batches)} 个批次")
    
        start_time = time.time()
    
        # 使用线程池执行,每个批次一个线程
        results_all = []
        with ThreadPoolExecutor(max_workers=len(batches)) as executor:
            # 提交每个批次的处理任务
            futures = [executor.submit(process_batch, batch, model) for batch in batches]
            for future in as_completed(futures):
                results_all.extend(future.result())
    
        end_time = time.time()
        print(f"共处理 {total_images} 张图片, 用时 {end_time - start_time:.2f} 秒")
    
        # 此处 results_all 为所有图片的推理结果(未经后处理)
        # 可根据需要保存或进一步处理这些结果
        # 例如:打印前 5 个结果
        for i, res in enumerate(results_all[:5]):
            print(f"图片 {i+1} 推理结果: {res}")
    
    if __name__ == "__main__":
        main()
    

    代码说明

    1. 模型加载与设备设置

      • 使用 YOLO("yolov11.pt") 加载预训练权重,并调用 model.model.to("cpu") 将模型部署到 CPU 上。
      • 调用 model.model.eval() 使模型进入评估模式。
    2. 图片分组

      • 利用 glob.glob 获取指定目录下所有 jpg 格式的图片,将 1000 张图片分为每批 100 张(可根据实际情况调整)。
    3. 多线程推理

      • 使用 ThreadPoolExecutor 创建线程池,每个线程处理一个批次图片。
      • 每个线程内依次读取图片并调用模型进行前向推理,结果汇总到列表中。
    4. 性能检测

      • 通过 time.time() 测量整个推理过程耗时,方便观察是否能达到 2-3 秒内处理 1000 张图片的要求(具体耗时与 CPU 性能和模型规模密切相关)。

    以上代码为一个基本的高效推理示例,实际使用时可以根据需要添加异常处理、日志记录或后续结果的可视化处理。希望这能帮你实现需求!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 修改了问题 3月13日
  • 修改了问题 3月13日
  • 展开全部