手把手教你用YOLO11做图像标注与训练
你是否还在为制作目标检测数据集而反复打开标注工具、手动整理文件夹、调试路径报错而头疼?是否试过部署YOLO环境却卡在依赖冲突、CUDA版本不匹配、配置文件格式错误上?别担心——这次我们不讲理论,不堆参数,就用一个开箱即用的YOLO11镜像,从零开始,真正手把手带你完成一次完整的图像标注→数据转换→模型训练→结果验证闭环。整个过程不需要你装Python环境、不用编译CUDA、不改一行源码,所有命令复制粘贴就能跑通。下面我们就从最基础的“怎么打开这个镜像”开始。
1. 镜像启动与环境确认
YOLO11镜像已为你预装好全部依赖:PyTorch 2.3+、Ultralytics 8.3.9、Labelme、OpenCV、NumPy、Pillow等,还内置了Jupyter Notebook和SSH两种交互方式,适配不同操作习惯。
1.1 启动后首件事:进入项目目录
镜像启动成功后,默认工作区是根目录。你需要先进入YOLO11主工程目录才能运行训练脚本:
cd ultralytics-8.3.9/这一步看似简单,但很多新手会忽略——如果你直接在/下执行python train.py,会提示ModuleNotFoundError: No module named 'ultralytics',因为Python找不到包路径。而cd ultralytics-8.3.9/不仅切换到正确路径,还自动激活了项目级Python环境。
1.2 验证环境是否就绪
运行以下命令检查关键组件状态:
# 检查PyTorch是否可用且支持GPU(如显卡可用) python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA: {torch.cuda.is_available()}')" # 检查Ultralytics版本 python -c "from ultralytics import __version__; print('Ultralytics', __version__)" # 检查Labelme是否已安装 labelme --version 2>/dev/null || echo "Labelme not found — will install now"如果Labelme未安装(极小概率),只需执行:
pip install labelme无需担心版本冲突——镜像中已锁定兼容版本。
注意:所有操作均在镜像内部完成,无需本地安装任何工具。你看到的每一条命令,都是实测可运行的“确定路径”。
2. 数据准备:5分钟建好你的第一个数据集
目标检测效果好不好,七分靠数据。但“高质量数据集”不等于“海量数据”,而是结构清晰、标注准确、划分合理。我们以“人”和“车”两个类别为例,全程使用开源免费工具,不依赖商业平台。
2.1 文件夹结构规范(关键!)
YOLO11严格遵循固定目录结构。请务必按以下方式组织你的数据:
ultralytics-8.3.9/ ├── resources/ │ ├── images/ │ │ └── det/ │ │ ├── json/ ← 原图 + Labelme生成的json文件(同名存放) │ │ └── datasets/ │ │ └── images/ ← 后续生成的train/val/test图片 │ ├── config/ │ │ ├── data/ │ │ │ └── yolo11-det.yaml ← 数据集配置文件(必须) │ │ └── model/ │ │ └── yolo11-det.yaml ← 模型结构配置(已预置) │ └── weights/ │ └── det/ │ └── yolo11n.pt ← 预训练权重(已预置) └── tool/ ├── tool_json2label_det.py ← JSON转YOLO标签脚本(已预置) └── tool_det2datasets.py ← 划分训练/验证集脚本(已预置)为什么强调结构?
Ultralytics框架通过相对路径读取数据。一旦路径错一级(比如把json放在resources/下而非resources/images/det/json),后续所有步骤都会报FileNotFoundError,且错误提示不明确。我们帮你踩过这个坑,现在直接给你标准答案。
2.2 用Labelme快速标注(3步搞定)
Labelme是轻量、跨平台、支持中文类别的首选标注工具。启动方式极简:
cd resources/images/det/json labelme标注时只需三步:
- 点击左上角Open Dir→ 选择当前文件夹(即
json目录); - 左侧工具栏选Create Rectangle(矩形框);
- 在图中拖拽框选目标,弹出对话框输入类别名:person或car(必须与yaml中定义一致,区分大小写);
- 按
Ctrl+S保存,自动生成同名.json文件。
小技巧:
- 标注时按
↑/↓键可快速切换上一张/下一张图; - 按
W键可连续创建多个框(适合同一张图多人多车); - 所有json文件必须与原图同名(如
001.jpg↔001.json),否则转换脚本无法匹配。
2.3 JSON转YOLO标签:一行命令完成
Labelme生成的是JSON格式,而YOLO训练需要.txt格式的文本标签(每行代表一个目标)。镜像已内置转换脚本,无需自己写代码:
cd ../../../ python tool/tool_json2label_det.py \ --json_dir resources/images/det/json \ --save_dir resources/images/det/datasets/labels执行后,你会在resources/images/det/datasets/labels/下看到与原图同名的.txt文件,内容类似:
0 0.423 0.615 0.210 0.382 1 0.785 0.521 0.195 0.267含义依次为:类别ID 中心x(归一化) 中心y(归一化) 宽度(归一化) 高度(归一化)。
归一化 = 像素值 ÷ 图片宽或高。这是YOLO的标准格式,确保模型能泛化到不同分辨率图像。
2.4 自动划分训练集与验证集
真实项目中,你不会手动复制粘贴图片。用预置脚本一键打乱并划分:
python tool/tool_det2datasets.py \ --images_dir resources/images/det/datasets/images \ --labels_dir resources/images/det/datasets/labels \ --output_dir resources/images/det/datasets \ --train_ratio 0.8 \ --val_ratio 0.2执行完成后,resources/images/det/datasets/下将自动生成:
images/train/和images/val/(图片)labels/train/和labels/val/(对应标签)
划分逻辑:
- 所有图片随机打乱,按比例分配;
- 同一图片的
.jpg和.txt必然同时进入同一子集(避免训练时找不到标签); - 不生成
test目录(YOLO默认用val集合做验证和测试)。
3. 数据配置:写对这一个YAML,训练不报错
YOLO11通过YAML文件统一管理数据路径和类别信息。新建文件resources/config/data/yolo11-det.yaml,内容如下:
# 数据根目录(相对于该yaml文件的位置) path: ../ultralytics-8.3.9/resources/images/det/datasets # 子集文件夹名(必须与tool脚本生成的文件夹名完全一致) train: images/train val: images/val # 类别定义:序号从0开始,名称必须与Labelme标注时输入的一致 names: 0: person 1: car关键细节说明:
path是相对路径,指向datasets文件夹(不是images);train/val是子文件夹名,不是完整路径;names中的键必须是整数,值必须是字符串,且与标注时输入的类别名逐字相同(包括空格、大小写);- 如果你后续增加“bicycle”类别,就加一行
2: bicycle,无需改动其他地方。
4. 模型训练:3个参数决定效果上限
YOLO11提供多种模型尺寸(n/s/m/l/x),我们推荐从最小的yolo11n开始——它参数少、训练快、显存占用低,非常适合入门验证流程。
4.1 创建训练脚本train_det.py
在ultralytics-8.3.9/目录下新建文件train_det.py,内容如下:
from ultralytics import YOLO, settings # 设置训练输出目录(避免默认存到~/.ultralytics) settings.update({ "runs_dir": "./runs", "weights_dir": "./weights/det" }) def main(): # 加载模型结构 + 预训练权重 model = YOLO("resources/config/model/yolo11-det.yaml").load("weights/det/yolo11n.pt") # 开始训练(核心参数说明见下方) results = model.train( data="resources/config/data/yolo11-det.yaml", # 数据配置 epochs=100, # 训练轮数(小数据集够用) batch=4, # 每批图像数(根据显存调整) imgsz=640, # 输入图像尺寸(必须是32倍数) workers=2, # 数据加载进程数(CPU核心数-1) optimizer='AdamW', # 优化器(比SGD更稳定) lr0=1e-3, # 初始学习率(小数据集建议1e-3~1e-2) cos_lr=True, # 余弦退火学习率(提升收敛性) patience=20, # 早停轮数(验证指标20轮不提升则停止) device='cpu' # 显卡可用时填'0'或'cuda:0' ) if __name__ == "__main__": main()参数选择逻辑(小白友好版):
epochs=100:5张图训练100轮 ≈ 500次迭代,足够让模型记住基本模式;batch=4:若显存不足报OOM,改为batch=2或batch=1;imgsz=640:YOLO标准输入尺寸,太小丢失细节,太大显存爆炸;device='cpu':无GPU时安全选项;有NVIDIA显卡且驱动正常,改为'0'即可加速3~5倍。
4.2 运行训练并观察日志
执行命令:
python train_det.py你会看到实时输出:
Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 0/100 1.200G 1.2456 1.8721 1.3324 12 640 1/100 1.200G 1.1823 1.7945 1.2987 15 640 ...如何判断训练正常?
GPU_mem稳定不飙升(显存溢出会报错);box_loss/cls_loss数值随epoch缓慢下降(初期可能波动,10轮后应明显降低);Instances列数字与你数据集中目标总数接近(说明标签被正确读取)。
训练完成后,模型权重将保存在runs/detect/train/weights/下,其中best.pt是验证指标最优的模型,last.pt是最后一轮模型。
5. 模型推理:用训练好的模型检测新图
训练只是手段,落地才是目的。用几行代码,让模型在真实图片上“看见”人和车。
5.1 编写预测脚本predict_det.py
from ultralytics import YOLO # 加载你训练好的最佳模型 model = YOLO("runs/detect/train/weights/best.pt") # 对验证集所有图片进行预测(也可指定单张图路径) results = model.predict( source='resources/images/det/datasets/images/val', imgsz=640, project='runs/detect/predict', # 输出根目录 name='exp', # 输出子文件夹名 save=True, # 保存带框图片 conf=0.5, # 置信度阈值(0.5以上才显示) iou=0.45, # NMS交并比阈值(去重用) device='cpu' # 同训练设备 )5.2 查看结果
运行后,打开runs/detect/predict/exp/文件夹,你会看到:
- 所有预测图片(带红色边框和类别标签);
- 一个
results.txt记录每张图的检测数量和耗时; predictions.json包含每个框的坐标、置信度等原始数据。
效果判断标准(非技术语言):
- 框是否“套住”目标主体(不偏移、不缩放过度);
- 类别标签是否正确(person没标成car);
- 小目标(远处的人)是否被检出;
- 重叠目标(车前站人)是否两个都框出。
如果效果不理想,优先检查:
- 标注质量(json里框是否画准、类别名是否拼错);
- 数据配置(yolo11-det.yaml中
path和names是否匹配); - 训练轮数(100轮不够可增至200);
- 学习率(
lr0=1e-3效果差可试1e-2)。
6. 常见问题速查(省下80%调试时间)
以下是实测高频问题及一句话解决方案:
Q:运行
labelme报错ModuleNotFoundError: No module named 'PyQt5'
A:执行pip install pyqt5(镜像已预装,极少发生;如遇则重装)。Q:
tool_json2label_det.py报错KeyError: 'imageHeight'
A:Labelme保存时未勾选"Auto-save mode"或图片未正确加载。重新打开图片 → 框选 →Ctrl+S强制保存。Q:训练时报错
AssertionError: train: No labels found
A:检查yolo11-det.yaml中train路径是否指向images/train(不是train);再检查labels/train/下是否有与图片同名的.txt文件。Q:预测图片全黑/无框/只有部分框
A:降低conf参数(如conf=0.25);或检查图片路径是否含中文/空格(YOLO不支持,需改英文名)。Q:训练速度极慢(CPU下每轮>5分钟)
A:减小imgsz(如imgsz=320);或确认workers=0(Windows系统设为0,Linux可设为CPU核心数-1)。
这些问题我们都已在镜像中预验证并固化解决方案。你遇到的,大概率是我们已解决过的。
7. 下一步:让YOLO11真正为你所用
你现在已掌握YOLO11从标注到训练的完整链路。接下来可以:
- 扩展类别:在
yolo11-det.yaml中添加2: dog、3: traffic_light,重新运行转换和训练脚本; - 换模型尺寸:将
yolo11n.pt换成yolo11s.pt(精度更高,速度稍慢); - 导出为ONNX:用
model.export(format='onnx')生成通用格式,部署到边缘设备; - 接入摄像头:修改
predict_det.py的source为0(调用默认摄像头)。
YOLO系列的价值,从来不在“算法多炫酷”,而在于把前沿技术压缩成可复用、可组合、可交付的工程模块。你今天走通的每一步,都是未来快速搭建工业质检、智能安防、农业识别系统的基石。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。