1. FLIR_ADAS_v2数据集与YOLO格式简介FLIR_ADAS_v2是FLIR公司推出的热成像与可见光双模态数据集包含超过10,000组同步采集的热成像和RGB图像。这个数据集特别适合用于开发全天候目标检测系统因为热成像在低光照、雾霾等复杂环境下依然能保持稳定的检测性能。我在实际项目中发现很多团队希望将这个数据集转换为YOLO格式来训练自己的模型但过程中会遇到各种坑。YOLO格式是当前目标检测领域最流行的标注格式之一它使用简单的文本文件存储标注信息每个物体用一行表示包含类别索引和归一化后的边界框坐标。相比COCO或PASCAL VOC格式YOLO格式更轻量训练时解析速度更快。我在处理FLIR数据集时发现直接使用官方提供的COCO格式标注会面临两个主要问题一是热成像和RGB图像的类别不完全一致二是需要处理坐标系的转换。2. 数据集下载与预处理2.1 获取FLIR_ADAS_v2数据集官方数据集下载需要注册FLIR开发者账号下载链接通常包含三个主要部分images_thermal_train/val热成像训练集和验证集images_rgb_train/val可见光训练集和验证集coco.jsonCOCO格式的标注文件下载后建议保持原始目录结构不变我习惯在项目根目录下创建这样的文件夹结构FLIR_ADAS_v2/ ├── images_thermal_train ├── images_thermal_val ├── images_rgb_train ├── images_rgb_val └── annotations2.2 理解数据集特性FLIR_ADAS_v2有几个关键特性需要注意热成像和RGB图像的类别不完全相同热成像多了dog和deer两个类别图像分辨率统一为640×512标注文件中bbox坐标已经是针对热成像尺寸的直接用于RGB图像需要缩放我在第一次使用时忽略了第三个特性导致RGB图像上的检测框全部错位。后来发现需要根据两种图像的尺寸比例进行坐标转换具体方法会在后续章节详细说明。3. COCO JSON到PASCAL XML的转换3.1 转换工具准备我们需要先将COCO格式的json文件转换为PASCAL VOC格式的xml文件。这个中间步骤看起来多余但实际上能简化后续处理。我推荐使用修改版的pycocotools库它已经包含在以下代码中import os import json from pycocotools.coco import COCO def coco2voc(coco_json, output_dir): os.makedirs(output_dir, exist_okTrue) coco COCO(coco_json) for img_id in coco.getImgIds(): img_info coco.loadImgs(img_id)[0] ann_ids coco.getAnnIds(imgIdsimg_id) anns coco.loadAnns(ann_ids) xml_content [] xml_content.append(annotation) xml_content.append(ffilename{img_info[file_name]}/filename) xml_content.append(size) xml_content.append(fwidth{img_info[width]}/width) xml_content.append(fheight{img_info[height]}/height) xml_content.append(/size) for ann in anns: bbox ann[bbox] cat coco.loadCats(ann[category_id])[0] xml_content.append(object) xml_content.append(fname{cat[name]}/name) xml_content.append(bndbox) xml_content.append(fxmin{int(bbox[0])}/xmin) xml_content.append(fymin{int(bbox[1])}/ymin) xml_content.append(fxmax{int(bbox[0]bbox[2])}/xmax) xml_content.append(fymax{int(bbox[1]bbox[3])}/ymax) xml_content.append(/bndbox) xml_content.append(/object) xml_content.append(/annotation) with open(f{output_dir}/{img_id}.xml, w) as f: f.write(\n.join(xml_content))3.2 处理类别差异问题热成像和RGB图像的类别差异需要特别注意。在转换时我建议统一使用热成像的类别体系包含dog和deer这样训练出的模型能同时处理两种模态。如果确实不需要这两个类别可以在转换时过滤掉# 在coco2voc函数中添加过滤逻辑 if cat[name] in [dog, deer]: continue4. XML到YOLO TXT的转换4.1 坐标归一化处理YOLO格式要求坐标是归一化后的值0-1之间且是中心点坐标和宽高。转换时需要特别注意def xml2yolo(xml_file, class_list): tree ET.parse(xml_file) root tree.getroot() size root.find(size) width int(size.find(width).text) height int(size.find(height).text) yolo_lines [] for obj in root.findall(object): cls obj.find(name).text if cls not in class_list: continue cls_id class_list.index(cls) bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) x_center (xmin xmax) / 2 / width y_center (ymin ymax) / 2 / height w (xmax - xmin) / width h (ymax - ymin) / height yolo_lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) return yolo_lines4.2 处理RGB图像的特殊情况对于RGB图像由于分辨率不同通常是1920×1080需要先将标注坐标从热成像尺寸640×512缩放到RGB图像尺寸# 在xml2yolo函数中添加缩放逻辑 if is_rgb: # 如果是处理RGB图像 width_scale rgb_width / thermal_width height_scale rgb_height / thermal_height xmin int(xmin * width_scale) xmax int(xmax * width_scale) ymin int(ymin * height_scale) ymax int(ymax * height_scale) width rgb_width height rgb_height5. 构建YOLO格式数据集5.1 目录结构设计标准的YOLO数据集目录结构如下yolo_flir/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/我建议将热成像和RGB图像分开存储便于后续的多模态训练yolo_flir_multimodal/ ├── thermal/ │ ├── images/ │ └── labels/ └── rgb/ ├── images/ └── labels/5.2 创建数据集配置文件YOLO需要一个描述数据集的yaml文件内容大致如下# flir_thermal.yaml train: ../yolo_flir/thermal/images/train val: ../yolo_flir/thermal/images/val nc: 16 names: [person,bike,car,motor,bus,train,truck,light, hydrant,sign,dog,deer,skateboard,stroller, scooter,other vehicle]如果是多模态训练可以创建组合配置文件# flir_multimodal.yaml thermal_train: ../yolo_flir_multimodal/thermal/images/train thermal_val: ../yolo_flir_multimodal/thermal/images/val rgb_train: ../yolo_flir_multimodal/rgb/images/train rgb_val: ../yolo_flir_multimodal/rgb/images/val nc: 16 names: [...] # 同上6. 验证转换结果6.1 可视化检查转换完成后强烈建议可视化检查标注是否正确。我写了一个简单的检查脚本import cv2 import random def visualize_yolo(img_path, label_path, class_names): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path) as f: for line in f: cls, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw/2) * w) y1 int((yc - bh/2) * h) x2 int((xc bw/2) * w) y2 int((yc bh/2) * h) color (random.randint(0,255), random.randint(0,255), random.randint(0,255)) cv2.rectangle(img, (x1,y1), (x2,y2), color, 2) cv2.putText(img, class_names[int(cls)], (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2) cv2.imshow(Preview, img) cv2.waitKey(0)6.2 常见问题排查在实际项目中我遇到过几个典型问题标注框偏移通常是忘记处理RGB图像的尺寸缩放导致的类别索引错误检查class_names列表是否与yaml文件一致漏标问题确保转换时没有跳过任何有效标注7. 高级技巧与优化建议7.1 多模态数据增强同时使用热成像和RGB图像时可以尝试特殊的数据增强策略对两种模态应用相同的空间变换翻转、旋转等分别调整热成像的温度范围和RGB图像的色彩平衡使用MixUp或Mosaic增强时保持两种模态的同步7.2 模型训练技巧基于FLIR_ADAS_v2训练YOLO模型时我发现这些技巧很有效热成像通道处理将单通道热成像复制为三通道或使用特殊的预处理损失函数调整由于数据集存在类别不平衡建议使用focal loss输入尺寸选择保持640×512的原始比例或调整为标准的640×6407.3 部署优化在实际部署热成像检测系统时这些经验可能帮到你量化训练直接使用FP16或INT8量化训练提升推理速度硬件加速利用TensorRT等工具优化YOLO模型温度阈值处理在检测后增加温度过滤减少误报