先交代一个可能让准备照着文章抄的人意外的事实:到今天为止,Ultralytics 官方仓库里并没有一个叫 YOLO26 的正式 release。社区里口口相传的 YOLO26,要么是开发者在讨论下一个版本时的代号,要么是某些个人或团队在 fork 分支里继续迭代的版本号。我写这篇东西,目的不是去考证版本号,而是想把从源码复现、自定义数据集训练评估到图片/视频推理这条完整链路彻底拆透——这套链路在 YOLO 系列工程里高度统一,无论后续版本叫 26 还是 27,你在这篇文章里学到的东西都能直接迁移过去。
1. 动手之前,先理清这条工程链路的真实边界
1.1 关于版本号,说点实在话
目标检测这个领域每年都有新版本冒出来,YOLO 系列的迭代尤其快。从 YOLOv5 到 YOLOv8、YOLO11、YOLO12,每个版本发布的时候,最先被大家关注的往往不是网络结构本身,而是“训练命令变了没有”“权重文件能不能直接下”“我原来的代码还能不能跑”。这其实揭示了一个现实:对绝大多数工程型选手来说,YOLO 的价值不在于某个版本号的先进程度,而在于它的代码框架收敛了数据集处理、训练、验证、推理的完整流程,让你能腾出精力去搞自己的数据、调自己的业务。
所以我会在开篇先把话说清楚:这篇文章说的 YOLO26,我把它当作“新版 YOLO 工程框架”的代名词来用。文中的命令和代码都以 Ultralytics 这套工程体系为主线,官方仓库目前能稳定获取的预训练权重是 v8 和 v11 系列,后续哪怕真的发布了 26 版本,训练入口、数据格式、推理接口也不会有颠覆性变化,到时候把模型文件名换掉就行。
1.2 源码复现到底“复现”的是什么
很多新手一听“源码复现”就头皮发麻,以为是让你从零手写网络结构、自己把 C2f、SPPF 这些模块一行行敲出来。其实在工程语境下,“从源码复现”指的是另一件事:把官方仓库代码拉到本地,把依赖环境配好,把预训练权重跑到起来,然后在此基础上复现出文档里说的训练效果。这个过程你可以理解为“把别人的工程原样在自家机器上跑通一遍”。
这一点非常重要。我见过太多人一上来就想着改这改那,网络结构还没跑明白就给自己加注意力模块、换损失函数,结果环境都没配好,报错信息堆了一屏。正确顺序永远是:先原封不动跑通官方 demo,再换数据集训练,最后才谈改进。你连官方代码在这个环境里的表现基线都没建立起来,后面改了什么导致效果变好还是变坏,你根本说不清楚。
1.3 适合谁、需要什么基础
这篇东西适合两类人。一类是刚入门目标检测、想用 YOLO 跑通一个完整项目的学生或转行者,你可以把它当成一条龙的操作手册;另一类是有一定开发经验、但被环境配置和数据处理折磨过的人,你可以跳过前面基础内容,直接看数据集制作和训练参数调优的部分。
硬件门槛其实没有想象中高。有 NVIDIA 显卡最好,显存 6GB 以上就能比较舒服地训练小模型;没有 GPU 也能跑,只是速度慢一些。编程语言层面会 Python 基础语法就够了,网络结构不懂不影响你跑通流程,但如果后面想做改进,还是建议补一下卷积、特征金字塔这些基本概念。我的建议是:不用等学完理论再动手,边跑边学,遇到什么问题查什么,这个效率是最高的。
2. 环境配置:把最容易翻车的 Conda/CUDA 一次说透
环境配置是整个流程里最枯燥、却也最劝退人的环节。这个阶段出的问题大多不是代码问题,而是系统中的 Python、CUDA、PyTorch 三者版本互相不匹配。我先给你一套我目前用下来最省心的配置路线。
2.1 第一步:确认显卡驱动到底支持到什么规格
在装任何深度学习框架之前,先打开终端敲一句nvidia-smi。这个命令会显示你的显卡型号、驱动版本以及驱动支持的 CUDA 版本上限。很多人在这里就犯了错:去网上看到一个需要 CUDA 12.1 的 PyTorch 版本,也不管自己驱动支不支持就开始装,结果要么装完用不了,要么得重新换驱动。
需要明确一个概念:nvidia-smi显示的是驱动支持的最高 CUDA 版本,不代表你本地已经装了对应版本的 CUDA Toolkit。PyTorch 安装时会自带对应的 CUDA 运行库,不需要你额外去折腾整套 CUDA Toolkit安装包。所以你要做的只是确认:PyTorch 需要的 CUDA 版本不超过你驱动的上限即可。比如驱动支持 CUDA 12.4,那你装 PyTorch 的 12.1 或 12.4 版本都没问题。
| 显卡型号 | 建议显存 | 适合的训练规模 |
|---|---|---|
| GTX 1660 / 2060 | 6GB | yolo11n / yolo11s,小数据集 |
| RTX 3060 / 4060 | 8-12GB | yolo11m,中等数据集 |
| RTX 4070 及以上 | 12GB+ | yolo11l / yolo11x,大数据集 |
2.2 第二步:创建虚拟环境并安装 PyTorch
强烈建议用 conda 或 venv 创建独立环境,不要直接装在系统 Python 里。深度学习项目的依赖版本经常相互冲突,独立环境可以让你在不同项目之间自由切换。创建环境的命令很简单:
conda create -n yolo26 python=3.10 -y conda activate yolo26Python 版本选 3.10 比较稳妥,太高或太低都可能碰到个别依赖包不支持的情况。接下来安装 PyTorch。安装命令去 PyTorch 官网的 get-started 页面用选择器选好环境配置就能拿到,选 CPU 还是 CUDA 版本取决于你第一步里nvidia-smi的结果。CUDA 版本为 12.1 的话,安装命令类似这样:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121装完后别急着下一步,先验证 PyTorch 是否真的能用 GPU:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果第二行输出True,说明 GPU 版本装好了。这里如果输出False,最常见的原因是装了 CPU 版本,或者 conda 自动装了不匹配的版本,回上一步重新选安装源就行。
2.3 第三步:拉取源码并安装 Ultralytics 工程
环境就绪后,把官方仓库代码拉到本地:
git clone https://github.com/ultralytics/ultralytics.git cd ultralytics pip install -e .用-e参数安装的好处是源码目录和 Python 环境做了链接,之后你修改仓库里的任何代码都会立即生效,不需要重新安装。这对后续想做自定义改进特别重要。如果只是快速试用,直接pip install ultralytics也可以,但那样你就看不到源码了,对“源码复现”这个目标来说不太够。
装完后在项目根目录跑一句yolo predict model=yolo11n.pt source=https://ultralytics.com/images/bus.jpg,如果能正常下载权重并输出检测结果图,那恭喜你,环境这一关正式过了。顺手看一下工程目录结构,ultralytics/下是核心代码,cfg/下是各种配置文件,examples/下有一些参考脚本,不用全部看懂,先混个脸熟。
2.4 没有 NVIDIA GPU 的兜底方案
如果你的电脑是纯 CPU 环境,也别直接放弃。Ultralytics 工程支持 CPU 训练和推理,只是速度会慢不少。训练一个几百张图片的小数据集,CPU 可能要跑几小时,GPU 十几分钟就完事。作为学习流程、验证代码是否跑通,CPU 完全够用。安装时选择 CPU 版本的 PyTorch 即可:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu还有一个方案是使用云端的免费 GPU 算力,比如 Google Colab 的免费 T4 实例。Colab 上几乎不需要配置环境,新建 notebook 后直接pip install ultralytics就能开始训练。如果你只是先跑通流程,Colab 是很香的选项。
这一节最后再提醒一件事:国内网络环境下git clone有时会很慢,如果遇到超时,可以手动去 GitHub 页面下载 zip 压缩包,效果一样。PyTorch 的官方下载源如果速度不佳,可以使用国内镜像站,这里不展开讲,搜索引擎上都能找到方法。
3. 自定义数据集:从采集图片到 YOLO 标签格式
环境跑通之后,真正的核心工作就开始了。目标检测项目的成败,七成以上取决于数据:数据量、数据质量、标注准确性。模型结构再先进,喂进去的数据乱七八糟,出来的结果一定乱七八糟。这一节我会把数据集制作的完整细节全部讲清楚。
3.1 数据采集与划分:别急着标完再分
做自定义数据集,第一步不是标数据,而是先想清楚你要检测什么。比如你要做的是“生产线上的螺丝缺陷检测”,那你要收集的就是有缺陷和没缺陷的螺丝图片;如果做“鸟类目标检测”,就要收集各种环境下、各种姿态的鸟类图片。
数据量方面,我的经验是:每个类别至少收集 500 张图片作为起点,理想状态是 1000 张以上。但注意“数量”不等于“有效数量”,如果 500 张都是同一个角度、同一个光照条件下拍的,那模型的泛化能力会非常差。数据多样性比绝对数量更重要。同一类目标,要尽量涵盖不同拍摄角度、不同尺度、不同光照、不同遮挡情况。
拿到图片后,在标注之前先完成数据集划分。划分比例在 8:1:1 或 9:1 之间都可以,即训练集 80%-90%,验证集 10%,测试集 10%。网上有些工具可以一键划分,但我习惯用脚本按文件名随机分配,然后把图片文件复制到对应的 train/val/test 目录下。划分之后再标注,可以避免标注完成后才发现文件组织混乱。
3.2 标注工具:LabelImg 与 X-AnyLabeling 的选择
标注工具的选择直接影响你的工作效率。我的建议是:新手先用 LabelImg,简单直接,安装后新建框标注就行;需要标注多边形、关键点等复杂格式时,再换 X-AnyLabeling 或 Label Studio。
用 LabelImg 时,有两点设置要注意:一是标注格式要选择 YOLO 格式,这样保存出来的就是与图片同名的.txt文件,不需要后期转换;二是类别标签列表classes.txt要先编辑好,确保所有标注员用的类别顺序一致。比如检测猫和狗两类,classes.txt里写cat、dog,那么cat的类别索引是 0,dog是 1。这个顺序一旦定下来就别改,改了这个顺序,之前所有标注文件全部作废。
标注流程不难,但要保证质量需要耐心。我的习惯是:对每张图先整体过一遍,把全部目标框完,再切换一遍检查遗漏。两遍检查能有效避免漏标——漏标在训练时会被当作背景处理,这是很危险的负样本。标注完一个批次后,随机抽样 10%-20% 的图片,用可视化脚本把标注框画在原图上,人工快速浏览一遍,检查框的位置是否贴合目标。
3.3 YOLO 标签格式的底层原理
YOLO 标签格式用一句话概括就是:每张图片对应一个.txt文件,文件里每一行标注一个目标,格式为class_id x_center y_center width height,并且四个坐标值全部经过归一化。
先看一个具体例子。有一张 1000×800 的图片,图中有一只猫,其目标框左上角坐标为 (200, 100),右下角坐标为 (400, 300)。那么宽高分别是 200 和 200。计算步骤如下:
x_center = (200 + 400) / 2 / 1000 = 0.3 y_center = (100 + 300) / 2 / 800 = 0.25 width = (400 - 200) / 1000 = 0.2 height = (300 - 100) / 800 = 0.25对应的标签文件内容就是0 0.3 0.25 0.2 0.25,前面的 0 代表类别索引。归一化的好处是标签文件不依赖具体图像分辨率——你用 1000×800 的图训练,也可以把标签复制到任何其他分辨率的图上使用,因为坐标已经是相对值。
实操中经常遇到的问题是这个:标注工具可能导出的是 Pascal VOC 的 XML 格式或 COCO 的 JSON 格式,这种情况不需要你手算坐标,Ultralytics 工程有转换工具,也推荐直接使用支持 YOLO 格式导出的标注工具。另一个高频问题来自标注边界:某些目标的边界框挨着图像边缘,归一化后可能会出现大于 1 或小于 0 的目标值,训练时会报错。遇到这类情况,稍微微调一下标注框位置即可。
3.4 目录组织与 data.yaml 配置文件
Ultralytics 工程对数据集目录有约定。组织好的目录结构大致如下:
datasets/ └── my_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml注意 labels 里每个子目录的文件名要和 images 里对应图片的文件名一致,只是扩展名从.jpg等图片格式变成.txt。如果有无标签的图片,也要逐一确认,通常把完全没有任何目标的图片放到一个单独的 cleanup 目录里,避免干扰。
data.yaml是训练时告诉模型“数据在哪、有几类、类名是什么”的配置文件,内容示例:
path: /path/to/datasets/my_dataset train: images/train val: images/val test: images/test nc: 2 names: ['cat', 'dog']path是数据集根目录的绝对路径或相对于配置文件位置的路径,train、val、test填的是相对path的子目录路径。nc是类别总数,names是类别名称列表,顺序必须和标注文件里的class_id一一对应。这个文件是所有后续命令的基础入口,写错一个路径都会让训练直接失败,值得反复确认三遍。
4. 训练与评估:真正能跑通且看得懂指标
数据准备好,就到了整个项目最核心的环节:训练模型。这个阶段表面上只是一条命令的事,但训出来的模型好坏差异巨大,差别就在于参数怎么选、过程怎么监控、指标怎么解读。
4.1 训练前必须做的一次完整检查
很多人花了好几天标注数据,急着想看到训练结果,结果一跑就报错。其实训练前的检查只需要几分钟,能省下大量调试时间。我会按顺序做三件事:
第一件事,检查数据集目录结构。在终端里进入数据集根目录,确认images/train和labels/train下的文件数量一致,并且每个标签文件都有对应的图片文件。我写过一个简单的 Python 脚本,遍历 labels 目录,找出没有对应图片的 txt 文件,基本能快速发现是不是有标注文件放错目录了。
第二件事,检查标签内容。用脚本读取几个标签文件,打印内容,观察坐标值是否都在 0 到 1 之间、类别索引是否小于nc值。如果出现class_id为 3 的文件而nc只写了 2,训练时模型一定会报错提示 label class out of range。
第三件事,可视化抽查。用 OpenCV 或 matplotlib 把标签框画在原始图片上,保存成一张新图,肉眼检查标注框是否与目标对齐。这一步能发现标注工具有没有出现偏移、图片有没有旋转过、标签和图片是否对应错位等问题。千万不要跳过这一步,训练完才发现标注错位,返工成本会翻好几倍。
4.2 训练命令与关键参数解读
进入训练阶段,命令长这样:
yolo detect train data=datasets/my_dataset/data.yaml model=yolo11n.pt epochs=100 imgsz=640 batch=16 device=0逐项理解这几个参数的意义。model=yolo11n.pt表示加载官方预训练权重,使用迁移学习的方式训练你的自定义数据集,这比从随机初始化训练收敛快得多。epochs=100是训练轮数,新手可以先设 50 轮跑通流程;imgsz=640是训练时输入的图像尺寸,目标是 640×640,如果目标在原图中很小,可以适当提高到 832;batch=16是每批次图片数量,显存不够就调小,8、4、2 都行;device=0指定使用第一张 GPU。
接下来是一组值得花精力理解的参数:
| 参数名 | 默认值 | 作用 | 我的使用建议 |
|---|---|---|---|
| lr0 | 0.01 | 初始学习率 | 数据集小可降到 0.001 |
| optimizer | auto | 优化器 | 新手保持默认 |
| patience | 100 | 早停等待轮数 | 设为 20-30 可及时止损 |
| cache | False | 是否预加载图片到内存 | 显存/内存大就开 True,训练速度明显提升 |
| workers | 8 | 数据加载线程数 | Windows 下建议调低到 2-4 |
| cos_lr | False | 是否使用余弦学习率 | 数据集较小时建议 True |
| exist_ok | False | 是否覆盖同名输出目录 | 用于多次实验时自动覆盖 |
训练轮数方面,“越多越好”是个误区。我见过太多人把epochs设成 1000,跑到后面过拟合严重,指标反而下降。更合理的做法是先跑 50 轮看曲线趋势,如果 loss 还在持续下降,就续跑;如果验证集指标已经趋于平稳或下降,就该停了。
4.3 训练过程的监控
训练启动后,终端会滚动显示每个轮的 loss、精度、召回、mAP 等指标。很多新手盯着这些数字焦虑,不知道什么算正常。记住一个原则:只看趋势,不纠结单轮数值。训练初期 loss 下降快,这是正常的;后期 loss 波动变缓,也是正常的。真正需要警惕的是:训练集 loss 持续下降但验证集 loss 不掉甚至上升,这时候大概率是过拟合了。
Ultralytics 支持在训练时自动记录日志,训练结束后会在runs/detect/train/目录下生成一系列图表,包括results.png(训练曲线总览)、confusion_matrix.png(混淆矩阵)、val_batch0_pred.jpg(验证集预测结果可视化)等。其中results.png是最值得研究的图,它包含了 box_loss、cls_loss、dfl_loss 三条损失曲线和 precision、recall、mAP50、mAP50-95 四条指标曲线。分析时我看三件事:损失是否收敛、mAP 曲线是否还在上升、训练集和验证集指标差距有多大。
如果显存吃紧,还可以把batch每步减半,直到不报 OOM 为止。OOM 是新手最喜欢遇到的错误之一,不丢人,解决办法就是减 batch 或降低图片尺寸。注意 batch 改变后 GPU 的利用率会下降,训练时间会变长,但这是优先保证能跑起来的选择。
4.4 评估指标怎么读才算真的懂
训练完,模型目录下会生成weights/best.pt和weights/last.pt,前者是验证集上综合表现最好的权重,推荐使用。评估指标中,mAP@0.5指的是 IoU 阈值为 0.5 时所有类别的平均精度均值,mAP@0.5:0.95则涵盖了从 0.5 到 0.95 多个 IoU 阈值,前者对定位精度要求宽松,后者更严格,二者同时看才能判断模型到底是“检测到了目标但框不准”,还是“框得又准又稳”。
举例来说,一个模型mAP@0.5=0.95但mAP@0.5:0.95=0.4,说明检测能力不错,但边界框的定位精度还有提升空间,可以考虑提高imgsz或调整标注质量。反过来,如果两个指标都低,问题可能出在数据本身——检查一下类别是不是严重不平衡,比如一个类有几千样本,另一个只有几十个。类别不平衡会导致模型只学会预测多数类,这时可以考虑对少样本类别做更多数据增强、复制采样,或者干脆补充数据。
我还建议跑完训练后,用best.pt跑一遍测试集,而不是只看验证集指标。测试集是训练时完全没见过的数据,模型在测试集上的表现更能反映真实场景下的泛化能力。验证集在训练过程中被用来做早停判断,严格来说已经“间接见过”了模型,所以测试集的结果才最有说服力。
5. 图片/视频/摄像头推理与性能调优
模型训练完成,工作只完成了一半。怎么把模型用起来,做图片推理、视频推理甚至实时摄像头检测,这是从“训练出模型”到“落地应用”的临门一脚。这也是很多教程忽略的部分。
5.1 图片推理:从单张到批量
图片推理是最简单的场景,命令行就能完成:
yolo detect predict model=runs/detect/train/weights/best.pt source=./test_images device=0source参数支持单张图片路径、图片文件夹路径、甚至远程 URL 地址。推理完成后,结果图默认保存到runs/detect/predict/目录,原图、预测框、类别名、置信度分数都会画在图上。如果你不想用命令行,想在自己的 Python 项目里集成推理能力,用到的是这样一套代码:
from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") results = model.predict("test_images/cat001.jpg", conf=0.25, save=True) for result in results: boxes = result.boxes if boxes is not None: for box in boxes: cls_id = int(box.cls[0]) score = float(box.conf[0]) xyxy = box.xyxy[0].tolist() print(f"类别: {model.names[cls_id]}, 置信度: {score:.2f}, 框: {xyxy}")conf参数控制置信度阈值,默认 0.25,意思是置信度低于 0.25 的预测框会被过滤。阈值设高了,漏检变多但误检变少;设低了则相反。应用场景不同,这个值要实际去调,不能一直用默认。
5.2 视频推理与结果保存
视频推理的命令和图片推理几乎一样,只需要把source改成视频文件路径:
yolo detect predict model=best.pt source=test_video.mp4 save=Truesave=True会生成一个带检测结果的视频文件。视频推理时要注意一个问题:视频文件较大的情况下,处理速度会比较慢,因为模型要对每一帧做一次前向传播,也就是每一帧都要做一次“看图找目标”的计算。如果你的视频是 1920×1080,每一帧都被缩放到 640×640 再输入模型,大量小目标细节可能会丢失。这时可以考虑把imgsz提高到 1280,代价是推理速度会慢不少,具体取舍取决于你对精度和速度的需求。
Python 接口处理视频时还涉及视频编解码、逐帧读取、结果叠加画框、写回视频文件等操作。Ultralytics 直接封了一层,命令行一键生成,但如果要在自己的处理流程里逐帧拿结果,可以用model.predict(video_path, stream=True)生成迭代器,逐帧处理推理结果,这样能拿到每一帧的检测信息做进一步业务处理,比如统计画面中出现目标的数量等。
5.3 摄像头实时推理
把source换成摄像头设备编号,就能做实时检测:
yolo detect predict model=best.pt source=0 show=Truesource=0表示调用系统默认摄像头,show=True会在窗口里实时显示检测画面。这一节的操作感最强,也是最能直观感受到模型能力的场景。我自己第一次把模型跑在电脑摄像头上,对着自己挥手,模型框出“person”,那种成就感确实很奖励。
不过实时推理对性能要求很高,通常需要帧率到达 25-30 FPS 才能有流畅体验。如果你的 GPU 算力一般,画面卡顿明显,可以从三方面优化:换更小的模型文件,比如从 m 切换到 s 甚至 n 版本;降低推理分辨率imgsz;开启半精度推理half=True。画面流畅度很多时候比检测精度更能影响使用体验,实时场景下优先保帧率是正常的工程取舍。
5.4 推理性能进阶:导出 ONNX 和 TensorRT
当模型要在实际项目中部署时,直接用 PyTorch 的.pt权重文件不是最理想的方案。PyTorch 推理自带一定开销,如果部署在嵌入式平台、服务端或移动端,通常要把模型导出成更高效的格式。Ultralytics 一条命令就能导出:
yolo export model=best.pt format=onnx yolo export model=best.pt format=engine device=0第一条导出 ONNX 格式,适合跨平台部署、通用性强;第二条导出 TensorRT engine 格式,是 NVIDIA GPU 上推理速度最快的方案,但只在相同 GPU 型号上才能直接使用。实测下来,在相同 GPU 上 TensorRT 相比 PyTorch 推理通常能带来 1.5 到 3 倍的提速,这在高帧率视频流场景下非常关键。
半精度推理是另一个见效极快的优化手段:
from ultralytics import YOLO model = YOLO("best.pt") results = model.predict(source="test_video.mp4", half=True, device=0)half=True让模型以 FP16 精度进行推理,兼容的 GPU 上速度几乎翻倍,精度损失很小。注意一点老显卡可能不支持半精度,跑之前可以先确认一下显卡算力。
6. 踩坑记录与最后的建议
6.1 我遇到且处理成本最高的几个坑
入坑 YOLO 系列好几年,环境、数据、训练、部署阶段的坑基本都踩了一遍。挑几个教训最深的记录下来,希望能帮你避开。
第一个坑是中文路径。项目目录、数据集路径、图片文件名里尽量不要出现中文和空格,Windows 下尤其严重,有时会出现读不到文件、保存乱码、训练中断这些奇怪的问题。解决方案是老老实实全用英文命名,前期养成习惯,后面少掉头发。
第二个坑是标签和图片数量不匹配。有时从网上下载数据集,发现 labels 目录里有几个 txt 没有对应图片,或者某张图没有标签文件。训练时会报“No labels found in xxx”的错。排查方式是按 4.1 节说的写脚本遍历一遍,谁也不要在检查上省时间。
第三个坑是数据泄漏。有人做数据集划分时,同一只目标既出现在训练集又出现在验证集,或者存在相似图片跨集重复,导致训练指标特别漂亮,但一到真实场景就暴露真实水平。做划分时尽量保证同一个目标只在一个集合里出现,测试集更要严格隔离。
第四个坑是显存 OOM(Out of Memory)。训练时显存爆炸,最简单的解法是减batch,其次降低imgsz。但要注意batch改变会影响 BN(Batch Normalization)层的统计特性,如果降到了 4 以下,可以考虑把模型切换为更小的预训练版本,或者关闭cache参数,减少显存占用。
第五个坑是训练集样本量过小。如果每个类别只有几十张图片,训练出来必然会过拟合,学到的特征只对训练集有效。我处理这类问题的方法是用现有数据先做两倍以上的数据增强——随机裁剪、反转、亮度调整、平移旋转。这些增强手段 Ultralytics 默认就开启了,但增强后的数据并不能完全替代新数据的采集,只能作为过渡手段。
6.2 我的实战建议:先用小任务完整跑通
最后一节想分享一个我自己的方法论:任何一次新环境、新模型、新数据的尝试,我都会用一个极小的数据集先完整跑通整个流程。这个小数据集可以是官方自带的 coco8——它只有 4 张训练图、4 张验证图,十几秒就能跑完一轮,适合验证环境配置和命令是否正确。跑通之后,再换成自己的数据。
这件事听着简单,却能避免最痛苦的一种局面:环境、代码、数据同时有问题,报错信息层层叠叠,你根本不知道从哪查起。先把数据换成 coco8,如果还报错,那就是环境问题;环境跑通了,再换自己的数据,如果出错,那就是数据问题。用这种方式把变量逐个隔离,问题定位效率极高。
训练完成后,我会把best.pt在开发机上跑一遍图片、视频、摄像头三个场景,确认都能正常运行,再做导出部署。这一步虽然不是必修课,但能让你清楚了解这个模型在不同输入方式下的表现,后面写接口、接业务时心里有底。
如果你是想把 YOLO26 这套链路用于真实业务,我的最后一条建议是:不要把全部精力花在调整网络结构上,先把自己的数据做到位。标注质量、类别平衡、场景覆盖,这些数据层面的功课对最终效果的影响,通常比你在网络结构上折腾几天还要大。先用最优的数据把这个版本的模型压榨到极限,再考虑换更大的模型或者做架构改进,这个顺序是效率最高的。