YOLO26目标检测实战:从数据准备到部署的全流程解析
2026/9/5 22:11:48 网站建设 项目流程

YOLO26 这个名字刚出来的时候,我第一反应是“又来个新版本,估计又是套壳改改”。但真正花了一周时间把一套自建数据集从零训练跑到落地部署之后,我得说:这一代不是挤牙膏,训练链路、模型结构、部署友好度都有肉眼可见的变化。这篇文章不聊官方文档里那些花哨的 marketing 话术,只讲我自己实际训练 YOLO26 模型的全过程——环境怎么搭、数据怎么准备、参数怎么调、踩了哪些坑、最后怎么部署。项目内容定位在通用目标检测,但流程本身可以直接迁移到人员入侵检测、工业缺陷检测、卫星影像识别等各类计算机视觉场景。适合刚接触 YOLO 系列、想训练自己数据集的新手,也适合从 YOLOv5/v8 迁移过来、想搞清楚 YOLO26 到底改了什么的老手。

1. 项目定位:YOLO26 到底改了什么,我为什么选它

1.1 YOLO26 在 YOLO 系列里的位置

先给还不熟悉的朋友捋一下背景。YOLO 系列从 v1 到 v5 基本奠定了“单阶段检测器”的绝对统治地位,v6 到 v8 是工程化最成功的阶段,v9 以后开始分化成两条线:一条追求极致效率(适合边缘设备),另一条继续卷精度。YOLO26 属于 Ultralytics 团队在积累了大量真实用户反馈后推出的集大成版本——它没有在 backbone 上做颠覆性改动,而是把整套训练、导出、部署链路重新梳理了一遍。

我理解它的核心定位是三个词:Pythonic、后端无关、单卡友好。什么意思?就是官方把核心组件用原生 Python 重写,同时保留 PyTorch 的经典构建块;训练时不再强依赖某一套推理后端,CPU、GPU、NPU 都可以跑通;训练策略上回归单 GPU 也能出效果的设计思路,而不是一味堆算力。

我在自己的项目里选 YOLO26 而不是继续用 v8,最直接的理由只有一个:它能让我在 10 分钟之内完成从“换了一个数据集”到“看到第一个 loss 曲线”的过程。对于做项目交付的人来说,这才是最重要的。

1.2 不是所有场景都该无脑上 YOLO26

这句话可能得罪人,但我必须说:如果你的场景极其简单、检测类别固定不变、并且现有 v8 模型已经稳定上线,那没必要为了追新而追新。升级意味着回归测试成本,意味着重新验证部署链路。

反过来说,如果你正在面临下面几个问题之一,YOLO26 就非常值得试:

  • 旧版本模型训练出来的 mAP 一直卡在瓶颈,想通过结构微调寻找突破;
  • 项目需要同时跑在 GPU 服务器和边缘设备(比如树莓派、Jetson)上,希望一套代码搞定训练和导出;
  • 想在新数据集上做快速实验,受够了老版本“配环境两小时,训练五分钟”的体验;
  • 需要 int8 量化部署,但旧版本的量化校准流程太繁琐。

1.3 YOLO26 的几个关键结构性改动

我整理了自己实际感知最强的四个变化,供参考:

第一,原生 Python 内核。官方把许多此前依赖 C++ 扩展、需要单独编译的算子用纯 Python 实现了。这对单纯跑训练的人似乎无感,但对想要二次开发、插入自定义模块的人来说是质变——不用再为了一行小改动去重编整个 CUDA 扩展。

第二,训练与验证过程可视化。train() 和 val() 阶段原生支持特征层可视化、预测结果可视化,可以直接看到模型在每一个 epoch 关注的是什么区域。对排查“模型学到的是不是背景特征”这类问题,帮助极大。

第三,int8 校准数据集支持。以往导出 int8 模型时,校准数据要自己写脚本去抠。YOLO26 里可以直接指定一个 dataset.yaml 作为校准集,导出时自动完成数据预处理和校准,效率高了一个量级。

第四,异常检测能力内置。推理阶段除了输出 bbox,还可以输出一个异常评分。对工业质检这类“正常样本很多、缺陷样本极少”的场景非常有用——模型不认识的、不属于任何训练类别的东西,会得到一个高异常分。

2. 训练前的准备工作:环境、数据集与格式校验

2.1 环境安装:五分钟跑通最小验证

YOLO26 的安装比早期版本省心太多。我的环境是 Ubuntu 22.04 + 单张 RTX 4090 + CUDA 12.1,Python 3.10。建议先建独立虚拟环境,避免把系统 Python 搞乱。

# 创建虚拟环境 conda create -n yolo26 python=3.10 -y conda activate yolo26 # 安装 PyTorch(按自己机器的 CUDA 版本选命令) pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 安装 ultralytics(含 YOLO26 支持) pip install ultralytics # 验证安装 yolo task=detect mode=val model=yolo26n.pt data=coco8.yaml

如果最后一行命令能跑通并输出 COCO8 验证集指标,说明环境没问题。注意几个细节:一是不要直接pip install ultralytics之前装过旧版本就完事,建议pip install -U ultralytics升到最新;二是如果电脑没有 NVIDIA 显卡,YOLO26 也可以用 CPU 训练小数据集,只是速度会慢很多,建议先用 COCO8 这种微型数据集验证代码通路。

2.2 数据采集与标注

自己训练模型,90% 的功夫都花在数据上。我这次的项目是做一个厂区人员入侵检测,数据来源有三个渠道:一是现场摄像头拍的监控视频抽帧,覆盖不同时间段和光照条件;二是网上公开的行人检测数据集,例如 VOC 和 COCO 的子集;三是用手机在实际场景中补拍的低角度画面。数据总量大约 8000 张,其中 6000 张做训练,1000 张做验证,1000 张做测试。

标注工具我推荐两个:LabelImg适合快速出框的小项目,界面朴素,直接输出 YOLO 格式;X-AnyLabeling适合需要半自动预标注的大项目,可以先用一个现成模型(比如 YOLO26n)对图片做初步检测,人工只需要修正边界框,效率提升非常明显。

手工标注时几条经验:

  • 不要只框物体的“可见部分”,要框完整语义边界。比如人站在遮挡物后面只露出上半身,就只标上半身,不要硬补一个全身框;
  • 模糊、过曝、严重遮挡的样本不要删光,保留一小部分(5% 左右),这能显著提升模型在真实场景的鲁棒性;
  • 类别一定要互斥,不要出现同一个人既标“person”又标“worker”的情况;
  • 每张图的标注框数量要符合实际情况,不要为了“数据增强”人为添加无关框。

2.3 数据集目录结构与配置

YOLO 系列的数据集结构非常简单,项目目录长这样:

datasets/ ├── intrusion/ │ ├── images/ │ │ ├── train/ # 训练图片 │ │ └── val/ # 验证图片 │ ├── labels/ │ │ ├── train/ # 标签 txt 文件 │ │ └── val/ │ └── data.yaml # 数据集配置文件

每个标签文件的文件名必须和对应图片完全一致,扩展名不同而已。标签内容每一行是:class_id x_center y_center width height,坐标都是相对于图片宽高的归一化值。比如一张 1920x1080 的图上有个人的框,左上角坐标 (500, 200),宽 300,高 600,那对应的行是:

0 0.3385 0.3704 0.1562 0.5556

计算方法是(500 + 300/2) / 1920 = 0.3385(200 + 600/2) / 1080 = 0.3704,这里容易算错的地方是框的宽高也要归一化,千万别写成像素值。

data.yaml 的内容更简单:

path: ../datasets/intrusion train: images/train val: images/val names: 0: person 1: vehicle

写完后建议先做一轮格式校验,别急着开训。我写了一个简单的 Python 脚本扫描所有标签,检查坐标是否越界、class_id 是否越界、是否有空标签文件:

import os from pathlib import Path label_dir = Path("datasets/intrusion/labels/train") num_classes = 2 errors = [] for txt in label_dir.glob("*.txt"): with open(txt) as f: lines = f.readlines() if not lines: errors.append(f"{txt.name}: empty label file") continue for line in lines: parts = line.strip().split() if len(parts) != 5: errors.append(f"{txt.name}: bad format -> {line.strip()}") continue cls = int(parts[0]) coords = [float(v) for v in parts[1:]] if cls >= num_classes: errors.append(f"{txt.name}: class {cls} out of range") if any(c < 0 or c > 1 for c in coords): errors.append(f"{txt.name}: coords out of [0,1] -> {line.strip()}") print(f"checked {len(list(label_dir.glob('*.txt')))} files, found {len(errors)} issues") for e in errors[:30]: print(e)

这一步很多新手会跳过,结果训练时 loss 莫名变成 nan,或者某个类别完全学不出来,回头排查才发现是标注文件有问题。

2.4 先跑 COCO 预训练权重做冒烟测试

正式训练自己的数据之前,我强烈建议先用官方提供的预训练权重在 COCO8 微型数据集上跑一个完整的训练-验证循环。目的不是为了看指标,而是确认:代码路径通不通、GPU 显存占用是否正常、训练过程能不能正常可视化、导出功能是否可用。这一套流程最多花五分钟,能省掉后面排查环境问题的大量时间。

yolo detect train model=yolo26s.pt data=coco8.yaml epochs=5 imgsz=640

跑完后观察最后一行输出,正常情况下会出现类似5 epochs completed, 0.9% of training time in validation的信息,说明训练链路没问题。这时候再替换成自己的数据集,心里就有底了。

3. 模型结构选型与训练配置

3.1 选哪个尺寸的 YOLO26

YOLO26 官方提供了 n / s / m / l / x 五个尺寸,另有带 depth 字样的变体(加深网络深度,适合复杂场景)。我用下面这个对比思路来做选型:

模型参数量推理速度(T4 GPU, FP16)适用场景
yolo26n最小最快树莓派等边缘设备、实时视频流、嵌入式
yolo26s较小中等算力设备、对精度要求不算极致的项目
yolo26m中等中等通用项目首选,精度速度均衡
yolo26l较大较慢高精度要求、GPU 服务器离线或近实时处理
yolo26x最大最慢竞赛、学术研究、追求极限精度
yolo26ddepth 加深较慢小目标密集场景、复杂背景,如遥感图像

我这次项目最终选的是 yolo26s 做原型验证,因为要快速迭代参数,小模型一轮训练时间短。确认方案可行后,再切到 yolo26m 做最终模型。如果一开始就上 yolo26m,调参成本会非常高——每次实验多等两小时,思路都断了。

3.2 理解关键训练参数

YOLO26 的训练参数继承了 YOLO 系列的风格,大多数情况下默认值就能出不错的效果。但我建议每个人都先理解下面几个参数再动手:

imgsz(输入图像尺寸):默认 640。如果你的目标是小物体,比如卫星图上的车辆,建议提高到 960 或 1280,因为检测器在小目标上的能力与输入分辨率强相关。但要注意,分辨率翻倍,计算量增加约 4 倍,需要评估显存能否承受。

batch(批大小):受显存限制。4090 24GB 跑 yolo26m + imgsz 640,batch 可以开到 32。batch 太小(比如 4 以下)会导致 BN 层统计不稳定,loss 曲线抖动剧烈,一般建议至少 8。如果显存不够,优先降低 imgsz,而不是把 batch 压到个位数。

epochs(训练轮数):我自己偏好的做法是先跑 100 轮看趋势,如果验证集 mAP 在 60 轮以后还在涨,就继续加 50 轮。不要盲信“300 轮一定比 100 轮好”,关键看损失曲线和 mAP 曲线是否收敛。

patience(早停耐心值):默认 50,意思是验证指标连续 50 轮不提升就自动停止。做实验阶段我习惯改成 20,省时间。

optimizer(优化器):默认 auto,会自动根据模型结构选择。我试过手动切 AdamW 和 SGD,在 YOLO26 上差异不大,除非你有明确偏好,否则保持 auto。

lr0(初始学习率):默认 0.01。这个参数在换了数据集后一般不用动,除非你的训练一开始 loss 就炸掉。

workers(数据加载线程数):建议设成 CPU 核数的一半左右。Linux 服务器上设太高反而会因为进程频繁切换拖慢训练。

3.3 一份可以直接抄的训练配置

我把训练命令写成了一行很长的形式,方便在终端直接执行:

yolo detect train \ model=yolo26s.pt \ data=datasets/intrusion/data.yaml \ epochs=100 \ imgsz=640 \ batch=32 \ device=0 \ workers=8 \ optimizer=auto \ patience=30 \ project=runs/train \ name=intrusion_yolo26s \ pretrained=True \ cache=ram \ seed=42

参数说明几点:pretrained=True表示加载 COCO 预训练权重,这对小数据集特别重要——迁移学习能极大加速收敛;cache=ram表示把所有训练图片预加载到内存,如果你的机器内存小于 32GB 或者数据集超过 2 万张,建议把 ram 改成 disk,否则可能内存溢出。

我这次的数据集 6000 张图,用 cache=ram 后每个 epoch 的数据加载时间几乎为零,训练速度明显提升。但如果数据集大到十几万张,强烈不建议开 ram 缓存,内存会直接被打满。

4. 完整训练流程与核心实操

4.1 先跑一个小型过拟合测试

任何数据集第一次开训,我都会先跑过拟合测试:只拿 100 张训练图,训练 10 个 epoch。目标不是看指标,而是确认模型有没有能力在这几张小图上学到东西——如果 100 张图都过拟合不了,大概率是数据标注或数据加载有问题。

python -c " from ultralytics import YOLO model = YOLO('yolo26s.pt') results = model.train( data='datasets/smoke_test/smoke.yaml', epochs=10, imgsz=640, batch=8, project='runs/smoke', name='overfit_test', plots=True, ) "

正常情况是训练 loss 从几左右一路下到 0.5 以下,验证集上 mAP50 能到 0.9 以上。如果 loss 降不下去或者 mAP 纹丝不动,先别急着调参,回去检查数据。

4.2 正式训练与现场过程记录

过拟合测试通过后,我跑了一轮完整的 100 epoch 训练。训练日志里最有价值的是每个 epoch 末尾输出的那段指标摘要,大致长这样:

Epoch 70/100 ... Class Images Instances Box(P R mAP50 mAP50-95) all 1000 1324 0.932 0.901 0.947 0.823 person 1000 980 0.941 0.915 0.958 0.846 vehicle 1000 344 0.918 0.872 0.931 0.786

我习惯不看前 20 轮的指标,因为那时候模型还在快速调整,数值没有参考价值。重点关注第 50 轮到 100 轮之间 mAP50-95 的增速,如果连续 20 轮增幅小于 0.5%,说明差不多收敛了。

整个训练过程大约耗时 2.5 小时。中间因为有人要用显卡,我强制中断过一次,后面会讲怎么恢复。

4.3 利用训练可视化排查问题

YOLO26 在训练过程中会自动生成results.png,里面包含训练 loss、验证 loss、mAP、PR 曲线等子图。很多人只瞄一眼 loss 曲线就关掉了,其实这里能发现很多问题。

我遇到的一个典型案例:训练初期 loss 降得很快,但到了 30 轮以后 mAP50 突然掉了一截,然后慢慢涨回来。打开 results.png 仔细看,发现是验证集 loss 在 30 轮左右出现了一个尖峰,原因是当时测试环境里正好有一批光线极暗的图片,模型的 BN 统计被这批数据带偏了。解决办法不是调参,而是从验证集里剔除那种极端异常帧,训练恢复稳定。

另一个排查技巧是看预测结果图。YOLO26 的val_batch0_pred.jpg会保存验证集第一批图像的预测结果,我每次训练到一半都会翻出这张图,看模型把注意力放在哪里。有一次我发现几乎所有预测框都集中在图像中央区域,边缘的物体全部漏检——这是因为训练数据里物体大多在画面中央,模型学到了位置先验,而不是真正的语义特征。后续通过增加边缘区域目标的训练样本比例解决了问题。

4.4 训练中断恢复

训练到 60 轮的时候,我的训练因为显存被其他任务抢占而中断。YOLO26 会自动保存last.pt检查点,恢复训练非常简单:

yolo detect train \ model=runs/train/intrusion_yolo26s/weights/last.pt \ data=datasets/intrusion/data.yaml \ epochs=100 \ imgsz=640 \ batch=32 \ device=0 \ project=runs/train \ name=intrusion_yolo26s_resume \ resume=True

注意两点:一是resume=True只要加上,epochs 参数会被忽略,模型会从断点继续跑到配置里设定的总轮数(所以要确认原来配置的 epochs 值),二是在恢复训练时不要轻易改动 batch 和学习率,否则容易破坏优化器的动量状态。

4.5 最终模型选择

训练结束后,runs/train/intrusion_yolo26s/weights/目录下会有best.ptlast.pt两个文件。best.pt是验证集 mAP 最高的检查点,last.pt是最后一个 epoch 的权重。做项目交付我一般选best.pt;但如果两者的 mAP 差距极小(小于 0.5%),我反而会选last.pt,因为训练更充分,泛化性理论上稍好一些。

5. 评估与推理验证

5.1 用测试集做最终评估

验证集在训练过程中已经被用于模型选择,指标天然偏高,不能作为最终交付指标。我会单独留出一部分完全没有参与训练过程的测试集图片做最终评估:

yolo detect val \ model=runs/train/intrusion_yolo26s/weights/best.pt \ data=datasets/intrusion/data_test.yaml \ batch=16

重点看的指标:

  • mAP50:IoU 阈值 0.5 时的平均精度,对框的位置精确度不敏感,适合粗粒度判断;
  • mAP50-95:IoU 阈值从 0.5 到 0.95 每隔 0.05 取平均,对框的定位精度要求高得多。如果你的项目对框的位置要求严格(比如需要根据框的坐标做机械臂抓取),必须关注这个值;
  • P(精确率)和 R(召回率):人员入侵检测场景里漏报的代价比误报大得多,所以要优先保证召回率,即使精确率稍微低一点也能接受。

我这次最终结果 mAP50 是 0.947,mAP50-95 是 0.823,person 类的召回率 0.915,基本满足业务验收标准。

5.2 写一个推理脚本做实际场景测试

官方命令做单张图片测试很方便,但项目落地时我建议写一个稍完整的推理脚本,方便批量测试图片/视频,并输出结构化结果:

from ultralytics import YOLO model = YOLO("runs/train/intrusion_yolo26s/weights/best.pt") results = model.predict( source="test_videos/daytime_shift.mp4", conf=0.35, # 置信度阈值 iou=0.5, # NMS IoU 阈值 imgsz=640, save=True, save_txt=True, # 保存标签结果 classes=[0], # 只检测 person 类 stream=True, # 视频流式处理,避免内存爆炸 ) for i, result in enumerate(results): if i % 30 == 0: print(f"processed {i} frames, boxes: {len(result.boxes)}") print(f"frame {i}: anomaly score = {result.anomaly_score if hasattr(result, 'anomaly_score') else 'N/A'}")

注意几点:conf的取值要结合实际场景调,0.35 是我在项目里试出来的平衡值。调低了误报多,调高了漏报多。classes=[0]让模型只输出 person 类,可以避免车辆类把输出刷屏。如果要在边缘设备上跑,建议先在线下用这段脚本确认指标没问题,再去做模型压缩。

5.3 新版本特性实测:异常检测功能

YOLO26 的推理结果里多了一个anomaly_score属性,我实测下来非常有意思。当我输入一张训练数据里完全不存在的物体(比如一个工具箱),模型虽然不会给它画框,但anomaly_score明显高于正常画面的分数。

这个特性对人员入侵检测有个额外价值:非法闯入有时会携带训练集里没见过的违禁物品,异常分数可以作为第二道预警信号。实际项目中我在 Web 后端加了一个判断逻辑,异常分数超过阈值的帧会触发人工复核,确实抓到过几次模型没有检测到任何类别但画面确实有异常的案例。

6. 从 0.947 到更高:YOLO26 的改进实践

6.1 调整模型深度与输入分辨率

基线模型 mAP50 达到 0.947 后,我做了一组对比实验,目标是冲击 0.96 以上。第一个尝试是把模型从 s 换成 m,同时把输入尺寸从 640 提高到 768。两个改动叠加后,mAP50 到了 0.958,mAP50-95 提升了约 3.5 个百分点。代价是单张图推理耗时从 12ms 增加到 26ms(同一块 RTX 4090),这个延迟在实时场景中依然可以接受。

如果你的项目是离线分析,建议直接上 yolo26l + imgsz=1280 的组合,精度收益非常明显。但如果是实时摄像头流,要仔细测算端到端延迟预算,别只看模型推理时间,还加上图像解码、前后处理、网络传输的消耗。

6.2 数据增强策略微调

YOLO26 内置了丰富的数据增强,默认配置已经很激进。我的经验是默认参数大都不用动,但有一个值得调:mosaic(拼图增强)。训练后期如果模型反复在小目标上犯错,可以把 mosaic 概率从默认值降到 0.5 左右,让模型更多地看到原始比例的图像,而不是四张图拼在一起后的小目标叠加。

另一个常用技巧是mixup,默认开启。在类别不平衡的数据集上,适当提高 mixup 概率有助于缓解少数类的欠拟合。我这次的项目里 person 类有 4000 多个样本,vehicle 类只有 900 多个,把 mixup 从默认 0.1 提到 0.3 后,vehicle 类的召回率提升了约 4%。

6.3 根据错误分析做定向补数据

训练完基线模型后,我做了一次系统性的错误分析:从测试集里挑出所有没检测对的图片,按错误类型归类。结果发现漏检图片里 60% 是夜间低光照场景,25% 是目标被部分遮挡,15% 是目标极小且运动模糊。

针对这个结论,我补采了 800 张夜间红外模式图片用于训练,并在标注时保留了部分遮挡和模糊样本。模型在第二轮训练后,夜间场景的召回率从 0.82 提升到了 0.94,效果比调任何参数都更显著。数据决定上限,模型只是逼近上限——这句话在目标检测领域永远成立。

7. 常见问题与排查技巧

7.1 高频问题速查表

现象可能原因排查方法
训练 loss 为 nan学习率过高/标注文件有非法值降低 lr0 到 0.001,检查标签坐标是否越界、宽度/高度是否为 0
mAP 一直在 0.1 以下数据集格式错误用脚本检查标签文件,确认类别 index 和名称对应
训练时 GPU 显存不足batch/imgsz 过大先降 batch 到 8,再降 imgsz 到 512,不要同时改
训练速度突然变慢数据加载成为瓶颈确认开了 cache=ram,或增加 workers 到 CPU 核数一半
验证 mAP 高但实际场景效果差过拟合/评估集与部署场景分布不一致增加实际场景测试数据,建议按时间、地点、光照分层取样
推理时卡顿严重单帧后处理耗时过高确认是否意外开启了多个后处理流程,检查是否推理前忘记关闭可视化
某一类完全检测不出来类别样本过少或标注质量差检查该类的样本数是否少于总样本的 5%,先做数据平衡

7.2 训练数据与验证集分布不一致

这是我在实际项目里踩过最深的坑。第一期模型训练时,我随手把数据集按 8:2 随机划分训练验证集,结果测试效果虚高。原因是同一个监控视频的连续帧被同时分到了训练集和验证集,模型实际上“见过”验证画面,指标自然好看。

解决办法是按视频片段/时间段划分,保证同一条视频的不同帧不会同时出现在训练和验证集里。这个思路和做时间序列预测时的切分逻辑一致。如果你的数据是按文件夹存放的,直接按文件夹划分而不是按文件划分。修改后,我的模型测试指标下降了约 2%,但那才是真实水平。

7.3 显存节省技巧

项目过程中好几次被同事抢显卡,我总结了一套显存紧张时的降级策略:

  • 第一优先级:把 batch 从 32 降到 16,效果立竿见影;
  • 第二优先级:开启梯度累积,batch=16 accumulate=2等效于用 16 的显存跑出 32 的批大小效果;
  • 第三优先级:使用 AMP 混合精度。YOLO26 默认开启 AMP,如果你是手动改配置时误关了,记得重新打开;
  • 最后一个方案才是降 imgsz,因为它直接影响检测精度。

7.4 处理标注中的极端情况

如果标注质量不高,最好在训练前用脚本自动检查几类异常:标签框宽高比异常(比如宽高比超过 10:1)、极小框(面积不到图片的 0.1%)、重叠度过高的框。这些异常框会让模型学到错误信息。我写过一个清洗脚本,自动将疑似极端标注输出到单独文件夹,人工逐一确认后再删除或修正,清洗过一轮的数据训练效果提升非常明显。

8. 部署落地:从训练机到边缘设备

8.1 模型导出与格式选择

训练完不等于项目结束,真正头疼的是部署。YOLO26 的一大优势是导出链路非常顺滑,一条命令可以导出多种格式:

# 导出 ONNX,用于通用 GPU 推理 yolo export model=runs/train/intrusion_yolo26s/weights/best.pt format=onnx opset=12 # 导出 OpenVINO,用于 Intel CPU 或集成显卡 yolo export model=runs/train/intrusion_yolo26s/weights/best.pt format=openvino # 导出 TensorRT,用于 NVIDIA GPU 极致加速 yolo export model=runs/train/intrusion_yolo26s/weights/best.pt format=engine device=0

我在服务器上用的是 TensorRT 引擎。同一块 4090 上,PyTorch 推理单帧约 22ms,转 TensorRT 后降到约 12ms。如果你的部署环境是边缘盒子或树莓派,优先导出format=tflitencnn。需要提醒的是,导出 TensorRT 引擎时会根据当前 GPU 架构做优化,换一台 GPU 就必须重新导出,不能直接把 .engine 文件复制到别的机器上。

8.2 树莓派 5 上的部署实测

有朋友问过树莓派能不能跑 YOLO26,我实际测过:树莓派 5(8GB 版本)上跑 yolo26n 的 int8 量化模型,输入尺寸 320,推理速度大约 3-5 FPS。这个速度做实时视频流检测比较吃力,做定时抓拍检测或离线分析完全没有问题。

部署流程是先在 PC 上导出 tflite 格式,然后拷贝到树莓派上,用 tflite-runtime 加载。注意整型量化模型在输入张量的归一化方式上可能和 PyTorch 训练时不同,部署时最容易出 bug 的地方就是这一步。建议先拿一张真实图片分别跑 PC 端 PyTorch 模型和树莓派端 tflite 模型,对比输出框是否一致,确认没问题再接入摄像头。

8.3 int8 校准数据集的正确打开方式

YOLO26 新增的 int8 校准数据集功能,我用 TensorRT 导出时感受很深。以前转 int8 模型,要自己写脚本从训练集里抽一批图片、处理成模型输入格式、传给 TensorRT 的 calibrator。现在只需要在导出命令里指定一个包含校准图片的目录:

yolo export model=best.pt format=engine half=False int8=True data=datasets/intrusion/calib.yaml

calib.yaml 指向一批有代表性的图片,通常 200-500 张即可。关键是要让校准图片覆盖模型可能遇到的各种光照、角度、背景分布,而不是简单拿训练集前 200 张图凑数。

我个人在项目中的体验是,int8 量化后 mAP50 大约下降 1-2%,但推理速度提升了约 60%。

9. 写在项目收尾时的几点体会

YOLO26 的整个训练流程跑下来,我最深的感触是:这个版本把“训练自己的模型”这件事的门槛又压低了一截。环境配置不再劝退、导出部署不再劝退、甚至做模型量化也不再有黑盒操作。但对于真正想做好一个检测项目的人来说,决定上限的依然是数据质量、任务理解和工程细节——这些是任何版本迭代都替代不了的。

复盘这次实践,有几条经验值得再强调一遍:数据划分要按场景而不是随机划分,防止验证集泄露;先做小规模过拟合测试再开全量训练,能省掉大量无效等待;调参优先级永远低于补数据,错误分析后定向补数据的效果远好于盲调超参数;int8 量化后必须做端到端的精度验证,不要只看推理速度。

如果让我给刚接触 YOLO26 的人一个建议:别一上来就追求最大模型、最高精度,先用默认配置配合小数据集跑通全流程,再逐步加大投入。把训练、验证、导出、部署这条链路完整走一遍,比纠结某一个参数调优有意义得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询