动手实操YOLO11:我的第一个目标检测项目记录
1. 引言:从零开始的目标检测初体验
最近一直在研究目标检测方向,听说 YOLO11 是 Ultralytics 最新推出的实时检测模型,在速度和精度上都有不错的表现。作为一个刚入门的小白,我也想亲自上手试试看,于是决定用 CSDN 提供的YOLO11 镜像环境来完成我的第一个目标检测项目。
这个镜像已经预装了所有依赖库,包括完整的 Ultralytics 框架、PyTorch、OpenCV 等常用工具,省去了繁琐的环境配置过程。我只需要专注于代码实践和结果分析,非常适合像我这样的新手快速上手。
本文将完整记录我从部署到训练再到推理的全过程,不讲复杂原理,只说“怎么动起来”。如果你也想亲手跑通一个 YOLO11 项目,但又担心环境问题或代码报错,那这篇文章应该能帮上你。
2. 环境准备与项目初始化
2.1 使用镜像快速启动开发环境
CSDN 的 YOLO11 镜像基于最新版 Ultralytics 构建,集成了 Jupyter Notebook 和 SSH 两种访问方式,非常方便。
- Jupyter 方式:适合边写代码边调试,可视化效果好
- SSH 方式:适合熟悉命令行操作的用户,可直接进入终端执行脚本
我选择使用 Jupyter 进入开发环境,打开浏览器就能看到熟悉的界面,无需本地安装任何软件。
2.2 进入项目目录并查看结构
镜像中默认包含了ultralytics-8.3.9/目录,这是 YOLO11 的核心代码库。我们先进入该目录:
cd ultralytics-8.3.9/通过ls命令可以看到主要文件夹如下:
ultralytics/:主代码包assets/:示例图片(如 bus.jpg)train.py:训练入口脚本predict.py:预测脚本(可自定义)
整个环境开箱即用,连预训练权重都可以自动下载,大大降低了入门门槛。
3. 训练自己的第一个 YOLO11 模型
3.1 直接运行训练脚本
既然环境都准备好了,那就先跑一遍官方提供的训练脚本看看效果:
python train.py这行命令会启动默认参数下的训练流程。对于初次尝试来说,不需要修改任何配置也能看到基本输出。
运行后终端会显示类似以下信息:
Epoch gpu_mem box cls dfl loss labels img_size 0.0116 0.0547 0.0723 0.1386 6 640: 100%|██████████| 50/50 [00:12<00:00, 4.07it/s]说明模型已经开始学习了!虽然这只是在小数据集上的模拟训练,但至少证明整个流程是通的。
3.2 查看训练日志与结果保存路径
训练过程中会在当前目录生成runs/detect/train/文件夹,里面包含:
weights/:保存 best.pt 和 last.pt 权重文件results.png:训练指标变化曲线图(mAP、loss 等)args.yaml:本次训练使用的超参数记录
这些内容对后续调优非常有帮助,尤其是results.png可以直观看出模型是否收敛。
小贴士:如果只是测试功能,建议设置
epochs=3来加快验证速度,避免长时间等待。
4. 图像目标检测推理实战
4.1 编写简单的预测脚本
训练完之后,当然要试试模型能不能识别物体。我在项目根目录新建了一个predict.py文件,用来做单张图片的推理。
代码逻辑很简单:
- 加载预训练模型(这里用的是
yolo11s.pt) - 读取一张测试图片(比如
bus.jpg) - 调用模型进行推理
- 把检测框画在原图上并保存
下面是简化后的代码片段:
from ultralytics import YOLO import cv2 # 加载模型 model = YOLO("yolo11s.pt") # 读取图像 img = cv2.imread("ultralytics/assets/bus.jpg") # 推理 results = model(img) # 获取结果并绘制 for result in results: boxes = result.boxes.data.tolist() names = result.names for box in boxes: x1, y1, x2, y2, conf, cls_id = map(int, box[:6]) label = names[cls_id] color = (0, 255, 0) # 绿色框 cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, f"{label} {conf:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) # 保存结果 cv2.imwrite("output_bus.jpg", img) print("推理完成,结果已保存")运行这个脚本:
python predict.py很快就在目录下生成了output_bus.jpg,打开一看,车上的人、公交车本身都被准确框出来了,效果相当不错!
4.2 自定义颜色提升可视化效果
默认的颜色可能不够醒目,我们可以给每个类别分配不同的随机色。参考 CSDN 博文中提到的方法,加入 HSV 转 BGR 的函数:
def hsv2bgr(h, s, v): h_i = int(h * 6) f = h * 6 - h_i p = v * (1 - s) q = v * (1 - f * s) t = v * (1 - (1 - f) * s) r = g = b = 0 if h_i == 0: r, g, b = v, t, p elif h_i == 1: r, g, b = q, v, p # ...其余分支省略... return int(b * 255), int(g * 255), int(r * 255) def random_color(id): h_plane = (((id << 2) ^ 0x937151) % 100) / 100.0 s_plane = (((id << 3) ^ 0x315793) % 100) / 100.0 return hsv2bgr(h_plane, s_plane, 1)然后在绘图时调用random_color(cls_id)获取专属颜色,这样不同类别的框就有区分度了。
5. 深入理解 YOLO11 的前后处理机制
5.1 预处理流程解析
要想真正掌握模型,不能只停留在“调用 API”层面。我深入看了下源码,发现 YOLO11 的预处理其实和 YOLOv8 几乎一致,主要包括以下几个步骤:
- LetterBox 或 WarpAffine:将输入图像缩放到固定尺寸(如 640x640),短边填充灰条(114,114,114)
- BGR → RGB:OpenCV 默认读取为 BGR,需转换为 RGB 输入网络
- HWC → CHW:调整通道顺序
- 归一化:像素值除以 255,变为 [0,1] 区间
- 转 Tensor:交给 PyTorch 处理
其中最关键是缩放方式的选择。我对比了两种方法的效果:
- LetterBox:保持原始宽高比,无变形,但输入尺寸不固定
- WarpAffine:强制拉伸到目标分辨率,速度快,适合 GPU 批量处理
实际项目中推荐使用 LetterBox,避免因形变影响检测精度。
5.2 后处理关键步骤
推理完成后,模型输出的是大量候选框(YOLO11 默认有 8400 个),需要经过后处理才能得到最终结果。主要分为两步:
(1)解码边界框
模型输出的是中心点坐标(cx, cy)和宽高(w, h),需要转换为左上角和右下角坐标:
left = cx - w * 0.5 top = cy - h * 0.5 right = cx + w * 0.5 bottom = cy + h * 0.5同时还要乘以逆仿射变换矩阵,把坐标映射回原始图像空间。
(2)非极大值抑制(NMS)
多个重叠框可能对应同一个物体,需要用 NMS 去除冗余预测。核心思想是:
- 按置信度排序
- 保留最高分的框
- 删除与其 IoU 超过阈值的其他框
- 重复直到处理完所有框
这部分逻辑可以自己实现,也可以直接调用torchvision.ops.nms()。
6. ONNX 导出与跨平台部署准备
6.1 为什么要导出 ONNX?
虽然 Python 下运行很方便,但如果想部署到嵌入式设备或 C++ 工程中,就需要更轻量化的格式。ONNX(Open Neural Network Exchange)就是一种通用的中间表示格式,支持多种推理引擎(如 TensorRT、ONNX Runtime)。
6.2 修改代码以适配 ONNX 输出
为了让导出的模型兼容 TensorRT,我们需要做两点调整:
- 修改输出节点名:将默认的
output0改为output - 添加 transpose 层:交换最后两个维度,使输出形状为
[batch, 8400, 84]
具体修改位置:
- 在
exporter.py中设置output_names=["output"] - 在
head.py的forward函数中增加.permute(0, 2, 1)
6.3 执行导出命令
创建export.py文件:
from ultralytics import YOLO model = YOLO("yolo11s.pt") success = model.export(format="onnx", dynamic=True, simplify=True)运行:
python export.py成功后会生成yolo11s.onnx文件,可以用 Netron 工具打开查看网络结构,确认输入输出节点名称和维度是否正确。
7. 实际应用场景思考
7.1 我能用它做什么?
通过这次动手实践,我发现 YOLO11 不仅能识别常见的车辆、行人,还能用于很多实际场景:
- 安防监控:自动检测异常行为或可疑物品
- 工业质检:查找产品表面缺陷
- 零售分析:统计店内顾客数量和动线
- 农业监测:识别病虫害或作物生长状态
只要收集相应数据重新训练,就能快速定制专属检测器。
7.2 如何提升检测效果?
在测试中我也发现一些问题,比如小目标漏检、遮挡误判等。可以通过以下方式优化:
- 使用更高分辨率输入(如 1280x1280)
- 增加训练轮数和数据增强手段
- 调整 NMS 阈值和置信度筛选条件
- 尝试更大的模型版本(如 yolo11m、yolo11l)
此外,还可以结合跟踪算法(如 ByteTrack)实现多目标持续追踪。
8. 总结:一次成功的入门级实战经历
这次使用 CSDN 提供的 YOLO11 镜像完成目标检测项目的经历让我收获颇丰。总结一下几个关键点:
- 环境搭建不再是障碍:一键启动的镜像极大提升了效率
- 训练推理流程清晰明了:Ultralytics 的 API 设计非常友好
- 可扩展性强:支持导出 ONNX,便于后续工程化部署
- 社区资源丰富:已有大量参考案例和优化方案可供借鉴
对于初学者来说,最重要的是先让模型“跑起来”,看到实际效果,才能激发继续深入的兴趣。而 YOLO11 + CSDN 镜像的组合,正是这样一个理想的起点。
下一步我打算尝试用自己的数据集进行微调,看看能否实现特定场景下的精准识别。技术之路才刚刚开始,期待更多探索!
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。