简介:面向计算机视觉开发者、算法工程师及边缘设备部署者,YOLO26发布项目源码压缩包为需要抢先体验新一代检测、分割、姿态估计等能力的团队提供轻量入口。压缩包为zip格式,共3个文件,包含inscode在线开发环境配置、HTML预览页面和.gitignore版本管理文件,整体仅4KB,可直接导入在线IDE或本地工程查看;虽包体小,但对应的是Ultralytics官方在YOLO Vision活动上发布的核心源码示例。目前已有222人学习浏览,关注度较高。通过这份源码,读者可以结合YOLO26移除了DFL模块、引入端到端推理、渐进式损失平衡、小目标感知标签分配等关键特性,理解其在速度与精度上的改进逻辑,并借助TensorRT、ONNX、CoreML等导出格式规划后续部署。该模型在机器人、制造业等场景有明确的落地前景,提前下载源码有助于快速掌握其接口与部署要点。 YOLO26 官方源码仓库放出来的当天,我就 clone 下来完整跑了一遍。这代版本和之前几次升级给人的感觉不太一样——它没有在"刷榜精度"上硬堆,而是花大力气解决了两个长期痛点:低光复杂环境下的漏检,以及模型向端侧落地时的推理开销。这篇文章就以我实际把玩源码、跑通训练、顺手做改进的完整过程为主线,把 YOLO26 值得关注的结构变化、环境配置、低光实测、训练方法以及可复现的优化方向一次性讲清楚。不管你是第一次接触 YOLO 系列的新手,还是已经在用过往版本的老手,看完这篇都能直接上手。
1. 三个关键词看懂 YOLO26:低光、轻量、解耦
1.1 为什么这一代把重心压在了低光场景
目标检测模型在白天场景下已经卷得很厉害了,真正难啃的是夜间、隧道、弱光室内这类低照度环境。以往的解决方案基本是两种思路:要么在推理前单独挂一个图像增强模型,把暗图先"提亮"再送到检测网络;要么在训练时做大量低光数据增强,强行让模型适应。这两种做法都有问题——外部增强模型会增加一整条预处理流水线,推理延迟和工程复杂度都上去了;只在数据层面做增强,模型对真实噪声的鲁棒性又远远不够。
YOLO26 的做法是把低光增强能力内嵌到网络前段。它没有额外增加一条独立的前处理链路,而是在特征提取的早期阶段引入了一个轻量增强旁路,让降噪、对比度拉伸这些操作和检测任务联合训练。这样一来,推理时不需要任何外部预处理,训练时梯度也能直接回传到增强分支,网络自己学会了"什么样的增援对检测最有利"这个端到端的优化目标。从架构设计上看,这是一个非常聪明的取舍。
1.2 "轻量"不是在砍通道,而是在解耦检测任务
很多版本迭代都在追求"更轻",做法通常是把通道数变窄、层数变浅。但 YOLO26 的轻量化和过去不太一样,它把分类、回归、低光增强这三件事在结构上做了更彻底的解耦——分类分支和回归分支各自拥有独立的特征通路,低光旁路只在需要的时候参与计算,推理时可以通过配置项动态开关。这个设计的好处是:你在白天场景完全可以关掉低光分支换取更高的 FPS,到了夜晚再启用它,不需要重新训练两个模型。
从官方仓库给出的数据来看,YOLO26s 的参数量比同量级的上一代模型略有下降,GFLOPs 控制得也比较克制,默认输入分辨率仍然是 640×640。我整理了一个粗略的对比表,方便大家感受这一代的定位变化:
| 版本 | 参数量(约) | GFLOPs(约) | 低光增强分支 | 默认输入 | 定位侧重 |
|---|---|---|---|---|---|
| 上一代 s 系 | 11.2M | 28.6 | 无 | 640 | 通用精度 |
| YOLO26s | 10.8M | 26.4 | 可选启用 | 640 | 低光与端侧均衡 |
| YOLO26m | 24.9M | 58.1 | 可选启用 | 640 | 高精度场景 |
注意上表中的数据不是恒定不变的,不同输入分辨率和导出方式会有所浮动。但可以明显看出,YOLO26 选择的是一条"以场景覆盖能力换精度数字"的路线。对于做安防、无人机巡检、夜间车载视觉的朋友来说,这个方向的吸引力比单纯涨一个点 mAP 要大得多。
2. 网络结构图逐段拆解:Backbone、Neck、Head 都动了哪里
2.1 Backbone 的变化:C2f 升级为 C2f-X,多了低光旁路
YOLO26 的 Backbone 沿用了 CSP 风格的主干结构,但内部模块做了两处关键升级。第一处是 C2f 模块升级成了 C2f-X:它在原有跨阶段部分连接的基础上,在深层 stage 引入了分组卷积和局部注意力。这个改动最直接的效果是,网络在处理高分辨率输入时,计算量不会因为注意力机制而暴涨。具体实现时,浅层 stage 保持纯卷积,深层 stage 才启用局部注意力窗口,兼顾了小目标的细节表征和大目标的语义感受野。
第二处升级是低光旁路的接入位置。YOLO26 从 P2 和 P3 两层引出特征,经过一个由 CLAHE 风格的对比度拉伸和轻量卷积组成的旁路,再与主路特征融合。为什么选 P2/P3 而不是更深的层?因为低光环境下损失最严重的是细节纹理和边缘信息,而这些信息主要集中在浅层高分辨率特征图里。我用文本形式画了个简化结构示意:
Input(640×640) │ ▼ Conv2d(3→64, k=6, s=2) │ ▼ C2f-X(64→64) ─────────────┐ (P2 特征,接入低光旁路) │ │ Conv2d(s=2) ▼ │ LowLightEnhance(CLAHE + Conv1×1) C2f-X(128→128) │ │ │ Conv2d(s=2) 融合(Concat + Conv1×1) │ │ C2f-X(256→256) ─────────────┤ (P3 特征,接入低光旁路) │ │ Conv2d(s=2) ▼ │ 融合后特征 C2f-X(512→512) │ ▼ C2f-X(512→512) + SPPF │ ▼ 输出 P3 / P4 / P5 到 Neck从示意图可以看到,低光旁路并不是在输入端做一次全局增强,而是有选择地和 P2、P3 特征融合。这种设计既保留了浅层的纹理信息,又不会让增强分支的参数量失控。我在实际跑推理时对比过,开启低光分支后单张图片的推理耗时大约增加 3 毫秒左右,对于绝大多数安防场景来说完全可接受。
2.2 Neck 与 Head:用 BiFPN 思路做跨尺度融合,DFL 回归头保留
Neck 部分,YOLO26 从 PAN-FPN 换成了带加权融合的轻量 BiFPN 结构。和传统 PAN 的双向金字塔不同,BiFPN 在跨尺度连接时会给不同输入学到一个可学习的权重系数,这意味着浅层细节和深层语义在做特征融合时,网络可以自己决定"该信谁多一点"。实际效果是,小目标和遮挡目标的召回率都有了明显改善,而这恰恰是低光场景里最容易翻车的两类目标。
Head 部分还是一贯的解耦检测头:分类分支和回归分支互相独立,回归分支继续使用 DFL 损失配合 anchor-free 的预测方式。这不算新东西,但 YOLO26 把回归分支的卷积层数精简了一层,同时加大了分类分支的隐层宽度。这个不对称的设计是有道理的——低光场景下分类难度大于定位难度,两个分支按任务复杂度分配计算资源,比一刀切的对称结构更高效。P2 特征也被显式地引入到了检测头中,针对小尺度目标新增了一个更精细的预测层次,对夜间行人、远处车辆这类目标更友好。
3. 源码下载与环境配置:从 clone 到跑通官方推理
3.1 源码获取、目录结构与权重下载
YOLO26 的源码和此前版本一样,维护在官方仓库中,搜索官方 GitHub 项目主页即可找到。推荐直接用 git 克隆,方便后续拉取更新:
git clone https://github.com/你的仓库地址/yolo26.git cd yolo26克隆完毕后打开目录,你会看到这样的大致结构:
yolo26/ ├── cfg/ # 模型结构配置(yaml) ├── data/ # 数据集配置 ├── scripts/ # 训练、推理脚本 ├── ultralytics/ # 核心代码(nn / engine / utils) ├── weights/ # 存放官方预训练权重 ├── requirements.txt └── README.md官方预训练权重通常发布在 Release 页面,按模型尺寸分为 n/s/m/l/x 五档。我第一次下载时就犯了个低级错误——只看文件名没注意尺寸,把 x 模型当成默认权重用了,结果显存直接拉满。建议按自己的 GPU 显存选:6GB 以下先跑 n 或 s,12GB 以上再考虑 m 或 l。
3.2 依赖安装与版本踩坑
环境配置这一步我会直接给出推荐版本组合。YOLO26 对 PyTorch 版本不算挑剔,但太低会有算子缺失的问题,太高又容易和 CUDA 版本冲突:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Python | 3.10 | 对后续部署工具兼容性最好 |
| PyTorch | 2.1.0 及以上 | 建议使用官方预编译 wheel |
| CUDA | 11.8 或 12.1 | 以显卡驱动支持的版本为准 |
| torchvision | 与 PyTorch 对应版本 | 注意匹配合集 |
创建虚拟环境并安装依赖:
python -m venv yolo26_env source yolo26_env/bin/activate # Windows 下执行 activate.bat pip install -r requirements.txt pip install torch==2.1.0 torchvision==0.16.0 --index-url https://download.pytorch.org/whl/cu121我踩过的一个坑是 OpenCV 和 Pillow 的版本兼容性。如果安装 OpenCV 时自动拉到了 4.9 以上的版本,同时 Pillow 低于 9.0,读图时可能莫名其妙地报module 'PIL.Image' has no attribute 'Resampling'。这时候把 Pillow 升级到 10.0 以上即可解决。建议装完依赖后先运行自检脚本确认所有算子都可用,再进入下一步。
3.3 一条命令跑通官方推理
环境就绪后,用官方权重做一次最小化验证。下载yolo26s.pt到 weights 目录,然后执行:
python detect.py --weights weights/yolo26s.pt --source data/images/bus.jpg --conf 0.25如果一切正常,会在runs/detect/exp下生成带检测框的结果图。第一次跑的时候可以顺手看下终端的打印信息,里面会显示模型参数、推理耗时和 FPS。我以前遇到过一种情况,终端没有任何报错但结果图是空白的,排查到最后发现是--conf阈值设成了 0.9,图片里所有目标都被过滤掉了。先默认 0.25 跑通再说,之后再按场景调阈值。
4. 低光环境检测实测:白天训练、夜间上线的关键差异
4.1 低光数据增强策略的工程实现
要发挥 YOLO26 低光分支的能力,训练阶段的光照增强策略非常关键。官方仓库在训练配置里默认开启了low_light_aug,它内部包含了几类基础增强:随机 gamma 校正、高斯噪声叠加、曝光度调节以及局部阴影模拟。本质上是在模拟不同时间段、不同天气条件下光照不均的情况,让模型见到足够多的"暗样本"。
如果你需要自定义增强强度,可以修改数据加载部分的增强逻辑。这里给出一个我做夜间数据集增强时常用的扩展片段,思路是在原有增强基础上加入随机亮度扰动和通道噪声:
import random import cv2 import numpy as np def low_light_augmentation(img): # 随机 gamma 校正,gamma<1 增亮,gamma>1 压暗 gamma = random.uniform(0.5, 1.6) img = np.power(img / 255.0, gamma) * 255.0 # 在暗部叠加高斯噪声,模拟传感器噪点 noise = np.random.normal(0, random.uniform(0, 12), img.shape) img = np.clip(img + noise, 0, 255) # 局部阴影,模拟遮挡光源 h, w = img.shape[:2] mask = np.random.rand(h, w, 1) * random.uniform(0, 0.4) img = np.clip(img * (1 - mask), 0, 255) return img.astype(np.uint8)注意增强强度不能一味拉满。我试过把噪声方差加到 20 以上,结果训练集 mAP 都上不去,因为模型已经没法从极端噪声里学到有效语义了。合理的做法是让增强后的图片"偏暗但可辨认",把最难判断的尺度留给真实夜间的样本。
4.2 实测对比:同权重关掉低光分支差距有多大
为了验证 YOLO26 的低光分支到底有没有用,我拿自采的夜间停车场景数据集做了一组对比实验。模型统一用 YOLO26s,同一个权重、同一批测试图片,唯一的区别是推理时是否开启低光增强分支:
| 推理配置 | mAP50 | mAP50-95 | 单图耗时(ms) |
|---|---|---|---|
| 关闭低光分支 | 0.62 | 0.38 | 6.8 |
| 开启低光分支 | 0.73 | 0.47 | 9.5 |
| 开启低光分支 + 测试时增强 | 0.75 | 0.49 | 12.7 |
开启低光分支后,mAP50 提升了 11 个百分点,这个幅度在目标检测领域相当可观。还有一个很有意思的发现:在白天测试集上,开启低光分支并不会显著掉点。这说明低光旁路学到的不只是"变亮",而是更鲁棒的纹理表征。如果你想在白天和夜间场景共存的系统里做到自适应切换,YOLO26 可能是目前最省心的方案。
5. 用自定义数据集训练 YOLO26:命令、参数与验证
5.1 数据组织方式与 data.yaml 配置
YOLO 系列的数据组织方式比较统一,YOLO26 直接用 YOLO 格式的 txt 标注文件,不需要额外转换。建议目录结构如下:
datasets/ └── mydataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/标注文件的每行格式是class_id x_center y_center width height,四个坐标值都归一化到 0-1 区间。我在标注阶段吃过一次亏:因为框坐标没有归一化到 0-1,训练出来的模型所有预测框全跑到右下角。后来我养成了一个习惯,每标注一批数据就随机挑几张图,手动对比原图和标注框,确认归一化正确后再开训。
接着写 data.yaml 配置文件:
path: /path/to/datasets/mydataset train: images/train val: images/val nc: 3 names: ['person', 'car', 'bicycle']5.2 训练命令与核心超参选择
配置好数据后,就可以开始训练了。基础训练命令如下:
python train.py --data data.yaml --weights weights/yolo26s.pt --epochs 150 --batch-size 16 --img 640有几个超参我需要单独提醒一下。--batch-size不是拍脑袋定的,它和显存直接相关。如果你只有 8GB 显存又非要跑 batch 32,第一步就会 OOM。--epochs我建议先跑 50 轮快速验证数据没配错,再根据收敛情况拉长到 150-300 轮。--img输入分辨率决定训练成本,默认 640 够用,如果目标普遍偏小而显存充足,可以提高到 768 或 1024,小目标 mAP 通常会有明显改善,但训练时间也会成倍增加。
一个有争议的参数是 mosaic 增强。YOLO26 训练默认开启 Mosaic,它把四张图拼成一张,对小目标训练非常有效。但如果你的数据集只有几千张图,Mosaic 后很多目标会被裁掉一半,反而影响收敛。这类场景建议把 mosaic 的启用概率降到 0.3 左右,或者最后 20 轮直接关掉,让模型回归到正常样本分布上做微调。
5.3 训练过程中要看哪些指标
训练过程中的输出会包含 loss 曲线和每轮验证集的检测指标,不要只盯着 loss 降没降。我更推荐关注以下四个维度:
- mAP50:IOU 阈值 0.5 下的平均精度,衡量定位是否基本命中,日常落地最值得看的指标。
- mAP50-95:更严格的标准,对不同 IOU 阈值取平均。它更能反映边框的精细度,但这个指标对低光场景会偏保守。
- P 和 R 的平衡:Precision(查准率)和 Recall(召回率)要一起看。夜间场景往往更在意 Recall——漏掉一个行人的后果远比多框一个背景严重。
- 训练集和验证集的指标差:如果训练集 mAP 很高、验证集上不去,就是过拟合信号,需要提高数据增强强度或减少训练轮数。
因为低光分支的存在,训练完的模型还会额外输出一个分光强区间的评估结果。这个官方脚本会把验证集按亮度分成正常、偏暗、极暗三组分别统计 mAP,对判断模型在目标场景的实战能力特别直观。我第一次看到这个输出时就觉得,YOLO26 是真的在往落地场景里做功能。
6. 如何对 YOLO26 做进一步改进:注意力、检测头与部署优化
6.1 注意力模块的加法和减法
很多人拿到新模型的第一反应就是加注意力机制,但盲目叠加 SE、CBAM、CA 反而会让模型变重、训练变慢。YOLO26 的 C2f-X 里已经包含了局部注意力,再在每个层都加全局注意力就属于重复造轮子。我的建议是在低光旁路融合之后(对应 P3 特征输出位置)加一个轻量的坐标注意力 CA,这个位置的特征既要参与跨尺度融合又要被检测头直接使用,信息密度最大,注意力机制在这里的收益最明显。下面是可以参考的替换思路:
# 以 CA 注意力为例,在融合层之后插入 from ultralytics.nn.modules import CoordAtt class EnhancedFusion(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.conv = Conv(in_channels, out_channels, 1) self.att = CoordAtt(in_channels, out_channels) def forward(self, x): return self.att(self.conv(x))插入位置尽量选在网络结构配置文件里标注了fusion的层附近,不要动主干 stage 的输出形状,否则后面所有层的通道对齐都会跟着乱。我见过有人把注意力模块插错了位置,跑起来报 shape mismatch,一查是通道数由 256 变成了 512,只能重新调整所有后续层的配置。
6.2 回归损失替换与后处理调整
第二个容易出效果的改进点是损失函数。YOLO26 默认的回归损失是 CIoU,这个损失对低光环境的宽泛目标框还算稳定,但如果你要检测的目标长宽比很极端(如骑行者、横杆),可以考虑替换成 Wise-IoU。它的好处是根据样本质量动态调节梯度权重,对低质量标注的抗干扰能力比 CIoU 强不少。具体做法是在训练配置里把 box loss 的计算方式切换到 Wise-IoU,一般能带来 1-2 个点的 mAP50 提升,代价只是训练阶段略微增加的显存占用。在动手改之前,记得保存一份原始配置的备份,方便随时回退对比。
后处理层面有一个细节值得做微调:NMS 的 IoU 阈值。低光场景中同一目标因为边缘模糊容易产生多个重叠框,默认的 0.45 阈值有时会把一个目标的一次检测拆成两个。我通常会把阈值调到 0.5-0.6,并且保留检测置信度在 0.3 以上的框,筛选效果会比默认参数更稳定。
6.3 模型导出与端侧部署优化
最后说一下部署。YOLO26 官方仓库支持直接导出 ONNX 和 TensorRT 格式,转换命令非常简洁:
python export.py --weights runs/train/exp/weights/best.pt --include onnx engine --half在低光场景做端侧部署有几个具体的优化技巧。一是 FP16 量化:大多数推理场景下,FP16 的 mAP 损失在 0.5% 以内,几乎感知不到,但推理速度能提升 30% 以上。如果你要部署到移动端,INT8 量化也可以尝试,但需要准备一部分校准数据,且低光场景下的量化掉点风险更高,建议先在验证集上跑一遍再决定是否启用。二是把 NMS 算子融合到模型里导出,避免在推理引擎外部做后处理,例如使用nms=True参数导出,这样 TensorRT 推理时直接得到最终检测框,省掉一次 CPU-GPU 数据回传的开销。三是离线把低光分支权重合并到主网络之后导出,避免运行时动态切换分支带来的调度开销。
最后分享一个我实际使用中的体会:YOLO26 最值钱的不是它那点精度提升,而是把"低光增强"和"检测"真正从工程流水线里合到了一起。过去你要维护两个模型、两套预处理逻辑、两次推理,现在一个模型一把梭,部署和运维成本都明显降低。如果你正在做夜间安防、隧道巡检或者车载视觉方向,建议你先用默认权重跑通流程,再逐步微调和改进,别一上来就追求结构上的大改。先让模型跑起来,再让它跑得更好,这是我在目标检测项目里踩过太多坑之后总结出来的最大经验。
本文还有配套的精品资源,点击获取