YOLOFuse训练自己的数据?数据结构配置详细说明
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
重要规则:
images/和imagesIR/必须在同一级目录- RGB和红外图像必须同名(如都是
001.jpg) - 标注文件也使用相同的文件名(
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 标注工具推荐
如果你还没有标注数据,可以考虑这些工具:
- LabelImg:经典工具,支持YOLO格式
- CVAT:功能强大,支持团队协作
- Roboflow:在线平台,提供标注服务
- 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 训练技巧与调优
-
学习率调整:
python train_dual.py --data my_custom.yaml --lr0 0.01 --lrf 0.01--lr0:初始学习率--lrf:最终学习率因子(lr0 * lrf)
-
数据增强:
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:上下/左右翻转
-
早停机制:
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错误:
-
减小批次大小:
python train_dual.py --batch 8 # 从16减小到8 -
减小图像尺寸:
python train_dual.py --imgsz 512 # 从640减小到512 -
使用梯度累积:
python train_dual.py --batch 4 --accumulate 4 # 等效批次大小16
7.2 训练效果不好?
如果模型表现不佳:
-
检查数据质量:
- 标注是否准确?
- RGB和红外图像是否对齐?
- 类别是否平衡?
-
调整训练参数:
# 增加训练轮数 python train_dual.py --epochs 200 # 调整学习率 python train_dual.py --lr0 0.001 # 使用预训练权重 python train_dual.py --weights yolov8n.pt -
尝试不同融合策略:
- 中期特征融合(默认):参数量小,性价比高
- 早期特征融合:对小目标更敏感
- 决策级融合:鲁棒性更强
7.3 只有单模态数据?
如果你只有RGB图像,没有对应的红外图像:
-
临时解决方案(仅用于测试):
# 复制RGB图像到imagesIR目录 cp -r datasets/my_data/images/* datasets/my_data/imagesIR/这样能跑通代码,但没有实际融合效果。
-
长期方案:
- 考虑使用原版YOLOv8
- 收集或生成红外数据
- 使用数据增强模拟红外效果
8. 总结
训练自己的YOLOFuse模型其实并不复杂,关键是要把数据准备好。让我帮你回顾一下重点:
- 数据结构要规范:RGB和红外图像必须同名、同目录结构
- 标注只需一次:基于RGB图像标注,系统会自动复用
- 配置文件要正确:指向你的数据集路径,设置正确的类别数
- 训练参数可调整:根据显存和需求调整批次大小、学习率等
- 结果要验证:训练后一定要用验证集评估,可视化检测效果
记住,数据质量决定模型上限。花时间准备好高质量、配对正确的数据,比调整任何超参数都重要。现在你已经掌握了从数据准备到训练验证的完整流程,可以开始动手训练你自己的多模态检测模型了。
遇到问题不要慌,先检查数据配对,再看配置文件,最后调整训练参数。大多数问题都能在这三个环节找到答案。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐


所有评论(0)