YOLOFuse训练自己的数据?数据结构配置详细说明

你是不是也想用YOLOFusion这个强大的多模态目标检测框架,但不知道如何准备自己的数据?别担心,今天我就带你一步步搞定数据准备和配置,让你轻松训练自己的专属模型。

YOLOFuse基于Ultralytics YOLO框架构建,专门处理RGB和红外(IR)图像的双流融合检测。简单来说,它能让你的模型同时“看到”可见光和红外信息,在低光、烟雾等复杂环境下表现更出色。好消息是,这个社区镜像已经预装好了所有依赖环境,你不需要折腾PyTorch或CUDA,开箱即用。

1. 为什么需要双模态数据?

在开始之前,我们先搞清楚一个核心问题:为什么YOLOFuse需要成对的RGB和红外图像?

想象一下,你在夜晚开车,普通摄像头(RGB)可能看不清远处的行人,但红外摄像头能捕捉到人体的热信号。YOLOFuse就是把这两种“视觉”结合起来,让检测更可靠。所以,你需要准备的是:

  • RGB图像:普通的彩色照片,就像手机拍的那样
  • 红外图像:同一场景、同一时间拍摄的红外照片
  • 标注文件:告诉模型图像里有什么物体、在哪里

这三者必须严格对应,就像给双胞胎拍照,每对照片都要同时拍、位置一样,只是用的“相机”不同。

2. 数据准备:结构是关键

数据准备是训练成功的第一步,也是最容易出错的地方。YOLOFuse对数据结构有明确要求,我们一步步来看。

2.1 目录结构规范

你的数据集应该按照以下结构组织:

你的数据集目录/
├── images/        # 存放RGB图像
│   ├── 001.jpg
│   ├── 002.jpg
│   └── 003.jpg
├── imagesIR/      # 存放红外图像
│   ├── 001.jpg    # 必须与RGB图像同名!
│   ├── 002.jpg
│   └── 003.jpg
└── labels/        # 存放标注文件
    ├── 001.txt
    ├── 002.txt
    └── 003.txt

重要规则:

  1. images/和imagesIR/必须在同一级目录
  2. RGB和红外图像必须同名(如都是001.jpg)
  3. 标注文件也使用相同的文件名(001.txt)

2.2 文件命名建议

为了避免混乱,我建议使用统一的命名规则:

# 好的命名方式
rgb_001.jpg    ir_001.jpg    # 清晰区分
001_rgb.jpg    001_ir.jpg    # 前缀一致
scene1_day.jpg scene1_ir.jpg # 描述性命名

# 避免的命名方式
image1.jpg     IR_image1.jpg  # 名称不一致
001.jpg        thermal_001.jpg # 前缀不同

最简单的方法:用数字序列命名,比如0001.jpg、0002.jpg,这样对应关系一目了然。

2.3 图像配对检查

上传数据前,一定要检查配对是否正确。这里有个简单的Python脚本帮你验证:

import os
from pathlib import Path

def check_data_pairs(rgb_dir, ir_dir, label_dir):
    """检查RGB、红外、标注文件是否配对正确"""
    
    rgb_files = set(f.stem for f in Path(rgb_dir).glob("*.jpg"))
    ir_files = set(f.stem for f in Path(ir_dir).glob("*.jpg"))
    label_files = set(f.stem for f in Path(label_dir).glob("*.txt"))
    
    # 检查文件数量
    print(f"RGB图像数量: {len(rgb_files)}")
    print(f"红外图像数量: {len(ir_files)}")
    print(f"标注文件数量: {len(label_files)}")
    
    # 检查配对
    all_files = rgb_files | ir_files | label_files
    missing_pairs = []
    
    for file_stem in all_files:
        has_rgb = file_stem in rgb_files
        has_ir = file_stem in ir_files
        has_label = file_stem in label_files
        
        if not (has_rgb and has_ir and has_label):
            missing_pairs.append((file_stem, has_rgb, has_ir, has_label))
    
    if missing_pairs:
        print("\n⚠️ 发现不完整的配对:")
        for stem, rgb, ir, label in missing_pairs[:5]:  # 只显示前5个
            print(f"  {stem}: RGB={rgb}, IR={ir}, Label={label}")
        if len(missing_pairs) > 5:
            print(f"  ... 还有{len(missing_pairs)-5}个问题")
    else:
        print("✅ 所有文件配对正确!")
    
    return len(missing_pairs) == 0

# 使用示例
rgb_path = "/root/YOLOFuse/datasets/your_data/images"
ir_path = "/root/YOLOFuse/datasets/your_data/imagesIR"
label_path = "/root/YOLOFuse/datasets/your_data/labels"

is_valid = check_data_pairs(rgb_path, ir_path, label_path)

运行这个脚本,它会告诉你哪些文件缺失了配对,帮你快速定位问题。

3. 标注文件格式详解

YOLOFuse使用标准的YOLO标注格式,但这里有个关键点:你只需要基于RGB图像标注一次。

3.1 YOLO标注格式

每个标注文件(.txt)包含多行,每行代表一个物体,格式如下:

<class_id> <center_x> <center_y> <width> <height>
  • class_id:类别ID(从0开始)
  • center_x, center_y:边界框中心点的归一化坐标(0-1之间)
  • width, height:边界框的归一化宽高(0-1之间)

归一化计算:

# 假设图像尺寸为 640x480,边界框坐标为 [x_min=100, y_min=50, x_max=300, y_max=200]
center_x = (100 + 300) / 2 / 640  # = 0.3125
center_y = (50 + 200) / 2 / 480   # = 0.2604
width = (300 - 100) / 640         # = 0.3125
height = (200 - 50) / 480         # = 0.3125

# 最终标注行:0 0.3125 0.2604 0.3125 0.3125

3.2 类别文件配置

你还需要一个classes.txt文件,定义类别名称:

person
car
bicycle
dog
cat

这个文件应该放在数据集目录下,训练时会自动读取。

3.3 标注工具推荐

如果你还没有标注数据,可以考虑这些工具:

  1. LabelImg:经典工具,支持YOLO格式
  2. CVAT:功能强大,支持团队协作
  3. Roboflow:在线平台,提供标注服务
  4. Make Sense:免费在线工具,简单易用

标注时记住:在RGB图像上标注,系统会自动将标注应用到对应的红外图像。

4. 配置文件修改实战

数据准备好后,需要修改配置文件告诉YOLOFuse去哪里找数据。

4.1 找到配置文件

在YOLOFuse项目中,配置文件通常位于:

/root/YOLOFuse/data/  # 数据配置文件目录
/root/YOLOFuse/cfg/   # 模型配置文件目录

你可以用以下命令查找:

cd /root/YOLOFuse
find . -name "*.yaml" -o -name "*.yml" | grep -E "(data|config)"

4.2 创建自定义配置文件

我建议不要直接修改默认配置文件,而是创建自己的配置。复制一个现有的配置文件:

cp /root/YOLOFuse/data/coco.yaml /root/YOLOFuse/data/my_custom.yaml

然后编辑my_custom.yaml:

# 自定义数据集配置
path: /root/YOLOFuse/datasets/my_custom_data  # 数据集根目录
train: images/train  # 训练集图像路径(相对path)
val: images/val      # 验证集图像路径

# 类别信息
nc: 5  # 类别数量,根据你的数据修改
names: ['person', 'car', 'bicycle', 'dog', 'cat']  # 类别名称

# 红外图像配置(关键!)
ir_suffix: 'IR'  # 红外图像目录后缀,系统会自动查找imagesIR目录

4.3 数据集划分

通常你需要将数据分为训练集、验证集和测试集。建议比例是70%训练、20%验证、10%测试。你可以手动创建目录:

my_custom_data/
├── images/
│   ├── train/      # 训练集RGB图像
│   └── val/        # 验证集RGB图像
├── imagesIR/
│   ├── train/      # 训练集红外图像
│   └── val/        # 验证集红外图像
└── labels/
    ├── train/      # 训练集标注
    └── val/        # 验证集标注

或者用Python脚本自动划分:

import os
import shutil
import random
from pathlib import Path

def split_dataset(data_dir, train_ratio=0.7, val_ratio=0.2):
    """自动划分数据集"""
    
    # 创建目录
    splits = ['train', 'val', 'test']
    for split in splits:
        for subdir in ['images', 'imagesIR', 'labels']:
            os.makedirs(f"{data_dir}/{subdir}/{split}", exist_ok=True)
    
    # 获取所有文件(基于RGB图像)
    rgb_files = list(Path(f"{data_dir}/images").glob("*.jpg"))
    random.shuffle(rgb_files)
    
    # 计算划分点
    n_total = len(rgb_files)
    n_train = int(n_total * train_ratio)
    n_val = int(n_total * val_ratio)
    
    # 划分文件
    train_files = rgb_files[:n_train]
    val_files = rgb_files[n_train:n_train+n_val]
    test_files = rgb_files[n_train+n_val:]
    
    # 复制文件到对应目录
    for split, files in zip(splits, [train_files, val_files, test_files]):
        for rgb_file in files:
            stem = rgb_file.stem
            
            # RGB图像
            shutil.copy(rgb_file, f"{data_dir}/images/{split}/{rgb_file.name}")
            
            # 红外图像
            ir_file = Path(f"{data_dir}/imagesIR/{stem}.jpg")
            if ir_file.exists():
                shutil.copy(ir_file, f"{data_dir}/imagesIR/{split}/{ir_file.name}")
            
            # 标注文件
            label_file = Path(f"{data_dir}/labels/{stem}.txt")
            if label_file.exists():
                shutil.copy(label_file, f"{data_dir}/labels/{split}/{label_file.name}")
    
    print(f"数据集划分完成:训练集{n_train}张,验证集{n_val}张,测试集{len(test_files)}张")

# 使用示例
split_dataset("/root/YOLOFuse/datasets/my_custom_data")

5. 开始训练你的模型

一切准备就绪后,就可以开始训练了。

5.1 基本训练命令

使用你的自定义配置文件启动训练:

cd /root/YOLOFuse
python train_dual.py --data data/my_custom.yaml --epochs 100 --batch 16

常用参数说明:

  • --data:指定数据配置文件路径
  • --epochs:训练轮数,建议100-300
  • --batch:批次大小,根据显存调整(8、16、32等)
  • --imgsz:输入图像尺寸,默认640
  • --device:指定GPU,如--device 0或--device 0,1(多GPU)
  • --name:给这次训练起个名字,方便区分

5.2 监控训练过程

训练开始后,你可以在终端看到实时进度。训练结果会保存在:

/root/YOLOFuse/runs/fuse/train/  # 默认保存位置

这个目录下包含:

  • weights/:模型权重文件(best.pt, last.pt)
  • args.yaml:训练参数配置
  • results.csv:训练指标记录
  • confusion_matrix.png:混淆矩阵
  • train_batch*.jpg:训练批次可视化

5.3 训练技巧与调优

  1. 学习率调整:

    python train_dual.py --data my_custom.yaml --lr0 0.01 --lrf 0.01
    
    • --lr0:初始学习率
    • --lrf:最终学习率因子(lr0 * lrf)
  2. 数据增强:

    python train_dual.py --data my_custom.yaml --hsv_h 0.015 --hsv_s 0.7 --hsv_v 0.4
    
    • --hsv_h, --hsv_s, --hsv_v:HSV色彩空间增强
    • --flipud, --fliplr:上下/左右翻转
  3. 早停机制:

    python train_dual.py --data my_custom.yaml --patience 50
    
    • --patience:验证集指标不再提升时,提前停止训练

6. 验证与测试训练结果

训练完成后,需要验证模型效果。

6.1 使用验证集评估

python val_dual.py --data data/my_custom.yaml --weights runs/fuse/train/weights/best.pt

这会输出详细的评估指标:

  • mAP@0.5:IoU阈值为0.5时的平均精度
  • mAP@0.5:0.95:IoU阈值从0.5到0.95的平均精度
  • Precision:精确率
  • Recall:召回率

6.2 可视化检测结果

想看看模型在实际图像上的表现?

python infer_dual.py --source datasets/my_custom_data/images/val/ --weights runs/fuse/train/weights/best.pt

结果会保存在runs/predict/目录下,你可以看到模型对每张图像的检测效果。

6.3 性能分析工具

YOLOFuse还提供了一些有用的分析工具:

from ultralytics import YOLO

# 加载训练好的模型
model = YOLO('runs/fuse/train/weights/best.pt')

# 1. 模型信息
model.info()  # 查看模型结构、参数量

# 2. 速度测试
model.benchmark()  # 测试推理速度

# 3. 导出模型
model.export(format='onnx')  # 导出为ONNX格式,用于部署

7. 常见问题与解决方案

在实际操作中,你可能会遇到这些问题:

7.1 内存不足怎么办?

如果训练时出现CUDA out of memory错误:

  1. 减小批次大小:

    python train_dual.py --batch 8  # 从16减小到8
    
  2. 减小图像尺寸:

    python train_dual.py --imgsz 512  # 从640减小到512
    
  3. 使用梯度累积:

    python train_dual.py --batch 4 --accumulate 4  # 等效批次大小16
    

7.2 训练效果不好?

如果模型表现不佳:

  1. 检查数据质量:

    • 标注是否准确?
    • RGB和红外图像是否对齐?
    • 类别是否平衡?
  2. 调整训练参数:

    # 增加训练轮数
    python train_dual.py --epochs 200
    
    # 调整学习率
    python train_dual.py --lr0 0.001
    
    # 使用预训练权重
    python train_dual.py --weights yolov8n.pt
    
  3. 尝试不同融合策略:

    • 中期特征融合(默认):参数量小,性价比高
    • 早期特征融合:对小目标更敏感
    • 决策级融合:鲁棒性更强

7.3 只有单模态数据?

如果你只有RGB图像,没有对应的红外图像:

  1. 临时解决方案(仅用于测试):

    # 复制RGB图像到imagesIR目录
    cp -r datasets/my_data/images/* datasets/my_data/imagesIR/
    

    这样能跑通代码,但没有实际融合效果。

  2. 长期方案:

    • 考虑使用原版YOLOv8
    • 收集或生成红外数据
    • 使用数据增强模拟红外效果

8. 总结

训练自己的YOLOFuse模型其实并不复杂,关键是要把数据准备好。让我帮你回顾一下重点:

  1. 数据结构要规范:RGB和红外图像必须同名、同目录结构
  2. 标注只需一次:基于RGB图像标注,系统会自动复用
  3. 配置文件要正确:指向你的数据集路径,设置正确的类别数
  4. 训练参数可调整:根据显存和需求调整批次大小、学习率等
  5. 结果要验证:训练后一定要用验证集评估,可视化检测效果

记住,数据质量决定模型上限。花时间准备好高质量、配对正确的数据,比调整任何超参数都重要。现在你已经掌握了从数据准备到训练验证的完整流程,可以开始动手训练你自己的多模态检测模型了。

遇到问题不要慌,先检查数据配对,再看配置文件,最后调整训练参数。大多数问题都能在这三个环节找到答案。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

更多推荐