如何让YOLOv8在CLI中显示图像各类别检测数量?
实现YOLOv8 CLI显示单张图像类别检测数量总和的方法
方法一:直接修改YOLOv8推理源码
这是最直接的方式,改完后用原生CLI命令就能输出目标结果。
1. 定位目标文件
不管你是通过pip安装的YOLOv8还是克隆的源码包,找到ultralytics/yolo/v8/detect/predict.py文件:
- pip安装路径:Python环境的
site-packages/ultralytics/目录下 - 源码克隆路径:项目根目录的对应路径中
2. 修改检测逻辑代码
打开predict.py,找到DetectionPredictor类里的predict_step方法,在处理单张图像预测结果的循环中,添加类别统计与打印代码:
# 遍历每张图像的预测结果 for i, pred in enumerate(preds): # 保留置信度符合阈值要求的检测框(和原逻辑一致) pred = pred[pred[:, 4] > self.args.conf] # 统计每个类别的检测数量 cls_counts = {} for cls_id in pred[:, 5].cpu().numpy(): cls_name = self.model.names[int(cls_id)] cls_counts[cls_name] = cls_counts.get(cls_name, 0) + 1 # 格式化统计结果字符串 if cls_counts: count_str = ", ".join([f"{v} {k}" for k, v in cls_counts.items()]) else: count_str = "No detections" # 提取推理与NMS阶段的耗时(使用YOLOv8自带的时间统计变量) infer_time = (self.t[1] - self.t[0]) * 1000 nms_time = (self.t[2] - self.t[1]) * 1000 # 按YOLOv7格式输出结果 print(f"{count_str}, Done. ({infer_time:.1f}ms) Inference, ({nms_time:.1f}ms) NMS")
注意:如果不同YOLOv8版本中self.t时间变量不适用,可参考原代码中输出时间的逻辑,替换为对应变量即可。
3. 测试效果
保存修改后,正常使用CLI执行推理命令:
yolo detect predict source=你的图片路径 model=你的模型文件.pt conf=0.25
此时命令行就会输出和YOLOv7格式一致的类别检测数量统计。
方法二:编写自定义脚本(无需修改源码)
不想改动YOLOv8源码的话,可以写个小脚本调用官方API,手动统计并输出结果:
from ultralytics import YOLO import time # 加载训练好的模型 model = YOLO("你的模型文件.pt") # 指定要检测的单张图像路径 img_path = "你的图片路径.jpg" # 记录推理总耗时 start_time = time.time() results = model(img_path) end_time = time.time() # 统计每个类别的检测数量 cls_counts = {} for result in results: for box in result.boxes: cls_name = model.names[int(box.cls[0])] cls_counts[cls_name] = cls_counts.get(cls_name, 0) + 1 # 格式化输出内容 count_str = ", ".join([f"{v} {k}" for k, v in cls_counts.items()]) if cls_counts else "No detections" total_time = (end_time - start_time) * 1000 # 打印最终结果 print(f"{count_str}, Done. ({total_time:.1f}ms) Inference + NMS")
运行该脚本即可得到目标输出,缺点是无法直接使用原生CLI命令启动推理,需通过脚本触发。
内容的提问来源于stack exchange,提问作者Dervan
相关产品推荐
相关产品推荐

