Ultralytics YOLO 多光谱目标检测实战指南:10 波段 TIFF,3 步跑通训练
【免费下载链接】ultralyticsUltralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimation, object tracking项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics
Ultralytics YOLO 多光谱支持意味着,你不用再先把 N 个波段的 .tiff 硬压成 3 个通道才能喂给模型:训练、验证、推理、导出,一条命令就能跑通。本文以官方自带的 coco8-multispectral 数据集为起点,按"跑通演示 → 看懂原理 → 准备自己的数据"的顺序走完整个流程,可以直接当上手指引用。
多光谱到底解决什么问题?
RGB 三通道只覆盖 400–700nm 的可见光,超出这个范围就"看不清"了。典型的两类场景:
- 农业:健康叶片和病叶在可见光下长得几乎一样,近红外波段的反射差异却很明显;
- 遥感:雾霾、树冠遮挡下,物体颜色相近但光谱特征不同。
多光谱成像的思路很简单:把光谱切成 N 个"波段",每个波段记成一个通道,文件通常存成多页 .tiff。Ultralytics YOLO 原生吃这种数据,不用改网络架构,原有训练/推理流程原样复用。
最小可运行演示:三步训练多光谱检测模型
第一步:获取数据集
仓库里自带 ultralytics/cfg/datasets/coco8-multispectral.yaml:8 张图(4 训练 + 4 验证),每张都通过波长插值扩成了 10 通道 .tiff,整个数据集只有 20.2MB。首次训练时自动下载,不需要手动准备。📦
第二步:确认 YAML 里的 channels 参数
多光谱兼容的开关就藏在配置文件的这一行:
channels: 10数据加载器启动时会读取这个字段来确定输入通道数(ultralytics/data/dataset.py 第 101 行,缺省按 3 处理)。自己写数据集配置时,忘写这行框架仍会把数据当普通 RGB 处理——这是第一个容易踩的坑。
第三步:训练与验证,各一条命令
数据就位后,训练命令和常规 RGB 任务完全一样:
yolo detect train model=yolo26n.pt data=coco8-multispectral.yaml epochs=100 imgsz=640Python 调用也照旧:
from ultralytics import YOLO model = YOLO("yolo26n.pt") model.train(data="coco8-multispectral.yaml", epochs=100, imgsz=640) model.val(data="coco8-multispectral.yaml")🎯 10 通道的 .tiff 输入不需要任何额外参数,跑一遍看到损失曲线正常下降,就说明链路通了。
源码里为多光谱开了哪些分支?
演示跑通后回头看原理,整条链路其实只有几处"按通道数判断"的分支:
- 数据加载:ultralytics/data/dataset.py 从 YAML 读
channels并传给数据集,首个卷积层的输入通道随之自适应,网络结构不用动。 - Letterbox 填充:ultralytics/data/augment.py 第 1804 行给多光谱单独写了分支——
cv2.copyMakeBorder只支持 3 通道填充值,这里改用np.full构造任意通道数的填充画布,保证增强过程中波段数不被破坏。 - 可视化:ultralytics/utils/plotting.py 第 313 行判断
im.shape[2] > 3后只取前 3 个通道出预览图,画框显示永远不会因为通道数报错。 - 全流程验证:tests/test_python.py 的
test_multichannel用例把 train → val → predict(直接传 10 通道 numpy 数组作输入)→ onnx 导出全部跑了一遍,可作为你自查的模板。
🔍 一句话总结:多光谱不是独立的模式,而是现有各环节各加了一个分支判断。
没有多光谱数据?一行命令把 RGB 数据集转过去
ultralytics/data/converter.py 第 727 行的convert_to_multispectral可以把单张 RGB 图或整个目录,在 450–700nm 范围内线性插值成 10 个均匀波段(区间外做线性外推),输出多波段 .tiff,适合做管线验证和预训练:
from ultralytics.data.converter import convert_to_multispectral convert_to_multispectral("path/to/coco8", n_channels=10) # 支持目录或单张图片这里要提醒一句:它生成的是模拟多光谱,光谱信息本质上还是从 RGB 来的,验证流程没问题,但真实业务场景要拿多光谱相机实采的数据训练。
准备自己的多波段 TIFF:格式三要素
接入自采数据集前,先对照检查这三点:
- 文件扩展名:
.tif或.tiff,一页对应一个波段; - 通道顺序:按
(channel, height, width)存储,dtype 为uint8; - 读写方式:用
cv2.imwritemulti写入、cv2.imreadmulti读取。
官方文档里准备数据就是这么写的:
import cv2 import numpy as np image = np.ones((10, 640, 640), dtype=np.uint8) # CHW 顺序 cv2.imwritemulti("example.tiff", image)然后别忘了在你的数据集 yaml 里写上对应的channels(换成你的真实波段数)。
避坑清单:四个高频问题
Q:为什么results[0].show()显示的不是全部波段?显示环节只取前 3 个通道(plotting.py 第 313 行),这是刻意的降维预览。要拿完整波段,从results[0].orig_img取原始数组:
spectral = results[0].orig_img # shape: (H, W, 10) band3 = spectral[..., 3] # 取任意一个波段做分析Q:mosaic、letterbox 这些增强对多光谱数据安全吗?安全。letterbox 有专用分支(augment.py 第 1804 行),测试用例也是带着cache="disk"跑完全流程的。
Q:单通道灰度 TIFF 也支持吗?支持。绘图侧有灰度专门处理(plotting.py 第 309 行),测试套件里灰度和多光谱是两个参数化用例。
Q:OBB(旋转框检测)能做多光谱吗?可以。仓库还内置了 ultralytics/cfg/datasets/dota8-multispectral.yaml,换 OBB 模型后流程与本文一致。
下一步可以做什么
- 先用 coco8-multispectral / dota8-multispectral 这类小数据集把管线验通,再切换到实采数据;
- 训练完成后直接
model.export(format="onnx"),多光谱模型同样可以导出部署; - 数据集字段、参数细节可参考仓库内 docs/en/datasets/detect/coco8-multispectral.md,里面还附有数据集生成方式(波长分配与插值规则)的说明。
【免费下载链接】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),仅供参考