yolov8 多通道图片训练-已完成

本文详细描述了如何将Ultralytics的yolov8模型从训练RGB图像改为处理8通道图像,包括修改数据读取、配置文件、数据增强模块和相关错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最新:修改过程详细描述及完整代码更新于https://github.com/satori-hcy/yolov8_8ch

-------------------------------------------------------以下为原始草稿内容-----------------------------------

yolov8源码为训练三通道的rgb图像,本文记录修改yolov8为训练8通道的图像数据。

参考网址:https://github.com/ultralytics/ultralytics/issues/3432

总体思路:1.解决数据读取问题;2.修改网络结构的配置文件;3.解决数据增强相关错误;

1.在ultralytics/data/base.py 文件中的

def load_image(self, i, rect_mode=True)函数中修改,使im是读取到的多通道图片。

2.找到模型使用的yaml文件,添加输入通道参数:ch。我使用的是

model = YOLO("yolov8n.yaml")语句来创建了模型所以对应的是ultralytics/cfg/models/v8/yolov8.yaml文件

添加参数ch:8  (这里要几个通道就写几)

在数据集.yaml(类似于coco.yaml)中也要加上ch: 8

default.yaml 中加上ch:8

3.这时候开始训练,就会各种报错,这些报错应该是数据增强模块的代码。错误提示中会有“RandomHSV”,

在ultralytics/data/augment.py 

方法一:将RandomHSV 类里的__call__里的内容代码注释掉了

方法二:将使用RandomHSV的地方注释掉了def v8_transforms函数定义中,大约800行附近注释掉

“transformer”等字样。这是因为yolov8源码中的数据增强大多是处理三通道或一通道的,所以开始报错。

这部分报错代码集中在ultralytics/data/augment.py文件中,可以先将

Class Albumentations中的各种增强选项先注释掉

4.ultralytics/utils/plotting.py 文件中报错

class Annotator是关于在图片上画出标注的类,因为我的数据是八通道,会出错,所以在 __init__函数添加下面语句

5.  报错img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT,
cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\copy.cpp:1074: error: (-215:Assertion failed) value[0] == value[1] && value[0] == value[2] && value[0] == value[3] in function 'cv::copyMakeBorder'

6.train()的所有epoch完成时会有一个eval()评估步骤,这里也要改,这里列出两种修改方法,任选其一。

(1)简单的:将ultralytics/engine/validator.py中第155行的3换成你的通道数。

(2)有点麻烦的一种:步骤6的另一种修改方式是将ultralytics/engine/validator.py中第153行附近的3换成变量,如下图

同时要在ultralytics/cfg/default.yaml 中添加ch: 8 

如果不改这儿,会在过程中(某一步)组织self.args中丢失ch参数,导致出错。

6. ultralytics/utils/plotting.py  400行左右

#sxx mosaic的通道数要与im相同
# Build Image
mosaic = np.full((int(ns * h), int(ns * w), images.shape[1]), 255, dtype=np.uint8)

### 调整 YOLO 模型中的通道数配置 YOLOv12 的模型配置文件位于 `ultralytics/cfg/models/v12` 中,其中包含了不同规模的模型(如 n、s、m、l 和 x)。这些模型通过 YAML 文件定义其架构和超参数。如果需要调整通道数以解决不匹配的问题,则可以通过修改 YAML 配置文件实现。 #### 修改通道数的方法 在 YOLOv12 的 YAML 配置文件中,通常会有一个名为 `channels` 或类似的字段用于指定输入图像的通道数。默认情况下,该值设置为 3,表示 RGB 图像[^1]。以下是具体操作: 1. **定位到对应的 YAML 文件** 找到目标模型的 YAML 文件路径,例如 `yolov12.yaml` 或其他变体版本(如 `yolov12n.yaml`, `yolov12s.yaml` 等)。 2. **编辑 `channels` 参数** 在 YAML 文件中找到如下部分并进行修改: ```yaml nc: 80 # 类别数量 channels: 3 # 输入通道数,默认为RGB三通道 ``` 如果数据集中的图片不是标准的 RGB 格式(比如灰度图),则可以将此值更改为对应的实际通道数。例如,对于单通道灰度图像,应将其设为 1: ```yaml channels: 1 ``` 3. **验证网络层的一致性** 当更改输入通道数时,需确保后续卷积层的第一层权重维度也与之匹配。这一步骤由框架自动完成,在训练阶段加载预训练权重之前,框架会对权重形状进行校验。如果不一致,可以选择重新初始化或微调相关层的权重。 4. **更新数据管道** 数据增强模块也需要同步适配新的通道数设定。例如,当处理灰度图像时,可能需要禁用某些仅适用于彩色图像的数据增广技术(如颜色抖动等)。 5. **测试新配置** 使用调试模式运行少量样本以确认整个流程无误,并观察是否有任何异常提示关于尺寸或者格式错误的信息。 ```python import yaml # 加载YAML配置文件 with open('path/to/yolov12.yaml', 'r') as f: config = yaml.safe_load(f) # 修改通道数至所需数值 (此处假设为1, 即灰色级) config['channels'] = 1 # 将改动后的配置保存回原位置或其他地方 with open('path/to/modified_yolov12.yaml', 'w') as f: yaml.dump(config, f) ``` 以上过程能够有效帮助用户自定义 YOLO 模型的输入通道数目来适应特定应用场景下的需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值