Ultralytics YOLO 多光谱目标检测实战指南:10 波段 TIFF,3 步跑通训练
2026/9/15 13:07:18 网站建设 项目流程

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=640

Python 调用也照旧:

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:格式三要素

接入自采数据集前,先对照检查这三点:

  1. 文件扩展名.tif.tiff,一页对应一个波段;
  2. 通道顺序:按(channel, height, width)存储,dtype 为uint8
  3. 读写方式:用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),仅供参考

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

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

立即咨询