
1. YOLO11单图检测实战从模型加载到结果保存全流程解析在计算机视觉领域实时目标检测一直是工业界和学术界的核心课题。YOLO系列作为单阶段检测器的代表其最新迭代版本YOLO11在检测精度和推理速度上都有显著提升。本文将手把手演示如何用训练好的YOLO11模型对单张图像进行检测并完整保存可视化结果。不同于官方文档的简略说明这里会结合笔者在Jetson Orin Nano等边缘设备上的实战经验分享那些手册里不会写的细节技巧。2. 环境准备与模型加载2.1 基础环境配置YOLO11对PyTorch环境的依赖较为严格推荐使用以下组合pip install torch2.0.1cu118 torchvision0.15.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install ultralytics11.0.0 # 官方YOLO11实现库注意若使用Jetson等ARM架构设备需预先安装JetPack 6.0并编译安装适合的PyTorch版本。笔者实测发现直接pip安装的预编译包在Orin Nano上会出现Tensor核心利用率低下的问题。2.2 模型文件准备假设我们已经完成模型训练训练流程可参考笔者另一篇《YOLO11自定义数据集训练避坑指南》需要准备以下文件模型权重best.pt训练得到的最佳权重类别文件data.yaml包含类别名称和数据集配置示例图片test.jpg待检测图像2.3 模型加载的三种方式YOLO11提供了灵活的模型加载接口根据场景选择最适合的方案from ultralytics import YOLO # 方式1直接加载预训练模型自动下载 model YOLO(yolov11n.pt) # 纳米尺度模型 # 方式2加载自定义训练权重 model YOLO(path/to/best.pt) # 方式3从配置文件初始化适合魔改网络结构 model YOLO(yolov11.yaml).load(best.pt)实操心得边缘设备部署时建议采用方式3先加载.yaml再注入权重可避免自动下载预训练模型导致的存储空间问题。曾有个项目因此浪费了2小时排查存储报错。3. 单图检测核心流程3.1 图像预处理最佳实践YOLO11内部会自动进行归一化和letterbox处理但外部输入仍需注意import cv2 # 正确的读取方式 img cv2.imread(test.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # OpenCV默认BGR需转换 # 错误示范直接传入文件路径虽然YOLO支持但会丢失EXIF方向信息 # results model(test.jpg)3.2 推理参数详解基础检测代码看似简单但参数配置直接影响结果results model.predict( sourceimg, conf0.25, # 置信度阈值工业场景建议0.5 iou0.7, # NMS的IoU阈值 imgsz640, # 推理尺寸需与训练一致 devicecuda, # 自动选择GPU/CPU saveFalse, # 先不保存以便调试 augmentFalse # 推理时禁用TTA加速 )关键参数选择逻辑imgsz当训练使用矩形输入时如640×384此处需保持相同比例augment测试时增强TTA会提升精度但显著降低速度实时场景慎用device指定0或cpu可强制使用特定设备3.3 结果解析与可视化YOLO11的结果对象包含丰富信息常用提取方式# 获取检测结果列表 detections results[0].boxes # 遍历每个检测框 for box in detections: xyxy box.xyxy[0].tolist() # 边框坐标 conf box.conf.item() # 置信度 cls_id box.cls.item() # 类别ID cls_name model.names[int(cls_id)] # 类别名称 print(f检测到 {cls_name}置信度 {conf:.2f}位置 {xyxy}) # 可视化带中文标签需额外处理 annotated_img results[0].plot() cv2.imshow(Result, cv2.cvtColor(annotated_img, cv2.COLOR_RGB2BGR)) cv2.waitKey(0)避坑指南官方plot()方法不支持中文显示。如需中文标签建议用以下方案from PIL import ImageFont, ImageDraw font ImageFont.truetype(SimHei.ttf, 20) draw ImageDraw.Draw(annotated_img) draw.text((x,y), 中文标签, fill(255,0,0), fontfont)4. 结果保存与性能优化4.1 多格式保存方案YOLO11原生支持的结果保存方式results model.predict( sourceimg, saveTrue, # 保存带标注的图片 save_txtTrue, # 保存YOLO格式标签 save_confTrue, # 标签中包含置信度 save_cropTrue, # 保存裁剪出的目标区域 projectruns/detect, # 保存目录 nameexp # 实验名称 )更灵活的定制保存方案# 保存原始检测数据JSON格式 import json with open(results.json, w) as f: json.dump(results[0].tojson(), f) # 保存为COCO评估格式 coco_results results[0].coco()4.2 边缘设备优化技巧在Jetson Orin Nano上的加速方案TensorRT加速python export.py --weights best.pt --include engine --device 0半精度推理model.predict(sourceimg, halfTrue) # FP16推理批处理优化# 即使单图也采用批处理提升GPU利用率 imgs [img1, img2] if batch else [img] * 4 results model.predict(sourceimgs)实测性能对比Orin Nano 8GB配置方案推理时延(ms)内存占用(MB)FP32原生42.11203FP16原生28.7892TensorRT15.27435. 典型问题排查手册5.1 检测结果异常排查现象1检测框位置偏移检查训练时的rect参数是否与推理一致验证图像预处理是否包含letterbox可通过model.model.args查看现象2置信度普遍偏低检查data.yaml中的类别顺序是否与训练时一致确认输入图像与训练数据分布相似可用model.visualize()诊断5.2 内存溢出解决方案报错CUDA out of memory# 解决方案1减小推理尺寸 results model.predict(sourceimg, imgsz320) # 解决方案2启用内存优化 model.predict(sourceimg, streamTrue) # 流式处理5.3 模型部署常见问题问题ONNX导出后精度下降导出时添加dynamicFalse参数固定输入尺寸检查opset_version12YOLO11需要较高版本model.export(formatonnx, dynamicFalse, opset12)6. 进阶应用场景拓展6.1 非正方形模型适配对于道路积水检测等特殊场景需要矩形输入时的处理方法训练时修改data.yamlrect: True # 启用矩形训练推理时指定比例results model.predict(sourceimg, imgsz(640, 384)) # w×h比例6.2 多模型集成方案结合SAM等分割模型提升检测效果from segment_anything import SamPredictor sam SamPredictor(...) yolo_results model.predict(sourceimg) for box in yolo_results[0].boxes: masks sam.predict(box.xyxy) # 融合检测框与分割掩码6.3 视频流实时处理修改source参数即可处理视频# 处理摄像头输入 results model.predict(source0, showTrue, streamTrue) # 处理视频文件 results model.predict(sourceinput.mp4, saveTrue)在1080p视频上的性能建议设置streamTrue启用异步处理添加vid_stride2跳帧处理保持实时性使用imgsz320平衡精度速度