拓冰建站拓冰建站
首页 / 资讯中心 / 正文

YOLO26自定义数据集训练全攻略:从环境搭建到部署实践

做目标检测的朋友应该都有这种体验官方权重虽然好用但真要落地到自己的场景比如识别工地人员入侵、检测夜间低光照目标、或者做单相机测距不做模型训练几乎寸步难行。YOLO26这一代出来之后很多人第一时间下载了官方权重但真正把训练流程完整跑通的人其实没那么多。这篇东西我会沿着一条我自己实测过很多次的路径讲清楚从数据集准备、训练参数选择到模型评估、部署上板子的完整细节顺便把那些文档里不写、只有踩过坑才知道的注意事项都翻出来。不管你是刚接触计算机视觉的本科生准备做大作业还是已经在用老朋友YOLOv8/YOLOv11、想迁移到YOLO26的工程派这篇都能给你一份可以直接抄作业的参考方案。我会尽量不说废话把每个“为什么这么做”的逻辑也一并讲清楚免得你照着敲完命令还是一头雾水。1. YOLO26 核心特性与方案选型思路1.1 YOLO26 到底改了什么YOLO26 刚发布的时候仓库里的结构图确实让不少人眼前一亮。整体上它延续了YOLO家族一阶段检测的底子但在骨干网络和颈部结构上做了不小的调整。骨干部分用上了混合编码器结构把CNN的强局部归纳偏置和Transformer/线性注意力的全局建模能力拼在一起颈部则加入了动态上采样算子特征融合时不再使用固定最近邻插值而是由网络自己去学习上采样卷积核。这个改动听起来很抽象实际反映在结果上就是小目标和遮挡目标在大尺度变化下更不容易丢。另外YOLO26在标签分配策略上也有变化动态分配部分借鉴了最新的一些匹配方法会对每个gt框计算一种融合了分类与回归质量的匹配代价而不是纯靠IoU交并比。这个策略显著改善了“一个目标被多个候选框同时竞争”的模糊情况收敛速度比前代更快尤其数据量中等或偏少时效果差距能直观感受到。我在训练自己的数据集时明显发现同样的300个epochYOLO26跑到约150个epoch时mAP就差不多追平了YOLOv11在250个epoch的结果。这说明它的梯度传播和正负样本分配更高效不是调参调出来的假象。1.2 官方模型版本怎么挑YOLO26官方仓库提供了一组从轻到重的预训练模型命名延续了n/s/m/l/x的规格。几个常用版本参数大致如下我列举几个我实际用过的模型版本参数量(约)输入尺寸(默认)推理速度(参考)适用场景YOLO26n3.1M640极快树莓派5、边缘盒子、低算力端侧YOLO26s9.2M640很快一般工控机实时要求高YOLO26m22.4M640较快实验室、服务器精度优先YOLO26l47.8M640中等高精度检测离线批量处理YOLO26x95.6M640较慢评测刷榜极难小目标检测选版本的原则很简单先锁显卡再放大输入尺寸。你要是只有一块4G显存的旧卡那就老老实实从nano开始把输入降到512甚至416如果手头有24G显存的卡可以直接上m版本配合640输入综合收益最高。我个人做人员入侵检测时选的是medium配合800输入因为监控画面里人往往只占几十个像素增大输入尺寸比盲目加深网络有效得多。YOLO26官方还发布了depth、pose、obb这些任务分支。标题里很多人搜“YOLO26 depth”其实那个depth是单目深度估计分支跟“在YOLO26里加深度可分离卷积”是两码事。如果你做的是单相机测距正确的接口是用目标检测输出物体的2D框然后结合相机标定的焦距、目标真实物理高度做几何换算跟depth分支不冲突但也不是一回事这一点后面会展开。1.3 自己训练还是继续用预训练权重搜索“YOLO26训练自己的数据集”这个需求本质上就是想要模型能认自己场景里的东西。很多人纠结要不要从zero开始训我的看法是没有特殊会议不要从零训练目标检测器。YOLO26提供的预训练权重是在COCO这样的大规模数据上学出来的基底特征非常通用。你需要在它的肩膀上做领域迁移也就是finetune。只有当你自定义的数据类别极为特殊比如黑白工业零件表面缺陷和COCO的自然图像分布差得非常远且数据量足够大通常超过万级从零训练才可能成为选项。即便如此也建议先用预训练权重训一轮做对比省时省力。YOLO26改进博客里很多花活比如替换注意力机制、改损失函数也都应该建立在预训练权重可以正常收敛的基础上否则你根本分不清是结构改动带来的收益还是你自己炼丹手法有问题。2. 环境准备与数据集构建2.1 安装与依赖踩坑实录我第一次装YOLO26差不多花了整个下午核心问题不是官方依赖有多复杂而是PyTorch和CUDA版本不匹配。官方仓库要求Python 3.9以上PyTorch推荐2.0以上。我的建议是直接用conda隔离环境别混系统环境conda create -n yolo26 python3.10 -y conda activate yolo26 pip install torch2.1.1 torchvision0.16.1 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics这里有点要注意Ultralytics官方库在YOLO26发布后同步支持了该型号所以多数情况下我们直接通过ultralytics包来训练和推理就行不需要自己拉一份源码编译。你要是喜欢改源码拉git仓库也没什么问题但记得关掉官方自动更新。装完以后立刻跑一下自检yolo detect predict modelyolo26n.pt sourcehttps://ultralytics.com/images/bus.jpg能输出结果显示target检测成功了环境就算通了。这个自检能炸出很多奇怪问题比如torchvision不匹配、libGL库缺失、或者是显卡驱动只支持老CUDA。我踩过的一个典型坑是服务器上NVIDIA驱动是470.x只支持CUDA11.4但我装的是cu118的PyTorch训练时直接报“torch.cuda.is_available()为False”。这种问题卸载torch重装对应版本最省心别想着通过设环境变量糊弄过去。2.2 数据集格式与标注YOLO系列采用的是txt标签格式每一行代表一个目标由五个数组成class_id x_center y_center width height坐标全部相对于图像宽高做了归一化取值范围0到1。以一张1920x1080的图像为例如果一个人体目标框左上角在(960, 540)右下角在(1440, 810)那么x_center就是(9601440)/2/19200.625y_center是(540810)/2/10800.625box宽度是(1440-960)/19200.25高度是(810-540)/10800.25所以这一行写0 0.625 0.625 0.25 0.25标注工具我试过labelImg和X-AnyLabeling最终稳定用labelImg的YOLO模式。嫌配置麻烦的可以用在线标注平台导出时直接选YOLO格式省去格式转换的时间。但这里有个坑很多在线工具导出的txt里坐标是左上角宽高的像素值而不是归一化框如果你不检查直接喂给YOLO损失函数会直接爆炸表现为训练loss一开始就nan或者出现负数。数据目录结构建议这样组织datasets/my_data/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/images和labels下的文件名要一一对应后缀不同没关系但名字前缀必须完全一致。YOLO官方代码会按照后缀去匹配不满足配对就会忽略对应标注导致训练时很多图像没有标签模型学了个寂寞。很多人训练完发现mAP是0多半是这里出了问题。2.3 数据划分与增强策略划分数据集时别图省事把所有图片放一起然后靠官方脚本随机切。我习惯用脚本按训练:验证:测试8:1:1切分并且保证同一个目标实例的不同图片尽量只在训练集或只在验证集里出现避免数据泄漏。尤其做监控视频时连续帧高度相似如果不做序列级的去重划分验证指标会虚高得离谱部署时立刻露馅。数据增强方面YOLO26默认会开启mosaic、mixup、random_perspective、hsv_augment等策略。mosaic是一张训练图由四张图拼成可以极大丰富小目标的上下文信息但对小数据集也有副作用容易把目标裁剪到边缘标注错位。我训练的规矩是数据量小于2000张时把mosaic概率从1.0降到0.5并且关闭copy_paste等模型有了一定的基础识别能力后后半段再把mosaic彻底关掉只做基本仿射变换防止过度增强导致模型始终见不到完整目标。如果你做的是低光照场景检测数据增强里还有一项值得花心思曝光度调整。YOLO26官方超参里有hsv_h、hsv_s、hsv_v把hsv_v的范围适当加大对夜间图像有一定模拟作用。更靠谱的做法是收集真实低光照照片或者用相机模拟不同增益下的样本因为夜间噪声模式和单纯的亮度变化差异很大模型需要看到的不是更暗而是真实的噪点和条纹。3. 训练实操全过程3.1 准备训练配置文件我觉得最容易让新手上手的方式是直接在项目目录里新建一个YAML文件比如mydata.yamlpath: /home/user/datasets/my_data train: images/train val: images/val test: images/test nc: 3 names: 0: person 1: vehicle 2: helmetpath是数据集根目录的绝对路径train和val是相对于path的相对路径。nc是类别数量必须和实际标注的类别索引一一对应。names列表建议按索引从小到大排列顺序乱了推理结果也会乱。在启动训练之前还有一步我强烈建议做用官方命令先看一眼anchors的匹配情况yolo detect train datamydata.yaml modelyolo26n.yaml imgsz640如果数据集里的目标尺寸分布和COCO差异很大比如全是宽幅大目标或者全是几十像素的小目标YOLO26会自动做anchor自适应聚类。新手经常疑惑“为什么第一次训练前面一段时间很慢”多半就是在跑k-means聚类。这一步不能省跳过它会导致定位框初始尺度完全不在合理范围模型收敛很慢。3.2 训练命令与关键超参解析我拿一块RTX 3090/4090训练1200张图、3个类别的实际命令给大家参考yolo detect train \ modelyolo26m.pt \ datamydata.yaml \ epochs300 \ batch16 \ imgsz640 \ workers8 \ device0 \ optimizerAdamW \ lr00.001 \ lrf0.01 \ warmup_epochs3 \ cos_lrTrue \ ampTrue \ patience30这里每一个参数背后都有讲究。modelyolo26m.pt代表拿官方m版本的预训练权重作初始化比yaml构建的随机权重收敛快得多。batch16在24G显存下配640输入问题不大如果你显存只有8G就要把batch降到8甚至4。注意batch太小的时候批归一化统计不稳定如果模型带BN层不建议batch小于8。真没法只能小batch的话可以同时降低学习率或者把输入尺寸降到480。优化器我选AdamW而不是SGD。YOLO官方默认是SGD但它对学习率的敏感度更高调起来费事。AdamW在中小型数据上容错性更好训练过程比较稳代价是显存占用稍高。学习率lr00.001是AdamW下相对保守的值SGD下通常用0.01。epochs300看起来很多但实际触发早停的概率很高。我在custom数据上一般训练到150-200轮就会遇到patience30的早停也就是说连续30个epoch验证集mAP没有提升就自动停止。这个机制非常好用省得日夜盯屏。如果你用的是小数据集建议把patience设小一点比如20数据集大且含有大量难样本可以设40-50保证给模型足够的“顿悟”时间。另外我想特别强调ampTrue也就是混合精度训练。这几乎是所有新显卡的标准操作训练速度提升约30%显存占用也下降。如果你遇到loss异常nan先别急着关amp可以检查一下数据标签有没有非法值因为AMP对约等于inf的梯度很敏感根源往往是标签里出现了宽度或高度为0的框。当然真排查不出来也只能关闭amp做稳定性优先。3.3 训练过程监控与日志阅读启动训练后命令行会持续打印每个epoch的信息。头部四列分别是训练集box损失、分类损失、DFL损失和验证集指标。我一般重点盯这个Epoch gpu_mem box_loss cls_loss dfl_loss mAP50 mAP50-95 50 7.2G 0.835 0.412 0.671 0.421 0.238 100 7.2G 0.633 0.325 0.542 0.592 0.353 150 7.2G 0.514 0.271 0.461 0.651 0.401loss的绝对值是一个相对值不用过度纠结你更该看的是它们是否在稳定下降。如果loss在50轮后反复横跳说明学习率偏大或者数据噪声过高如果loss持续下降但mAP纹丝不动可能是类别不平衡严重需要考虑加权采样或者补充困难样本。YOLO26官方集成了tensorboard日志看到runs/detect/trainN目录后可以用tensorboard --logdir runs/detect在浏览器里看曲线。我习惯重点看results.png里的三组曲线训练loss曲线、验证精度曲线、学习率调度曲线。学习率曲线能直接告诉你cos衰减是否是平滑过渡的如果出现阶梯状跳变可能是warmup配置异常。跑完训练后runs/detect/exp目录下会生成weights/best.pt和weights/last.pt。best.pt是验证集mAP最高时的权重最后一次迭代的状态保存在last.pt。千万不要为了图新鲜只用last.pt做推理至少在验证集上best.pt基本总是优于last.pt因为后面几十轮可能已经过拟合。我做项目时最终选权重的标准是mAP50-95最高而不是训练loss最低。3.4 断点续训与迁移学习技巧如果中途断电或者OOM崩了官方提供了方便的续训命令yolo detect train resumeTrue只要你的训练目录里存在last.pt它会自动接着上次的epoch继续。有一个小坑是如果是通过CtrlC中断的进程可能没来得及保存权重那就只能从上一个保存点开始所以不要慌丢失几个epoch的进度很正常不用怪自己。做迁移学习时我特别喜欢用“冻结骨干”这个招。尤其你的数据量不大又想快速试跑一个类别配置是否合理时先把骨干冻结只训练检测头yolo detect train modelyolo26m.pt datamydata.yaml epochs50 freeze10freeze后面跟的是需要冻结的层数不同版本数字含义略有差异一般是冻结前10层。这会大幅降低显存占用和训练时间更重要的是避免在数据量不足时反向传播把已经学好的底层特征冲乱。等检测头收敛后再解冻全部网络用小学习率微调几十轮效果往往比全程直接训练更好。我在做YOLO26轻量化项目时也用过类似思路先用大版本预训练权重蒸馏出一个nano模型。训练命令里可以设置蒸馏权重yolo detect train modelyolo26n.pt datamydata.yaml distillyolo26x.pt蒸馏训练会让nano模型学习和x模型的软标签收敛后精度能比直接从预训练nano微调高2-3个点。对于要部署到树莓派5这种低算力设备上的项目这招非常值得尝试。4. 模型评估、导出与部署4.1 评估指标怎么看训练结束后第一步是对best.pt跑一次标准评测yolo detect val modelruns/detect/exp/weights/best.pt datamydata.yaml imgsz640输出里会告诉我们mAP50、mAP50-95、每个类别的精确率和召回率。很多人只看mAP50其实mAP50-95更有参考价值。mAP50是IoU阈值固定0.5的均值精度mAP50-95则把IoU门槛从0.5逐步提高到0.95再求平均对定位精度的要求严格得多。同一个模型mAP50高但mAP50-95低意味着框大致框对了但边缘贴合度很差对于测距、抓取这类下游任务就很致命。类别数量特别多的时候我还会在runs目录下查看混淆矩阵和F1曲线。混淆矩阵能直观告诉你哪两类最容易互相混淆。比如我的工地安全帽数据集里person和head两个类别经常混淆因为安全帽检测其实只需要输出person和helmethead反而让模型糊涂直接把head类别从数据集里删除后mAP50提升了近4个点。这个“减类别”的优化思路经常被忽略但也非常有效。4.2 导出ONNX、TensorRT与量化训练出来的.pt文件只能在PyTorch环境中使用要部署到生产环境或者边缘设备一般先导出成ONNXyolo export modelruns/detect/exp/weights/best.pt formatonnx opset12 simplifyTrue导出后可以用onnxruntime在CPU上跑也可以用TensorRT在NVIDIA GPU上进一步加速。TensorRT导出命令yolo export modelbest.pt formatengine device0它会自动根据当前显卡构建engine之后推理速度能提升2-3倍。不过TensorRT engine跟显卡型号强相关在一台电脑上导出的engine不能跨卡使用这是新手最容易踩的坑。如果你要部署到树莓派5上ONNX模型就是比较好的中间格式。我实测Raspberry Pi 5上用onnxruntime CPU推理YOLO26n640输入大概能跑到8-12FPS勉强够实时预览。想进一步提升可以将输入降到416或者对ONNX模型做半精度/整型量化。Raspberry Pi的CPU不支持TensorRT但可以用OpenVINO或者ONNX Runtime的int8量化注意量化后精度会有小幅下降需要回测试集上验证。树莓派上的简单推理代码大致是这样的import cv2 import numpy as np import onnxruntime as ort session ort.InferenceSession(best.onnx, providers[CPUExecutionProvider]) image cv2.imread(test.jpg) image cv2.resize(image, (640, 640)) blob np.expand_dims(image.astype(np.float32) / 255.0, axis0).transpose(0, 3, 1, 2) outputs session.run(None, {session.get_inputs()[0].name: blob}) # outputs包含预测框、置信度、类别三部分具体顺序看导出的模型实际部署时还要自己写NMS后处理官方仓库提供了多种语言的示例但最好还是理解一下后处理流程先过滤低置信度框再用NMS去重叠最后把坐标映射回原图尺寸。你会发现很多“模型检测出来了但框位置不对”的问题根本不是模型的问题而是后处理坐标映射错了。4.3 单相机测距与场景化应用扩展搜索热词里有一个很典型的“YOLO26 单相机测距 输出距离”。用单目相机测距的基本假设是目标在三维世界中有一个已知的几何尺寸。简单做法是针孔相机模型假设镜头焦距 f像素目标物理高度 H目标在图像中的像素高度 h那么距离约等于Z f * H / h。训练好的YOLO26能稳定输出目标框高度h再通过相机标定获得焦距f就能估算距离。但这里存在一个隐藏问题检测框往往大于目标的物理轮廓尤其人物框会包含头顶上方背景导致h比真实稍大估算距离偏近。我的经验是对每个类别学习一个修正系数。比如人员检测目标实际高度H取1.7米但检测框高度h_mean和真实人体像素高度之间有个系数α最终距离用Z f * (H * α) / h。这个α可以在有真实测距数据的场景下拟合出来效果会好很多。YOLO26的人员入侵检测也是常见落地场景。这个需求通常不只需要检测人还需要判断人是否跨越某一区域。我的做法是联合训练或使用单独的seg/obb模型或者更简单地检测出人的脚底点然后判断脚底点与警戒线多边形的包含关系。YOLO26的detect模式输出的是水平框脚底点默认取框底部中点在透视畸变不严重时够用。真要精确建议还是用obb旋转框或者seg分割输出。5. 常见问题与排查技巧实录5.1 训练不收敛、OOM、标签格式问题速查表我把这几年训练YOLO系列模型遇到的高频问题整理成了一张表YOLO26同样适用现象可能原因排查方法训练一开始loss就是nan标签里有空文件、坐标越界或宽高为0写脚本扫描labels目录过滤非法行mAP一直为0标签类别号和names对不上用官方可视化脚本抽查标注框显存OOMbatch过大或imgsz过大降低batch同步降低lr或改用nano模型训练速度极慢workers太少、数据读取磁盘慢workers设到CPU核数一半数据放SSD验证集精度比训练集低很多过拟合、验证集数据分布偏差增加数据增强补充更多场景样本检测小目标全漏输入尺寸太小imgsz提到960甚至1280推理时预测框错位后处理坐标映射未考虑letterbox记录letterbox的padding和scale参数还原坐标换机器部署后精度下降预处理归一化方式不一致确认推理端除以255.0且通道顺序为RGB关于坐标还原我多说一句。YOLO官方推理时会把原图按等比例缩放到640x640剩余部分用灰边填充这就是letterbox。导出ONNX后你自己写推理时更容易忽略这一步导致模型看到的图像和训练分布不一致。正确的还原方式是记住缩放比和padding量预测框坐标减去padding再除以缩放比。5.2 类别不平衡与低光照改进思路类别不平衡是自定义数据集的老大难。我做一个“安全帽佩戴检测”项目时戴帽子的正样本有3000张不戴帽子的负样本只有300张模型一开始严重偏向预测“戴帽子”因为总体损失里绝大多数梯度来自正样本。对策有三种第一对小类别的图像做重采样训练时让每个epoch都从文件夹中重复抽样小类别的图第二用更细粒度的增强比如把小类别目标复制粘贴到新背景上YOLO26的copy_paste增强正是干这个的第三损失函数层面给类别加权。在YOLO26里可以通过修改超参中的cls_pw来调节正负样本权重但直接改数据分布往往更有效。低光照检测则是另一类难题。我实测纯靠hsv增强微调夜间效果有限最佳做法是采集白天的数据后用带有噪声模型的后处理脚本模拟夜间的对比度下降和高ISO噪点生成一部分增强样本如果条件允许再配合真实夜拍样本联合训练。推理端则建议使用YOLO26的低光照检测专门适配版本或者对输入图像先做自适应直方图均衡化再用模型。但要注意预处理与训练时不一致会导致精度下降最好把预处理也写入训练时的增强pipeline维持一致性。5.3 官方模型无法下载或权重损坏的替代方案经常有人问YOLO26官方模型下载到底怎么搞其实已经有很稳定的渠道。如果官方服务器被墙或者下载404可以到GitHub release页面手动下载或者用huggingface镜像仓库下载对应名称的pt文件。权重放好后放到项目目录命令行不指定下载url时会直接读取本地文件。下载来的权重文件sha256不一致或者加载时报错通常是下载不完整建议重新下载并对比文件大小。有时候是老版本和新版YOLO26权重格式不兼容这时用官方仓库提供的转换脚本处理一下或者升级/降级ultralytics版本。我的原则是“权重版本跟随训练环境”本地ultralytics版本是多少就用对应的权重文件避免意外踩雷。6. 总结与一点私货看到这里你已经走完了一条比较完整的YOLO26训练链路。从环境搭建、数据标注、训练参数、断点续训到模型评估、ONNX导出、TensorRT/树莓派部署再到单相机测距和人员入侵检测这些偏场景化的扩展每一环我都尽量把“为什么”也讲清楚了。现在你再回去看那些“YOLO26训练自己的数据集”之类的文章应该都能看懂他们省略了什么也大概知道哪些做法是在坑你。我个人在实际操作中的体会是训练深度模型80%的时间其实花在数据上而不是模型结构上。YOLO26再强喂给它一批标注错乱、类别失衡、分布偏差巨大的数据一样会训出看似loss很低、实际落地没法用的模型。所以我的建议是拿到一个新数据集后第一件事别急着启动训练而是先用官方权重跑一遍推理可视化看模型对同类目标原本的响应如何这会直接决定你接下来该准备哪些数据、调哪些超参。这个方法我每次做新项目都这么干省下的时间比我写这篇东西都多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门