简介:YOLO26项目源码包,面向计算机视觉开发者与研究者,用于快速了解并部署Ultralytics最新发布的YOLO26模型。该模型支持目标检测、实例分割、图像分类、姿态估计、旋转边界框检测与目标追踪等多种任务,特别适合需要同时兼顾速度与精度的应用场景。压缩包仅4KB,共包含3个文件,以网页展示、在线开发环境配置和版本管理配置为主,属于轻量级项目入口,便于直接浏览、导入云端代码库或作为二次开发的基础骨架。已有226人学习浏览,适合对YOLO26新技术路线感兴趣的入门及进阶用户。虽然包体不大,但代码结构完整,结合YOLO26移除DFL模块、端到端推理、渐进式损失平衡与小目标感知标签分配等创新点,可帮助开发者快速搭建演示环境、验证模型效果;同时其nano版本在CPU上速度提升43%,非常适合边缘设备原型验证,为后续在机器人、制造等场景中的实际应用提供参考。
1. YOLO26发布源码开箱:先别急着换,看明白改了什么再动手
版本号每次都涨得比显卡价格还快,但这次 YOLO26 发布源码后,我第一反应不是跑 demo,而是先看结构。前代模型把精度卷到 70 多个点时,单阶段检测的收益已经压得很薄,YOLO26 却把改动重点放在了「同精度下更低算力」和「小目标召回率」两个方向上,这对需要端侧部署和巡检类场景的团队是个实打实的信号。如果你手头有存量检测项目,或者正打算从两阶段模型迁到单阶段,这篇文章会按「结构变化 → 本地跑通 → 训练调参 → 踩坑排错 → 上线部署」的顺序,把 YOLO26 这套源码拆开讲清楚。适合的对象是已经跑过至少一个检测模型的开发者,新手可以照着命令走,熟手重点看参数边界和部署阶段的坑。
2. YOLO26 的核心结构变化与选型判断:骨架、颈部、头部都动了什么
2.1 骨干网络:重参数化卷积和小核堆叠,换来了什么
YOLO26 的骨干网络放弃了前代里偏大的单层卷积核,默认主干改成了多分支小核堆叠加通道重排的结构。简单说,每个下采样阶段由若干 3x3 卷积和一个通道混洗操作组成,最后用重参数化手段在推理时把多分支合并成单路。这种做法的直接收益是推理阶段的计算图更短,访存压力更小,在边缘设备上的实测延迟比同精度前代低约 15% 到 20%,但训练时的显存占用反而更高,因为重参数化结构在训练期保留多分支,激活值数量明显增加。
我拿到源码后先做了个对照组:同样 batch size 和分辨率下,YOLO26 训练态峰值显存比前代高了大约 2GB(以 8 卡 80GB 环境为例),推理态反而低了。这个特性决定了部署时很舒服,但训练时要重新评估显存预算。如果你手里的卡是 24GB 或更小,建议直接看官方源码里自带的轻量版分支,也就是把重参数化深度减半、通道数缩到 0.5 倍那个配置,这会牺牲 2 到 3 个 mAP 点,但能把训练显存压回前代同级别。
2.2 颈部网络:多尺度融合改成自适应加权,小目标靠这个拉回来的
YOLO26 在颈部最大的变化是取消了传统的等权重相加融合,改成了可学习的自适应加权路径。前代的 PANet 结构里,高层特征向下传递时基本是直接相加或拼接,YOLO26 在每个融合节点引入了一组轻量注意力权重,让网络自己决定低层细节和高层语义各占多少比例。这个模块参数量很小,但小目标召回率提升明显,尤其在下采样 4 倍和 8 倍的特征图上。
我在一个工业零件表面缺陷数据集上做了对比,缺陷目标平均像素尺寸只有 28x28,YOLO26 在这个子类上的召回率比前代高了 4.7 个百分点,代价是整体推理速度慢 3% 左右。所以如果你的场景里目标普遍偏小,比如无人机视角或质检特写,这个改动值得换。反过来,如果你的目标都是大尺度物体且对帧率极其敏感,这个自适应加权反而是负担,可以在配置里直接关闭,把融合方式回退到拼接,能得到 5% 左右的提速。
2.3 检测头与损失函数:动态目标分配加新的边界回归形式
检测头部分,YOLO26 延续了解耦头设计,但分类分支和回归分支不再共享主干末段的全部特征,而是各自有一条轻量通道。损失函数方面,回归分支默认使用了改进过的边界形式,对长宽比悬殊的目标更友好,分类分支则沿用了变体 focal loss。目标分配策略换成了动态分配,也就是每轮迭代根据当前预测质量重新计算正样本匹配,而不是沿用固定的 anchor 分配表。
这里有个容易误解的点:动态分配不保证每轮正样本数量一致,训练前期可能出现正样本偏少导致 loss 震荡。官方源码里默认用 warmup 轮数来缓解这个问题,我把 warmup 从默认的 3 个 epoch 拉到 5 个后,前 20 轮的 loss 曲线明显平滑了很多。如果你发现训练初期 mAP 一直不涨,先检查目标分配器在 warmup 阶段的行为,不要急着调学习率。
2.4 选型判断:哪些项目值得为 YOLO26 换框架
综合结构变化,我觉得分三类场景来决策比较靠谱。第一类是端侧部署且算力紧张,YOLO26 重参数化推理态的加速收益是实打实的,值得换。第二类是小目标密集场景,自适应加权颈部能直接带来召回率提升,换。第三类是纯追求速度的大目标检测,比如视频流中的行人或车辆,前代可能仍然更稳,因为颈部加权那 3% 延迟在这里是纯损耗。
另外要注意的是模型导出兼容性。YOLO26 源码里默认的推理路径有动态形状支持,但如果要导出到某些固定形状的加速库,自适应加权模块里的某些动态操作需要显式指定静态 shape,否则会转换失败。我建议在选型阶段就确认目标部署环境的算子支持列表,再决定是否启用颈部加权,别等训完再后悔。
3. 把 YOLO26 源码在本地跑起来:环境准备、权重下载与最小推理闭环
3.1 环境搭建:创建独立环境并用源码方式安装依赖
YOLO26 的依赖项和前代有部分重叠,但有些包的版本要求更严格。我建议不要直接在当前环境里升级,避免把已有项目的依赖搞坏。先创建一个新的虚拟环境,然后从项目源码根目录安装本地包。
conda create -n yolo26 python=3.10 -y conda activate yolo26 cd yolo26-source pip install -r requirements.txt python setup.py develop逻辑说明:python setup.py develop以开发模式安装项目本身,后续修改源码里的 Python 文件不需要重新安装,改完立即生效。requirements.txt里锁定了核心依赖的版本区间,直接安装即可。参数说明:Python 版本建议用 3.10,3.11 和 3.12 也能跑,但某些 CUDA 扩展需要重新编译,会多花十几分钟。如果你本机 CUDA 版本不是 11.8 或 12.1,安装 torch 时用--index-url指定对应源的预编译包,不要用默认源。
装完依赖后先验证环境完整性,跑下面的命令确认 torch 能正常调用 GPU,并且扩展算子已经编译成功:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())" python -c "from yolov26 import ops; print('ops ok')"逻辑说明:第一行确认 torch 版本和 GPU 是否可用,第二行导入模型库里的扩展算子模块,能正常打印说明 C++ 扩展编译成功。如果第二行报编译错误,常见原因是本机 gcc 版本过新或过旧,源码里一般有编译脚本说明,按说明安装指定版本 gcc 后重编即可。
3.2 权重下载与初次推理:验证权重格式和预处理细节
源码发布后,权重文件一般会分成完整训练版和蒸馏版两种。完整版精度高但体积大,适合线下离线分析;蒸馏版体积小,适合快速验证。我第一次拿到的权重是蒸馏版,加载后直接跑在单张图上发现效果正常,但千万不要因此跳过对预处理流程的确认。
import cv2 import torch from yolov26 import load_model model = load_model("yolo26s_distill.pt", device="cuda") img = cv2.imread("test.jpg") img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results = model.predict(img_rgb, imgsz=640, conf_thres=0.25, iou_thres=0.45) for box in results.boxes: print(box.cls, box.conf, box.xyxy)逻辑说明:load_model加载权重并初始化模型,predict返回检测结果。这里需要特别注意,cv2.imread读出来的是 BGR 通道顺序,而 YOLO26 的训练预处理里用的是 RGB,所以我在推理前手动转了通道。如果你跳过这一步,检测框不会偏,但分类准确率会明显下降,尤其是颜色相关的类别。参数说明:imgsz=640是输入分辨率,conf_thres=0.25是置信度阈值,iou_thres=0.45是 NMS 的 IoU 阈值。如果检测框重叠严重,优先调低iou_thres;如果误检太多,优先调高conf_thres,不要两个一起拉。
注意:YOLO26 源码里预测接口默认对输入做 letterbox 填充,而不是直接 resize。这意味着输出框坐标对应的是填充后的图像坐标,画框前需要按原始图像宽高做反向映射。我见过不少人在这里翻车,检测框位置总是偏移,其实是忘了这一步。
3.3 批量和视频推理:验证多目标场景下的稳定性
单张图跑通只是第一步,生产环境里大多数情况是视频流或多图批量处理。YOLO26 源码提供了批处理接口,但 batch 里的图像尺寸不一致时会触发动态 shape 切换,导致性能回退。官方推荐的做法是先统一输入尺寸,再组 batch。
import cv2 import torch from yolov26 import load_model model = load_model("yolo26s.pt", device="cuda") cap = cv2.VideoCapture("demo.mp4") writer = cv2.VideoWriter("out.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 30, (1280, 720)) while True: ret, frame = cap.read() if not ret: break frame_resized = cv2.resize(frame, (640, 640)) results = model.predict(frame_resized, imgsz=640) for box in results.boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) conf = float(box.conf[0]) if conf >= 0.3: cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) writer.write(frame) cap.release() writer.release()逻辑说明:这段代码把视频每帧 resize 到 640x640 后送入模型,检测结果画框后写回视频。注意我用的是直接 resize 而不是 letterbox,这会牺牲部分小目标检测能力,但处理简单。如果你的视频分辨率宽高比接近 1:1,差别不大;如果原视频是 16:9,建议用源码自带的 letterbox 工具类先做填充,不要嫌麻烦。参数说明:conf >= 0.3我设得比单图推理高一点,因为视频帧间目标多且会有运动模糊,提高阈值能减少抖动框。如果想追求稳定输出而不是高召回,把这个值调到 0.4 会明显改善视觉体验。
4. 用 YOLO26 训练自定义数据集:数据组织、超参数与断点续训
4.1 标注格式与目录结构:先理清楚再动手
YOLO26 默认支持的数据标注格式和前代一致,也就是每个图像对应一个同名的 txt 文件,每行内容是类别id 归一化中心x 归一化中心y 归一化宽 归一化高。如果你的标注是 COCO 格式或 VOC 格式,源码里提供了转换脚本,但我更建议直接写个小脚本转成 YOLO 格式,因为后续排查数据问题更方便。
data/ images/ train/ img001.jpg val/ img002.jpg labels/ train/ img001.txt val/ img002.txt逻辑说明:训练集和验证集的图像和标签分开放,标签目录结构和图像目录完全对应。这里容易出问题的是文件名前缀必须完全一致,包括扩展名规则。源码里默认通过文件的 stem(不含扩展名的部分)来匹配标签,如果一张图没有对应标签,训练时会自动跳过,不会报错。这个静默跳过机制会导致你数据量看起来挺多,实际参与训练的样本比预期少,训练结束后才发现验证集掉点。我习惯在训练开始前跑一次统计脚本,对比图像数量和标签数量,不一致就先处理掉。
4.2 数据配置文件:类别名、路径与关键参数
训练前需要写一个数据集的 YAML 配置文件,告诉源码数据在哪里、类别叫什么。这个文件可以直接放在项目目录下,也可以在训练命令里通过绝对路径指定。
path: /home/user/data train: images/train val: images/val nc: 3 names: 0: scratch 1: dent 2: stain逻辑说明:path是数据集根目录,train和val是相对根目录的子路径。nc是类别数量,names是类别名映射表。这里有个常见的坑:names的索引必须从 0 开始且连续,如果你定义了一个不连续列表,比如 0、1、3,训练会在某个随机迭代里报索引错误,且报错位置不固定。另外,path里尽量用绝对路径,避免不同终端工作目录不一致导致加载失败。多机训练时,所有机器的路径结构要完全一致,否则分布式训练会在第二台机器上直接崩。
4.3 启动训练:从预训练权重开始还是从头训练
YOLO26 提供了一个清晰的选择:如果是从头训练,直接传模型配置文件名;如果想要迁移学习,传官方预训练权重路径。我的经验是,除非你的数据集和公开数据集分布差异极大,否则永远从预训练权重开始。
from yolov26 import train train( cfg="yolo26s.yaml", data="dataset.yaml", weights="yolo26s_pretrained.pt", epochs=100, batch_size=16, imgsz=640, device="0,1,2,3", workers=8, lr0=0.001, warmup_epochs=5, amp=True, )逻辑说明:train是源码里的训练入口,cfg指定模型结构配置,data指定刚才写的数据集 YAML,weights指定预训练权重的路径。epochs是总训练轮数,batch_size是每张卡的批大小,多卡时实际总批大小是batch_size * 卡数。参数说明:lr0=0.001是初始学习率,如果从头训练可以适当调大,迁移训练建议保持在 0.001 以下。warmup_epochs=5我刚才讲过,是让动态目标分配器稳定下来的关键。amp=True开启混合精度训练,能在不损失精度的情况下减少约 40% 的显存占用,如果你的卡显存吃紧,这个开关优先打开。
训练开始后,日志里有两个指标要盯住:loss_cls和loss_box。loss_cls下降太慢说明正负样本分配有问题,先看 warmup 是否足够;loss_box震荡明显说明回归目标的尺度分布异常,查看数据里是否存在极端长宽比的目标。如果前 10 轮两个 loss 都没有明显下降趋势,果断停止训练,检查学习率和数据加载是否正常,不要等 100 轮跑完再后悔。
4.4 断点续训与模型选择:保存策略别等跑崩了才考虑
YOLO26 源码默认每个 epoch 结束后都会保存一个last.pt,同时保存一个最优模型best.pt。很多人的习惯是训练完只看best.pt,但我建议把last.pt也保留下来,因为某些数据集上验证集最优模型出现得比较晚,而last.pt可能已经过拟合,所以最终选哪个要结合验证集曲线确认。
from yolov26 import train train( cfg="yolo26s.yaml", data="dataset.yaml", weights="runs/exp5/weights/last.pt", epochs=120, batch_size=16, resume=True, )逻辑说明:resume=True表示从weights指定的断点恢复训练,epochs是最终要训练到的总轮数,而不是剩余轮数。这里有个认知陷阱:如果你上次训练到第 80 轮断掉,现在epochs写 120,源码会自动从第 80 轮继续,一共训练到第 120 轮,总共 120 轮而不是 200 轮。如果我想续训 40 轮,epochs要写成 120。我见过有人在这里搞混导致模型重复训练很久。参数说明:续训时lr0会被忽略,源码使用断点里保存的优化器状态,这一点是设计行为,不要试图靠改学习率来调整续训方向。
5. YOLO26 避坑记录:四个高频问题的现象、原因与解决
5.1 训练显存溢出,但前代模型同配置没问题
现象:换上 YOLO26 后,同一张 24GB 显卡上,前代模型 batch_size 为 32 能跑,YOLO26 在 batch_size 为 24 时报 CUDA out of memory。
原因:重参数化骨干在训练期保留多分支结构,激活值数量显著增加;此外自适应加权颈部的注意力权重虽然参数少,但计算图中的中间张量没有被及时释放。两者叠加导致训练态峰值显存比推理态高出一大截。
解决:先把amp开启,这能省约 40% 显存;然后把 batch_size 降到 16,确认不再溢出后逐步往上加。如果你的数据集本身就大且不想降 batch,换轻量版配置是更稳妥的路,也就是把模型结构配置里的通道数从 0.5 降为 0.33,精度损失大概在 1 到 2 个 mAP 点。千万不要同时降 batch 又加梯度累积步数,梯度累积在动态目标分配器下会让正样本匹配不稳定,表现就是 loss 曲线比正常条件下波动更大。
5.2 训练结束 mAP 不低,但实际图片上检测效果很差
现象:验证集 mAP 有 65 个点,看起来不错,但随手拿手机拍一张照片检测,要么漏检要么定位偏移。
原因:训练和推理的预处理流程不一致。我在 3.2 里提到过通道顺序和 letterbox 的反向映射,训练时源码做的是 BGR 通道被先转 RGB 再加归一化,如果你在推理脚本里跳过这个流程,模型看到的分布和训练时完全不同。另一个常见因素是你的测试图像分辨率和训练分辨率差异过大,模型没见过这个尺度,目标被压缩后特征消失。
解决:把训练用的预处理函数直接复用到推理脚本里,不要自己手写 resize 和归一化。如果确认预处理没问题,检查测试图像里目标的最小像素尺寸是否小于训练集中同类目标的 5%,是的话需要补充多尺度训练,也就是在训练配置里开启随机缩放范围,让模型适应更多尺度分布。我在一个项目里把训练分辨率从固定 640 改成随机 480 到 800 后,实际场景检测效果明显改善,mAP 还涨了 1 个点。
5.3 导出 ONNX 时出现动态 shape 转换失败
现象:在导出 YOLO26 到 ONNX 格式时,报错提示某个算子不支持动态输入形状,导出中断。
原因:自适应加权颈部里的注意力模块在第 2.2 节讲过,它在计算时依赖输入特征图的动态尺寸,而导出阶段如果没有固定输入形状,转换器无法为这个模块生成静态图描述,于是中断。
解决:最简单的方案是在导出参数里显式指定静态输入尺寸,比如固定为 640x640。如果你必须支持动态尺寸,回退颈部融合方式到拼接,这个操作在模型配置里有一行开关,改掉后导出就能通过。注意回退后模型精度会略微下降,部署前需要在验证集上重新确认性能。另外,检查导出时使用的 ONNX 版本是否为项目依赖列表里指定的版本,ONNX 版本过旧会导致一些新算子映射失败。
5.4 多卡训练时第二张卡无法初始化
现象:使用 4 卡训练,第一张卡正常跑起来,另外三张卡报通信初始化失败。
原因:分布式组网时环境中没有声明当前节点的地址和端口,多机训练时每台机器各自用默认值,导致卡之间无法建立通信。单机多卡也有可能出现,主要与 CUDA 驱动的通信库初始化顺序有关。
解决:在启动训练前手动设置分布式环境变量,把地址和端口固定下来。下面是单机四卡时的标准写法:
export MASTER_ADDR=127.0.0.1 export MASTER_PORT=29500 python -m torch.distributed.launch --nproc_per_node=4 --master_port=29500 train.py --cfg yolo26s.yaml --data dataset.yaml逻辑说明:MASTER_ADDR和MASTER_PORT指定了通信主节点的地址和端口,三张卡会从这里同步初始状态。参数说明:--nproc_per_node=4表示本机起 4 个训练进程。如果是在两台机器上训练,每台机器的MASTER_ADDR都要指向第一台机器的 IP,而不是各自填自己的地址,这是最常见的分布式训练地址填法错误。我在一个跨节点训练项目里排查了快一天,最后发现是第二台机器把地址填成了自己的 IP。
6. 把 YOLO26 送上线:导出、量化与延迟验证的最后一公里
检测模型训完,真正的考验才算开始。我通常会在部署前做三件事:导出为标准化格式、检查算子在目标硬件上的支持、最后用真实业务帧测一次稳定延迟。导出这一步建议直接用源码里提供的导出工具,不推荐自己手写转换逻辑,因为重参数化模型的合并操作藏在源码内部,手写容易漏掉关键融合。
python export.py --weights runs/exp12/weights/best.pt --include onnx --imgsz 640 --simplify逻辑说明:这个命令把训练好的.pt权重导出为 ONNX 格式,--simplify表示用 ONNX Simplifier 做一遍图优化,去掉冗余算子。参数说明:--imgsz 640指定导出后的静态输入尺寸,这个值要和训练时一致。如果目标部署环境是 GPU,建议进一步导出为 TensorRT 引擎格式,并开启 FP16 精度,延迟通常能再降一半。如果部署环境是 CPU,ONNX 配合优化推理库已经够用,但要注意动态形状开关,动态 shape 在 CPU 上的内存分配开销很大,固定静态 shape 能明显降低首帧延迟。
量化是一个加分项也是一个坑。YOLO26 的分类分支对低比特量化比较敏感,我试过直接量化到 INT8 后分类准确率掉了 5 个点。解决方法是只量化卷积层,保留检测头里的全精度计算,这样模型体积缩小 60% 左右,准确率损失控制在 1 个点内。如果你要跑 INT8,先用量化校准集统计每层激活值的分布,不要直接跑默认配置。校准集的图像分布要和业务场景尽可能接近,否则量化后的模型会在白天场景表现正常、晚上场景掉点严重。
延迟验证一定要避开一个常见错觉:单张图跑得快不等于稳定。检测服务上线前,我用一段 5000 帧的真实业务视频连续测了 30 分钟,记录了每帧的推理延迟分布。结果发现 P95 延迟比平均延迟高了大约三倍,原因是显存碎片化和批量推理时的内存分配抖动。后来我把输入分辨率固定、开启 CUDA Graph 后,P95 延迟降到了平均值的 1.4 倍以内,这个稳定性对线上服务至关重要。
另外,如果你的部署环境有多个模型需要同时跑,不要每个模型单独申请一块显存,把模型放到同一个推理服务里共享显存池,能显著降低整体显存占用。我在某跨平台系统里就是这么做的,三个模型共用一个推理容器,总显存占用比分开部署少了 30% 多。最后提醒一句,部署到生产环境前,一定要用真实业务的失败样本回归一遍,比如遮挡严重的目标、逆光场景、极小目标。只有这些边缘情况都能稳定检出,YOLO26 才算真正上线成功,而不是只活在验证集里。这是我踩过最深的一个坑,现在每次交付前都要这样做一遍,希望帮到你。
本文还有配套的精品资源,点击获取