YOLO11自定义数据集训练教程_基于ultralytics-8.3.253_2026版
Windows 下复现 YOLO11 目标检测训练数据准备、环境安装、训练验证与模型导出文章摘要本文以 Ultralytics 8.3.253 源码版本为基础重新整理 YOLO11 自定义目标检测数据集训练流程。文章从版本固定、数据采集、标注规范、目录整理、Windows 环境安装、数据集 YAML 配置、CLI 与 Python 两种训练方式、预测验证、结果查看、模型导出和常见问题排查几个角度展开。重点不是介绍 YOLO11 的理论细节而是让读者能够在自己的电脑上把数据集跑通并为后续 YOLO11 改进、部署和项目实战文章打好统一代码基础。CSDN 标签YOLO11Ultralytics目标检测PyTorchWindows深度学习自定义数据集模型训练前言很多 YOLO 教程写得比较早里面使用的命令、源码路径和模型名称已经和现在的 Ultralytics 项目不完全一致。如果直接拿旧文章去套 YOLO11经常会遇到两个问题一个是读者找不到对应文件另一个是后面写模型改进文章时不同版本代码结构对不上。所以这篇文章重新基于ultralytics-8.3.253版本来写。本文不追求把所有参数都讲完而是先把目标检测训练最核心的一条线跑通准备图片 - 标注目标 - 整理数据集 - 配置环境 - 训练 YOLO11 - 验证模型 - 导出权重后续如果要做 YOLO11 添加注意力机制、替换 Neck、导出 ONNX、TensorRT 部署等内容都可以继续沿用这个版本减少因为版本变化带来的复现问题。一、先把版本固定住为什么本文使用 Ultralytics 8.3.253本文使用的是本地源码压缩包ultralytics-8.3.253.zip解压后可以在ultralytics/__init__.py中看到版本号__version__8.3.253这个版本已经包含 YOLO11 的模型配置目标检测模型配置文件在ultralytics/cfg/models/11/yolo11.yaml固定版本有三个好处后面修改源码时文件位置不会变来变去。写系列文章时读者能使用同一套代码复现。出现报错时更容易判断是代码问题、环境问题还是数据集问题。需要注意的是直接执行pip install ultralytics可能会安装到更新版本。如果本文是为了后续改进 YOLO11 源码建议使用源码安装方式而不是只安装 PyPI 最新包。二、先规划数据来源别急着训练模型训练目标检测模型之前最容易被忽略的是数据质量。模型能不能学好很多时候不是由训练命令决定的而是由图片是否贴近真实应用场景决定的。常见数据来源可以分成几类数据来源适合情况注意点自己拍摄工业检测、农业检测、安防监控等真实项目场景最贴近实际但采集成本高开源数据集类别常见、任务通用类别定义和实际业务可能不完全一致网络图片快速补充样本要注意版权、重复图片和低质量图片视频抽帧监控、车载、流水线检测相邻帧重复度高需要抽样筛选合成图片特殊目标难采集时只能辅助不能完全替代真实数据如果是第一次训练可以先准备一个小数据集试跑例如每个类别几十到几百张图片。确认流程没问题后再扩充数据量。数据采集时建议提前想清楚这几个问题要检测的类别有几个每个类别是否都有足够样本图片中目标大小是否接近真实使用场景是否包含白天、夜晚、遮挡、不同角度等情况是否有大量重复图片这些问题比盲目增加训练轮数更重要。三、标注数据集统一类别编号和框选规则YOLO11 目标检测使用的标签格式仍然是 YOLO 检测格式。每张图片对应一个同名.txt文件标签文件中每一行表示一个目标类别编号 目标中心点x 目标中心点y 目标宽度 目标高度这里的坐标不是像素值而是归一化后的比例值范围一般在0~1之间。例如0 0.5123 0.4382 0.1634 0.2851 1 0.3128 0.6610 0.0924 0.1375含义是第一列类别编号从0开始第二列目标框中心点的 x 坐标第三列目标框中心点的 y 坐标第四列目标框宽度第五列目标框高度标注工具可以选择自己顺手的例如LabelImgCVATRoboflowMake SenseLabel Studio标注时重点检查这几件事同一个类别不要一会儿叫helmet一会儿叫hardhat。类别编号必须从 0 开始不能跳号。图片和标签文件必须同名。框不要明显偏离目标也不要把目标框少一半。没有目标的图片可以保留但要确认训练逻辑是否需要空标签文件。举个例子图片和标签应该这样对应000001.jpg - 000001.txt 000002.jpg - 000002.txt 000003.jpg - 000003.txt如果文件名对不上后面训练时很容易出现标签读取异常或者明明有图片却没有标签的情况。四、整理数据集目录推荐使用 images 和 labels 对称结构为了让后续配置更清楚建议把数据集整理成下面这种结构SafetyHelmet/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── helmet.yaml这里以安全帽检测数据集举例实际项目中可以换成自己的数据集名称。各目录作用如下目录作用images/train训练图片labels/train训练标签images/val验证图片labels/val验证标签images/test测试图片可选labels/test测试标签可选如果你的图片和标签一开始都混在一个文件夹里可以先写一个简单脚本划分。下面这个脚本会读取原始图片目录然后按照比例复制到新目录中。frompathlibimportPathimportrandomimportshutildefmake_yolo_dataset(src_images,src_labels,dst_root,train0.75,val0.15):src_imagesPath(src_images)src_labelsPath(src_labels)dst_rootPath(dst_root)image_files[]forextin(*.jpg,*.jpeg,*.png,*.bmp):image_files.extend(src_images.glob(ext))random.seed(2026)random.shuffle(image_files)train_numint(len(image_files)*train)val_numint(len(image_files)*val)split_map{train:image_files[:train_num],val:image_files[train_num:train_numval_num],test:image_files[train_numval_num:],}forsplit_name,filesinsplit_map.items():image_outdst_root/images/split_name label_outdst_root/labels/split_name image_out.mkdir(parentsTrue,exist_okTrue)label_out.mkdir(parentsTrue,exist_okTrue)forimage_pathinfiles:label_pathsrc_labels/f{image_path.stem}.txtshutil.copy2(image_path,image_out/image_path.name)iflabel_path.exists():shutil.copy2(label_path,label_out/label_path.name)else:print(f未找到标签文件{label_path})make_yolo_dataset(src_imagesrD:/dataset_raw/helmet/images,src_labelsrD:/dataset_raw/helmet/labels,dst_rootrD:/datasets/SafetyHelmet,)这段脚本的重点不是复杂而是保证图片和标签同步移动。实际使用时只需要修改最后三行路径。五、安装训练环境使用源码方式更适合后续改进本文默认在 Windows 环境下操作。先创建一个新的 conda 环境conda create-nyolo11_83253python3.10conda activate yolo11_83253然后进入解压后的源码目录cdD:\AIProjects\ultralytics-8.3.253执行源码安装pipinstall-e.-e的意思是 editable也就是可编辑安装。这样做的好处是你后面修改源码文件后不需要每次重新打包安装。安装完成后检查一下当前环境中的版本python-cimport ultralytics; print(ultralytics.__version__)如果输出8.3.253说明当前环境已经指向本文使用的代码版本。再检查 PyTorch 是否能识别 GPUimporttorchprint(PyTorch:,torch.__version__)print(CUDA available:,torch.cuda.is_available())print(CUDA version:,torch.version.cuda)如果torch.cuda.is_available()输出False训练仍然可以用 CPU 跑通流程但速度会慢很多。正式训练建议配置好 CUDA 版本的 PyTorch。六、编写数据集配置 YAML训练前最该仔细检查的文件Ultralytics 训练时需要通过 YAML 文件告诉程序训练图片在哪、验证图片在哪、类别有哪些。以安全帽数据集为例可以新建D:/datasets/SafetyHelmet/helmet.yaml内容如下path:D:/datasets/SafetyHelmettrain:images/trainval:images/valtest:images/testnames:0:helmet1:no_helmet这个文件很短但很关键。字段解释path数据集根目录train训练集图片路径val验证集图片路径test测试集图片路径没有测试集可以先不写names类别编号和类别名称Windows 下建议路径使用/例如path:D:/datasets/SafetyHelmet不要写成容易转义出错的形式path:D:\datasets\SafetyHelmet另外如果标签文件中出现类别编号2但是names只写到1训练时就会报类别越界相关错误。七、第一次训练 YOLO11先跑通不要一开始就堆参数YOLO11 检测模型可以直接使用预训练权重开始训练。第一次建议使用yolo11n.pt因为它比较轻适合快速验证数据集和环境是否正常。命令如下yolo detect trainmodelyolo11n.ptdataD:/datasets/SafetyHelmet/helmet.yamlepochs100imgsz640batch16device0这条命令可以拆开理解参数说明detect目标检测任务train训练模式modelyolo11n.pt使用 YOLO11n 预训练权重data...helmet.yaml数据集配置文件epochs100训练 100 轮imgsz640输入尺寸为 640batch16每次训练读取 16 张图片device0使用第 0 张 GPU如果没有 NVIDIA GPU可以先用 CPU 测试流程yolo detect trainmodelyolo11n.ptdataD:/datasets/SafetyHelmet/helmet.yamlepochs5imgsz640batch4devicecpuCPU 训练很慢但用来检查数据集格式是可以的。如果显存不够优先改这几个参数batch8imgsz512modelyolo11n.pt不要一上来就用yolo11x.pt。大模型更吃显存数据集没检查好之前没有必要。八、用 Python 脚本训练更适合后续做实验对比如果后续要写改进文章建议准备一个 Python 训练脚本方便切换模型和参数。新建train_helmet_yolo11.pyfromultralyticsimportYOLOdefmain():modelYOLO(yolo11n.pt)model.train(datarD:/datasets/SafetyHelmet/helmet.yaml,epochs100,imgsz640,batch16,device0,workers4,projectruns/helmet,nameyolo11n_baseline,)if__name____main__:main()运行python train_helmet_yolo11.py这里额外设置了projectruns/helmet把实验结果统一放到runs/helmet下面nameyolo11n_baseline给本次实验命名为 baseline后面做模型改进时可以继续使用类似命名yolo11n_baseline yolo11n_cbam yolo11n_bifpn yolo11n_slimneck这样不同实验结果会更清楚。九、训练结果保存在哪里重点看 best.pt 和 results.csv如果使用上面的 Python 脚本训练结果会保存在runs/helmet/yolo11n_baseline/常用文件如下runs/helmet/yolo11n_baseline/ ├── weights/ │ ├── best.pt │ └── last.pt ├── results.csv ├── results.png ├── confusion_matrix.png └── args.yaml文件说明文件作用best.pt验证集表现最好的权重后续预测一般用它last.pt最后一轮训练保存的权重results.csv每轮训练和验证指标results.png损失和指标曲线图confusion_matrix.png混淆矩阵args.yaml本次训练使用的参数如果要写实验结果建议优先根据results.csv和results.png来整理不要凭感觉写“效果很好”。十、预测图片和视频先用 best.pt 看实际效果训练完成后可以先找几张没有参与训练的图片做预测。命令行预测yolo detect predictmodelruns/helmet/yolo11n_baseline/weights/best.ptsourceD:/datasets/demo_imagessaveTrueconf0.25参数说明model训练得到的权重source图片、文件夹、视频或摄像头saveTrue保存预测结果conf0.25置信度阈值如果要预测视频yolo detect predictmodelruns/helmet/yolo11n_baseline/weights/best.ptsourceD:/videos/test.mp4saveTrue如果要调用摄像头yolo detect predictmodelruns/helmet/yolo11n_baseline/weights/best.ptsource0showTruePython 预测写法fromultralyticsimportYOLO modelYOLO(runs/helmet/yolo11n_baseline/weights/best.pt)model.predict(sourcerD:/datasets/demo_images,saveTrue,conf0.25,)预测结果通常会保存到runs/detect/predict或新的递增目录中。十一、验证模型mAP50 和 mAP50-95 要分清楚验证命令如下yolo detect valmodelruns/helmet/yolo11n_baseline/weights/best.ptdataD:/datasets/SafetyHelmet/helmet.yamldevice0Python 方式fromultralyticsimportYOLO modelYOLO(runs/helmet/yolo11n_baseline/weights/best.pt)metricsmodel.val(datarD:/datasets/SafetyHelmet/helmet.yaml,device0)print(mAP50-95:,metrics.box.map)print(mAP50:,metrics.box.map50)print(mAP75:,metrics.box.map75)这里一定要注意metrics.box.map50是 mAP50metrics.box.map是 mAP50-95很多文章会把这两个指标混着写这是不严谨的。一般情况下mAP50 会比 mAP50-95 高因为 mAP50 的 IoU 阈值更宽松。本文不展示未经实际训练得到的指标数值。完成自己的训练后可以结合results.csv、results.png和验证命令输出查看 mAP50、mAP50-95、Precision 与 Recall所有结果均应以本机实际运行记录为准。十二、导出模型为部署提前准备 ONNX 等格式训练得到的.pt权重适合在 PyTorch / Ultralytics 环境中使用。如果要部署到其他推理框架通常需要导出。导出 ONNXyoloexportmodelruns/helmet/yolo11n_baseline/weights/best.ptformatonnximgsz640Python 写法fromultralyticsimportYOLO modelYOLO(runs/helmet/yolo11n_baseline/weights/best.pt)model.export(formatonnx,imgsz640)常见格式可以这样理解导出格式适合场景ONNX通用部署ONNX Runtime、OpenCV DNN 常用TensorRTNVIDIA GPU 推理加速OpenVINOIntel CPU / 核显部署TorchScriptPyTorch 生态部署NCNN移动端和边缘设备部署如果只是训练和测试暂时不导出也可以。导出主要是为了后续写部署、界面调用、端侧推理等内容。十三、常见问题先从路径、标签和显存查起1.yolo命令无法识别现象yolo 不是内部或外部命令原因没有激活正确环境或者ultralytics没有安装成功。解决方法conda activate yolo11_83253cdD:\AIProjects\ultralytics-8.3.253 pipinstall-e.然后重新执行yolo version2. 训练时报数据集路径不存在原因helmet.yaml中的path、train、val路径拼接后找不到真实目录。排查方式先手动打开路径例如D:/datasets/SafetyHelmet/images/train D:/datasets/SafetyHelmet/images/val确认目录真实存在并且里面有图片。3. 标签类别编号越界现象标签中出现了某个类别编号但 YAML 中没有定义这个类别。例子names:0:helmet1:no_helmet但标签文件里出现2 0.5 0.5 0.2 0.2这时类别2就是非法编号。需要重新检查标注类别。4. 图片有标签但训练时提示标签缺失原因图片名和标签名没有完全对应。例如images/train/001.jpg labels/train/001.txt这是正确的。下面这种就容易出问题images/train/001.jpg labels/train/001.xmlYOLO 检测训练需要.txt格式标签。5. CUDA 显存不足解决思路batch8imgsz512modelyolo11n.pt如果还不够就继续降低 batch或者先使用 CPU 跑几轮检查流程。6. Windows 下 dataloader 多进程报错可以先把workers调小yolo detect trainmodelyolo11n.ptdataD:/datasets/SafetyHelmet/helmet.yamlworkers0如果workers0可以正常运行再逐步调到2或4。7. 预测结果保存目录找不到Ultralytics 会自动创建递增目录例如runs/detect/predict runs/detect/predict2 runs/detect/predict3如果不是第一次预测结果可能不在predict而是在后面的递增目录。十四、总结本文围绕 Ultralytics 8.3.253 版本把 YOLO11 自定义目标检测训练流程重新整理了一遍。整个流程的重点不是把命令堆在一起而是先固定代码版本再保证数据集格式、环境安装、训练命令和结果查看都能对应起来。实际做项目时建议先使用yolo11n.pt跑通小规模数据集确认图片、标签、YAML 和环境没有问题。流程稳定后再考虑换更大的模型、增加数据量、调整超参数或加入改进模块。后续如果继续写 YOLO11 改进文章可以把本篇作为基础环境篇。这样朋友们可以先跑通 baseline再去看注意力机制、Neck 替换、损失函数修改、模型导出部署等内容会更容易复现也更容易判断改进是否真的有效。