2026/2/9 6:41:13
网站建设
项目流程
chrome网站开发插件,阿里云 域名 做网站,浅析我国门户网站建设不足,常州溧阳网站建设YOLO11自定义数据集训练#xff0c;保姆级教学
前言
你是不是也遇到过这样的问题#xff1a;想用最新的YOLO11做实例分割#xff0c;但卡在第一步——不知道从哪开始准备数据#xff1f;标注完不会转格式#xff1f;配置文件改到怀疑人生#xff1f;训练脚本跑不起来保姆级教学前言你是不是也遇到过这样的问题想用最新的YOLO11做实例分割但卡在第一步——不知道从哪开始准备数据标注完不会转格式配置文件改到怀疑人生训练脚本跑不起来别急这篇教程就是为你写的。它不讲晦涩的原理不堆砌参数表格不假设你已经会Labelme、会配环境、会调参。我们从你打开电脑那一刻开始手把手带你走完完整闭环标注一张图 → 转成YOLO能读的格式 → 组织好数据目录 → 写对配置文件 → 运行一行命令开始训练 → 看到第一个loss下降 → 用自己训出来的模型跑出第一张分割效果图。整个过程你只需要会点鼠标、会改几行路径、会复制粘贴代码。哪怕你昨天才第一次听说“实例分割”今天也能跑通整套流程。1. 准备工作先让YOLO11镜像跑起来你拿到的是一个预装好的YOLO11镜像这意味着——不用自己装Python、不用配CUDA、不用下ultralytics源码、不用解决依赖冲突。所有麻烦事镜像已经替你干完了。镜像里已经包含Python 3.9 PyTorch 1.13GPU加速已启用Ultralytics 8.3.9 完整代码库Jupyter Lab 和 SSH 两种访问方式文档里有截图这里不重复1.1 进入项目目录确认环境就绪打开终端或Jupyter里的Terminal执行cd ultralytics-8.3.9/然后检查是否能正常导入ultralyticspython -c from ultralytics import YOLO; print( YOLO11环境就绪)如果看到 YOLO11环境就绪说明镜像运行正常可以继续下一步。注意不要手动pip install ultralytics镜像里已预装重装反而可能破坏环境。2. 数据标注用Labelme画出物体轮廓实例分割不是框出物体而是精准描出它的边缘。这一步决定模型上限但操作其实很简单。2.1 安装并启动Labelme镜像内已预装直接在终端输入labelmeLabelme窗口会自动弹出如果没反应请检查是否在图形界面环境下运行。2.2 标注实操三步完成一张图点击【Open Dir】→ 选择你存放原始图片的文件夹比如datasets/seg_point_offer_20240930/images/选中一张图→ 左侧工具栏点【Create Polygon】多边形沿着物体边缘逐点点击→ 围成闭合区域 → 右键【Finish Object】→ 在弹窗里输入类别名如person、car→ 点【OK】小技巧按住Ctrl可拖动画布滚轮缩放双击自动闭合误点了可按Delete删除最后一点。2.3 保存标注生成JSON文件标完一张图点击【Save】。Labelme会自动生成一个同名.json文件存放在和图片同一目录下。比如你标了001.jpg就会生成001.json。这个文件里存着图片尺寸、所有多边形顶点坐标、每个区域的类别名。关键提醒类别名必须拼写完全一致大小写、空格、符号都不能错后续映射全靠它。3. 格式转换把Labelme的JSON变成YOLO11能读的TXTYOLO11不认JSON它只认一种特定格式的.txt文件每行代表一个物体开头是类别ID后面跟着归一化的顶点坐标。我们用一段极简、可直接运行的Python脚本完成转换。3.1 创建转换脚本convert_json_to_yolo.py在镜像的任意位置比如ultralytics-8.3.9/目录下新建文件convert_json_to_yolo.py粘贴以下代码import json import os import glob # 请务必修改这三处 label_to_class_id { person: 0, car: 1, bicycle: 2, # 把这里改成你实际标注的类别名一行一个冒号后是数字ID从0开始 } json_dir ./datasets/seg_point_offer_20240930/json_labels # 改成你存JSON的文件夹路径 img_dir ./datasets/seg_point_offer_20240930/images # 改成你存图片的文件夹路径 output_dir ./datasets/seg_point_offer_20240930/labels # 输出TXT的文件夹会自动创建 # # 自动获取图片尺寸读取第一张图 first_img glob.glob(os.path.join(img_dir, *.*))[0] from PIL import Image w, h Image.open(first_img).size print(f 检测到图片尺寸{w}x{h}) # 创建输出目录 os.makedirs(output_dir, exist_okTrue) # 批量转换 json_files glob.glob(os.path.join(json_dir, *.json)) print(f 找到 {len(json_files)} 个JSON文件开始转换...) for json_path in json_files: with open(json_path, r, encodingutf-8) as f: data json.load(f) # 构造输出TXT路径与JSON同名 base_name os.path.splitext(os.path.basename(json_path))[0] txt_path os.path.join(output_dir, f{base_name}.txt) with open(txt_path, w) as f_out: for shape in data.get(shapes, []): label shape[label] points shape[points] class_id label_to_class_id.get(label) if class_id is None: print(f 警告JSON {base_name} 中存在未定义类别 {label}已跳过) continue # 归一化坐标x/w, y/h normalized [f{x/w:.6f} {y/h:.6f} for x, y in points] line f{class_id} { .join(normalized)}\n f_out.write(line) print(f 转换完成TXT文件已保存至{output_dir})3.2 运行转换脚本在终端执行python convert_json_to_yolo.py你会看到类似输出检测到图片尺寸640x480 找到 300 个JSON文件开始转换... 转换完成TXT文件已保存至./datasets/seg_point_offer_20240930/labels此时labels/文件夹下会出现 300 个.txt文件每个都和图片一一对应。打开一个看看内容类似0 0.123456 0.234567 0.156789 0.267890 0.189012 0.290123 ... 1 0.456789 0.567890 0.489012 0.590123 ...这就是YOLO11要的格式。为什么用归一化坐标因为YOLO11训练时会把图片缩放到固定尺寸如640×640归一化后无论原图多大坐标都能正确映射。4. 组织数据集按YOLO11要求摆好文件夹YOLO11对数据目录结构有严格约定。镜像里已经帮你建好了骨架你只需填内容。4.1 标准目录结构必须这样datasets/ └── seg_point_offer_20240930/ ← 你的数据集根目录名字可自定义 ├── images/ ← 存放所有原始图片.jpg/.png │ ├── 001.jpg │ ├── 002.jpg │ └── ... ├── labels/ ← 存放上一步生成的所有.txt标签 │ ├── 001.txt │ ├── 002.txt │ └── ... └── trainval_split.txt ← 可选用于划分训练/验证集见4.24.2 划分训练集和验证集简单两行命令YOLO11默认用train/和val/子文件夹区分数据。我们用最傻瓜的方式生成# 进入数据集根目录 cd ./datasets/seg_point_offer_20240930/ # 创建train和val子文件夹 mkdir -p train/images val/images train/labels val/labels # 随机取90%图片进train10%进valLinux/macOS shuf -n $(( $(ls images/*.jpg | wc -l) * 9 / 10 )) (ls images/*.jpg) | xargs -I{} cp {} train/images/ shuf -n $(( $(ls images/*.jpg | wc -l) * 1 / 10 )) (ls images/*.jpg) | xargs -I{} cp {} val/images/ # 同步复制对应labels文件名一致即可 for img in train/images/*.jpg; do base$(basename $img .jpg) cp labels/${base}.txt train/labels/ done for img in val/images/*.jpg; do base$(basename $img .jpg) cp labels/${base}.txt val/labels/ done echo train/val 划分完成Windows用户用Python脚本或手动拖拽确保train/images/和train/labels/里文件名一一对应001.jpg↔001.txt。5. 配置文件告诉YOLO11“你的数据长啥样”YOLO11通过一个.yaml文件认识你的数据集。我们新建一个名字叫point-offer-seg.yaml。5.1 创建YAML文件在ultralytics-8.3.9/目录下新建文件point-offer-seg.yaml内容如下# 数据集根目录 必须是相对路径从ultralytics-8.3.9/开始算 path: ./datasets/seg_point_offer_20240930 # 训练和验证图片路径相对于path train: train/images val: val/images # 类别数量和名称顺序必须和label_to_class_id完全一致 nc: 3 names: [person, car, bicycle]5.2 关键点解析path指向你刚组织好的数据集根目录。不能写绝对路径必须以./开头。train/val是path下的子路径YOLO11会自动拼接成./datasets/.../train/images。nc类别总数必须等于label_to_class_id字典的长度。names类别名列表索引必须和字典ID完全对应names[0]就是person对应ID 0。检查清单point-offer-seg.yaml的names、convert_json_to_yolo.py的label_to_class_id、你Labelme里实际标注的类别名——三者必须一字不差、顺序一致。6. 训练脚本一行代码启动训练镜像里已经提供了train.py示例我们把它精简成最易懂的版本。6.1 编写train.py在ultralytics-8.3.9/目录下新建train.py内容如下from ultralytics import YOLO # 加载模型配置 预训练权重镜像自带无需下载 model YOLO(ultralytics/cfg/models/11/yolo11m-seg.yaml).load(weights/yolo11m-seg.pt) # 开始训练参数已精简只留最关键的5个 results model.train( datapoint-offer-seg.yaml, # 指向你的yaml文件 epochs30, # 训练30轮足够入门 imgsz640, # 输入图像尺寸保持和标注时一致 batch8, # 一次处理8张图显存够就调大 nametrain2, # 保存结果的文件夹名避免覆盖 device0, # 使用第0块GPU镜像已识别 )6.2 运行训练在终端执行python train.py你会看到实时训练日志Transferred 711/711 items from pretrained weights Ultralytics 8.3.9 Python-3.9.16 torch-1.13.1 CUDA:0 (NVIDIA A30, 24062MiB) Epoch GPU_mem box_loss seg_loss cls_loss dfl_loss Instances Size 1/30 5.26G 1.621 3.875 4.195 1.21 8 640: 100%|██████████| 38/38 [00:0600:00, 6.12it/s] Class Images Instances Box(P R mAP50 mAP50-95) Mask(P R mAP50 mAP50-95): 100%|██████████| 19/19 [00:0200:00, 7.81it/s] all 270 396 0.999 0.886 0.934 0.587 0.974 0.864 0.896 0.454第1轮结束你就看到了mAP指标第30轮结束你会看到类似Results saved to runs/segment/train2的提示。7. 查看训练结果不只是数字还有图训练完成后所有成果都存放在runs/segment/train2/目录下weights/best.pt效果最好的模型权重推理就用它weights/last.pt最后一轮的权重results.csv每轮的loss和指标可用Excel打开results.png自动生成的训练曲线图loss下降、mAP上升val_batch*.jpg验证集上的预测效果图带分割掩膜打开results.png你会看到三条线train/box_loss边框损失越低越好train/seg_loss分割损失越低越好metrics/mAP50-95(B)核心指标越高越好0.5~0.95 IoU阈值平均如果mAP50-95从0.4升到0.8恭喜你模型真的学会了小技巧用Jupyter打开runs/segment/train2/results.csv用Pandas画图更直观。8. 模型推理用你训的模型分割新图片训练完不推理就像做菜不尝味。我们用5行代码让模型干活。8.1 编写infer.py在ultralytics-8.3.9/目录下新建infer.pyfrom ultralytics import YOLO # 加载你训好的模型 model YOLO(runs/segment/train2/weights/best.pt) # 对单张图推理替换为你自己的图片路径 results model.predict( source./datasets/seg_point_offer_20240930/images/001.jpg, conf0.5, # 只显示置信度0.5的结果 saveTrue, # 保存结果图到 runs/predict/ showFalse, # 不弹窗服务器环境友好 retina_masksTrue, # 用高分辨率掩膜边缘更精细 ) print( 推理完成结果图已保存至 runs/predict/)8.2 运行并查看效果python infer.py几秒后打开runs/predict/文件夹找到001.jpg的结果图。你会看到彩色分割掩膜每个物体一种颜色白色边框和类别标签清晰的物体轮廓不是粗糙方块是像素级贴合这才是实例分割该有的样子。进阶把source改成文件夹路径如./datasets/.../val/images就能批量处理整批图。9. 常见问题速查新手90%卡点都在这问题现象最可能原因一句话解决ModuleNotFoundError: No module named ultralytics没进对目录先cd ultralytics-8.3.9/再python train.pyFileNotFoundError: point-offer-seg.yamlYAML路径写错检查train.py里data后面的路径必须和文件名完全一致KeyError: personLabelme标注名 vs YAML names不一致打开001.json看label字段和point-offer-seg.yaml的names对照训练loss不下降mAP一直是0数据集没划分好检查train/images/和train/labels/里文件名是否100%匹配推理图没有分割掩膜只有框模型加载错了确保YOLO(xxx.pt)加载的是best.pt且该权重是用-seg.yaml训的CUDA out of memorybatch设太大把batch8改成batch4或batch2总结恭喜你已经完整走通了YOLO11自定义数据集训练的全流程。回顾一下你亲手完成了用Labelme画出物体真实轮廓把JSON一键转成YOLO11专用TXT格式摆好标准数据目录划分train/val写对YAML配置让模型认识你的数据运行5行Python代码启动GPU训练看懂训练曲线确认模型在进步用自己训的模型分割出第一张带彩色掩膜的图这不是终点而是起点。接下来你可以换自己的数据集工业零件、医疗影像、农业作物调高epochs训更久或改lr0学习率微调试试yolo11n-seg.yaml轻量版或yolo11x-seg.yaml高精度版把infer.py改成Web服务用Flask提供APIYOLO11的强大不在于它有多复杂而在于它把前沿技术封装成了可触摸、可修改、可落地的工具。你已经拿到了钥匙。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。