保姆级教程:用B导的FasterRCNN源码,从YOLO格式数据集开始训练(附避坑记录)

张开发
2026/5/4 7:25:08 15 分钟阅读
保姆级教程:用B导的FasterRCNN源码,从YOLO格式数据集开始训练(附避坑记录)
从YOLO到Faster R-CNN手把手实现格式转换与模型训练全流程当你手头已经积累了大量YOLO格式标注的数据集却想尝试Faster R-CNN这类两阶段检测器的强大性能时格式转换往往成为第一道门槛。不同于常见的通用教程本文将聚焦一个具体场景如何在不破坏原有数据划分的前提下将YOLO格式数据集转换为Faster R-CNN可用的VOC格式并完整走通训练流程。1. 理解YOLO与VOC格式的本质差异在开始转换前我们需要清楚两种格式的核心区别。YOLO格式通常包含每个图像对应一个.txt标注文件每行格式为class_id x_center y_center width height归一化坐标类别ID从0开始连续编号而VOC格式则包含每个图像对应一个XML文件使用绝对像素坐标表示边界框包含图像尺寸、通道数等元信息采用文件夹结构组织训练集/验证集关键差异对比表特性YOLO格式VOC格式坐标表示归一化(0-1)绝对像素值标注存储每图一个.txt每图一个.xml类别表示数字ID字符串名称组织结构扁平目录分层目录附加信息仅边界框包含图像元数据2. 保留原始划分的YOLO转VOC实操假设你的数据集结构如下yolo_dataset/ ├── images/ │ ├── train/ │ │ ├── img1.jpg │ │ └── ... │ └── val/ │ ├── img100.jpg │ └── ... └── labels/ ├── train/ │ ├── img1.txt │ └── ... └── val/ ├── img100.txt └── ...2.1 转换脚本核心逻辑使用Python实现转换时需要特别注意坐标反归一化计算图像尺寸读取保留原始目录结构import os import xml.etree.ElementTree as ET from PIL import Image def yolo_to_voc(yolo_root, voc_root, class_names): # 创建VOC目录结构 os.makedirs(os.path.join(voc_root, Annotations), exist_okTrue) os.makedirs(os.path.join(voc_root, JPEGImages), exist_okTrue) for split in [train, val]: img_dir os.path.join(yolo_root, images, split) label_dir os.path.join(yolo_root, labels, split) for img_file in os.listdir(img_dir): if not img_file.endswith((.jpg, .png)): continue # 读取图像尺寸 img_path os.path.join(img_dir, img_file) img Image.open(img_path) width, height img.size # 创建XML文件 xml_file os.path.splitext(img_file)[0] .xml xml_path os.path.join(voc_root, Annotations, xml_file) root ET.Element(annotation) ET.SubElement(root, filename).text img_file size ET.SubElement(root, size) ET.SubElement(size, width).text str(width) ET.SubElement(size, height).text str(height) ET.SubElement(size, depth).text 3 if img.mode RGB else 1 # 处理标注文件 label_file os.path.join(label_dir, os.path.splitext(img_file)[0] .txt) if os.path.exists(label_file): with open(label_file, r) as f: for line in f: class_id, xc, yc, w, h map(float, line.strip().split()) # 反归一化 xmin (xc - w/2) * width ymin (yc - h/2) * height xmax (xc w/2) * width ymax (yc h/2) * height obj ET.SubElement(root, object) ET.SubElement(obj, name).text class_names[int(class_id)] ET.SubElement(obj, pose).text Unspecified ET.SubElement(obj, truncated).text 0 ET.SubElement(obj, difficult).text 0 bbox ET.SubElement(obj, bndbox) ET.SubElement(bbox, xmin).text str(int(xmin)) ET.SubElement(bbox, ymin).text str(int(ymin)) ET.SubElement(bbox, xmax).text str(int(xmax)) ET.SubElement(bbox, ymax).text str(int(ymax)) tree ET.ElementTree(root) tree.write(xml_path) # 拷贝图像到JPEGImages os.symlink(img_path, os.path.join(voc_root, JPEGImages, img_file))提示如果数据集很大建议使用硬链接而非拷贝来节省空间Linux/Mac用os.link()Windows用ctypes.windll.kernel32.CreateHardLinkW2.2 处理已划分的数据集转换完成后需要生成Faster R-CNN需要的索引文件。对于已划分的数据集创建ImageSets/Main目录直接使用原始划分生成train.txt和val.txt# 生成train.txt find yolo_dataset/images/train -name *.jpg | sed s/.*\///; s/\.jpg// voc_dataset/ImageSets/Main/train.txt # 生成val.txt find yolo_dataset/images/val -name *.jpg | sed s/.*\///; s/\.jpg// voc_dataset/ImageSets/Main/val.txt3. Faster R-CNN环境配置避坑指南3.1 创建隔离环境conda create -n fasterrcnn python3.8 -y conda activate fasterrcnn3.2 PyTorch版本选择不同CUDA版本对应的安装命令CUDA版本安装命令11.1pip install torch1.9.1cu111 torchvision0.10.1cu11110.2pip install torch1.9.1cu102 torchvision0.10.1cu102CPUpip install torch1.9.1cpu torchvision0.10.1cpu注意务必检查torch.cuda.is_available()返回True否则后续训练会异常缓慢3.3 依赖包安装常见问题执行pip install -r requirements.txt时可能遇到pycocotools安装失败# Linux解决方案 sudo apt-get install python3-dev pip install githttps://github.com/philferriere/cocoapi.git#eggpycocotoolssubdirectoryPythonAPI # Windows解决方案 pip install pycocotools-windows库版本冲突 修改requirements.txt中的numpy1.18.0和matplotlib3.2.0为宽松版本要求4. 训练配置与参数调优4.1 关键配置文件修改在train.py中需要调整# 类别文件路径 classes_path model_data/my_classes.txt # 预训练权重路径 model_path model_data/voc_weights_resnet.pth # 批大小设置 Freeze_batch_size 8 UnFreeze_batch_size 4 # 数据路径 train_annotation_path 2007_train.txt val_annotation_path 2007_val.txt4.2 训练策略建议冻结训练阶段初始学习率1e-4Epochs50仅训练RPN和分类头解冻训练阶段学习率1e-5Epochs100微调所有层实际项目中当验证集mAP连续3个epoch不提升时可提前终止训练5. 预测与结果可视化修改predict.py关键参数class FRCNN(object): def __init__(self): self.classes_path model_data/my_classes.txt self.model_path logs/ep100-loss0.025-val_loss0.043.pth self.confidence 0.5 # 置信度阈值 self.nms_iou 0.3 # NMS阈值批量预测文件夹示例python predict.py --input_dir test_images --output_dir results --save_txt可视化效果对比YOLO格式直接训练结果左转换后Faster R-CNN训练结果右在实际测试中Faster R-CNN对小目标和密集场景的检测效果通常更优但推理速度较慢。根据项目需求可以在精度和速度间做出权衡。

更多文章