因有1000张图片,实时检测要求,2-3秒出结果,求yolov11高效率推理代码,支持cpu多线程,用线程池管理调用的,每100张图片分一组得到线程数(即一个线程处理100张图片或者50张),不要说gpu,没有gpu电脑就普通电脑
6条回答 默认 最新
关注下面提供一个使用 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()
代码说明
模型加载与设备设置
- 使用
YOLO("yolov11.pt")加载预训练权重,并调用model.model.to("cpu")将模型部署到 CPU 上。 - 调用
model.model.eval()使模型进入评估模式。
- 使用
图片分组
- 利用
glob.glob获取指定目录下所有 jpg 格式的图片,将 1000 张图片分为每批 100 张(可根据实际情况调整)。
- 利用
多线程推理
- 使用
ThreadPoolExecutor创建线程池,每个线程处理一个批次图片。 - 每个线程内依次读取图片并调用模型进行前向推理,结果汇总到列表中。
- 使用
性能检测
- 通过
time.time()测量整个推理过程耗时,方便观察是否能达到 2-3 秒内处理 1000 张图片的要求(具体耗时与 CPU 性能和模型规模密切相关)。
- 通过
以上代码为一个基本的高效推理示例,实际使用时可以根据需要添加异常处理、日志记录或后续结果的可视化处理。希望这能帮你实现需求!
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报