
YOLOv11多光谱目标检测训练全流程指南【免费下载链接】ultralyticsUltralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimation, object tracking项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics当你第一次把 10 通道的 TIF 塞进训练脚本控制台弹出的那行红字是Expected 3 channels, got 10——这是 YOLOv11 多光谱目标检测最经典的开场。从数据体检、yaml 落笔到训练排错、导出推理本文带你把这次完整训练任务一次性走通。数据体检通道数验证与多光谱转换确认数据实际通道数通道数错配是后续一切报错的源头动手转换前先花十秒验证。下面这段代码读取一张多光谱 TIF 并打印形状第三个维度就是通道数import cv2 img cv2.imread(samples/train/0001.tiff, -1) # -1 表示按原始通道读取 print(img.shape) # 期望输出(H, W, 10)用官方工具把 RGB 扩成多光谱手里只有 RGB 图像时框架自带的波长插值工具可以把 3 通道铺开成任意波段数的多光谱图像实现位于 数据转换模块。调用示例from ultralytics.data.converter import convert_to_multispectral convert_to_multispectral(coco8/images/train, n_channels10) # 每个 jpg 生成同名 .tiff转换原理把 R/G/B 放到 650/510/475 nm 三个锚点波长上在 450~700 nm 区间线性插值出 10 个波段再用cv2.imwritemulti写出多通道 TIFF。目录里每个原图会多出一个同名.tiff标注文件不用动。官方测试数据集coco8-multispectral就是这样造出来的4 张训练图、4 张验证图、80 个类别配置文件就在仓库里多光谱数据配置配置落笔yaml 一次写对channels 参数为什么不能省channels就像告诉模型这副相机有几个滤镜层。框架建模时会读取该字段来重建首层卷积模型构建逻辑ch self.yaml[channels] self.yaml.get(channels, ch) # 默认 3完整的多通道数据集模板长这样参照官方 coco8-multispectral 的写法path: coco8-multispectral # 数据集根目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 channels: 10 # 必须与实际图像通道数一致 nc: 80 # 类别总数 names: {0: person, 1: bicycle, 2: car} # 类别名⚠️ 踩坑提醒漏写channels时框架按默认 3 通道建卷积而数据是 10 通道第一个 epoch 就会抛出Input size mismatch类维度错误。这个报错离答案最近却最容易被当成环境问题绕过写 yaml 时把它加上能省掉一整晚排查。小模型先行为什么建议从 nano 起步多光谱训练先跑链路、再拼精度。nano 单轮训练只要几分钟数据格式、通道数、标注对齐这些问题在几个 epoch 内就会暴露代价最小from ultralytics import YOLO model YOLO(yolo11n.pt) model.train(datacoco8-multispectral.yaml, epochs3, imgsz320) # 先短跑验证流程跑通后再按 s/m/l 逐级放大或把 imgsz 拉回 640。官方测试脚本就是这么做的测试用例 里先用小图小轮数确认 train val 能闭环。训练路上的四类卡顿逐个过一遍GPU 显存撑不住 10 通道大图现象640x640 十通道 batch16 时 OOM 崩溃。定位路径显存开销与batch × channels × imgsz²成正比降一个就能救。修复操作model.train(datacoco8-multispectral.yaml, batch4, accumulate4, ampTrue) # 或缩小输入imgsz416验证集 mAP 突然归零现象loss 正常下降val 的 mAP 却一直是 0。定位路径验证流程 里 warmup 用的通道数直接取自self.data[channels]yaml 与图像不一致时检测框全部对不上。修复操作python -c import cv2; print(cv2.imread(val/0001.tiff, -1).shape) # 数通道 # 再把 yaml 里 channels 改成同一个数字重新 val预测结果整片全黑现象训练指标正常预测出的可视化图却黑得可疑。定位路径通道截断逻辑 里可视化只保留前 3 个波段用于绘图多光谱图被压成 RGB 显示框画在错配的底图上就会显得发黑。修复操作核对检测框坐标是否正常并把结果图单独保存results model.predict(samples/train/0001.tiff, saveTrue) # 结果写入 runs/predict如果框都对、只是图难看那不是模型问题是显示层在截通道。数据增强与多通道的摩擦是第四类卡顿通常表现为NoneType或形状断言报错。定位路径数据增强模块 中部分变换对波段数有隐含假设。修复操作很简单训练参数里直接关掉不兼容项model.train(datacoco8-multispectral.yaml, mosaic0.0, mixup0.0)交付适配导出与推理导出时通道数会自动带上导出阶段的定位在 ONNX 导出逻辑构建探测输入时直接读model.yaml里存的通道数所以一条标准命令就够了yolo export modelruns/detect/train/weights/best.pt formatonnx opset12导出完检查 ONNX 输入形状是否为[1, 10, 640, 640]确认引擎吃到的通道数和训练时一致多通道模型导出才算真正闭环。推理脚本里 cv2.imread 的 -1 参数cv2.imread(path)默认按 BGR 三通道读遇到 10 通道 TIFF 会静默丢波段。第二个参数-1才是原样读取这是多光谱推理脚本里最容易漏的一处from ultralytics import YOLO import cv2 model YOLO(best.pt) img cv2.imread(samples/val/0001.tiff, -1) # 保留全部 10 个通道 results model(img) # 框架按 yaml 的 channels 自动预处理 results[0].show() # 可视化显示时截取前 3 波段属正常行为调优方向跑通之后的三件事给骨干加通道注意力CSP 块里的注意力模块可以对每个波段做差异化加权适合某些波段信息量明显更大的场景。模型构建 已对 C2fAttn 做了 head/hidden 通道数自动整除处理在模型 yaml 的骨干里换入该模块即可试验# 骨干 CSP 块示例把 C2f 换成带注意力的 C2fAttn - [-1, 1, C2fAttn, [128, 2]]在 TensorBoard 里看波段贡献训练日志会记录各损失分量曲线。多光谱任务重点看 box/cls 损失是否在早期就收敛、val 曲线是否与 train 同步——收敛形态能间接反映哪些波段对定位贡献最大配合关闭个别增强的对照实验可以进一步归因。预训练权重的首层替换担心从零训练太慢框架在建模阶段会按 yaml 的channels重建首层卷积见 模型构建逻辑也就是说加载yolo11n.pt后配合 10 通道 yaml输入层会被自动调整其余权重保留原预训练特征比手写nn.Conv2d(10, 16, 3, 2, 1)更省事也不用担心替换后忘记保存。速查高频问题Q: 10 通道数据集可以直接用 coco 预训练权重吗A: 可以。框架建模时按 yaml 的channels重建首层卷积其余权重原样保留无需手动改网络结构。Q: 导出的 ONNX 里通道数不对去哪查A: 查两个地方训练时加载的数据 yaml 是否写了channels以及model.yaml中保存的值。导出逻辑 以model.yaml为准。Q: 多光谱图可视化发黑是模型坏了吗A: 不是。可视化模块 显示时固定截取前 3 波段属预期行为以框坐标和指标为准。先把 nano coco8-multispectral 这条最小链路跑通再考虑放大模型、调大输入和上注意力。【免费下载链接】ultralyticsUltralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimation, object tracking项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考