
1. 环境准备与数据预处理第一次跑Faster R-CNN时我在环境配置上踩了不少坑。记得当时用conda创建环境后发现PyTorch版本和CUDA不兼容导致训练时显存直接爆掉。后来发现用PyTorch 1.8 CUDA 11.1的组合最稳定这里分享我的完整环境配置conda create -n fasterrcnn python3.8 conda install pytorch1.8.0 torchvision0.9.0 cudatoolkit11.1 -c pytorch pip install opencv-python pillow matplotlib numpy tqdm数据集处理是另一个容易出错的地方。以VOC格式为例目录结构应该是这样的VOCdevkit └── VOC2007 ├── Annotations # XML标注文件 ├── JPEGImages # 原始图片 ├── ImageSets │ └── Main # 训练/验证集划分文件关键的一步是用voc_annotation.py生成训练文件。我建议修改这个脚本的两个地方调整trainval_percent参数控制训练验证集比例检查类别名称是否与标注文件一致# voc_annotation.py关键修改点 classes [cat, dog] # 必须与XML中类别完全一致 trainval_percent 0.9 # 90%训练验证10%测试2. 模型架构深度解析Faster R-CNN的精妙之处在于它的两阶段设计。我画了个简化版数据流图帮助理解输入图片 → Backbone(ResNet) → 特征图 ↘ RPN → 候选区域 → RoI Pooling → 分类/回归Backbone选择实测ResNet50比VGG16的mAP高5-8%但训练速度慢20%。如果显存小于6GB建议用VGG16。修改backbone只需改一行代码# frcnn.py中修改 self.backbone resnet50 # 或vgg16RPN工作原理这个模块就像智能滑动窗口。它在特征图上每个点生成9个锚点3种尺度×3种长宽比我的实验显示对于512×512输入RPN会生成约20k个初始锚点经过NMS后保留约2k个优质提议。3. 训练技巧与参数调优第一次训练时loss不下降我总结了几个关键点学习率策略采用warmup阶梯下降# trainer.py中的优化器配置 optimizer torch.optim.SGD(params, lr1e-3, momentum0.9) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size5, gamma0.1)正负样本平衡RPN阶段保持1:3的正负样本比例# 在model.py中 rpn_sigma 3.0 # RPN损失权重 class_sigma 1.0 # 分类损失权重数据增强推荐使用这些组合随机水平翻转概率0.5颜色抖动亮度0.2对比度0.2避免旋转/缩放会干扰bbox坐标我在COCO数据集上的实验表明合理的数据增强能提升3-5%的mAP。4. 自定义数据集实战最近用Faster R-CNN做工业缺陷检测时遇到了小目标检测难题。我的解决方案是修改锚点尺寸默认的[128,256,512]对于小目标太大# 修改frcnn.py中的anchors_size self.anchors_size [32, 64, 128]调整NMS阈值降低iou阈值保留更多候选框# predict.py中修改 nms_iou 0.3 # 原版0.7使用多尺度训练在DataLoader中动态resize# 在utils.py的Dataset类中添加 if self.train: scale random.choice([400, 500, 600]) image cv2.resize(image, (scale, scale))训练自己的数据集时常见错误是忘记同步修改三个地方的类别voc_annotation.py中的classesmodel_data/voc_classes.txttrain.py中的NUM_CLASSES5. 模型评估与性能优化评估时发现mAP不高先检查这几点验证数据泄漏确保测试集没有参与训练分析混淆矩阵某些类别准确率低可能需要更多样本可视化失败案例用这个代码查看问题所在# predict.py中添加调试代码 def display(img, boxes, classes): for i, box in enumerate(boxes): cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), (0,255,0), 2) cv2.putText(img, classes[i], (box[0], box[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 1) cv2.imshow(debug, img) cv2.waitKey(0)速度优化技巧启用cudnn benchmark在train.py开头添加torch.backends.cudnn.benchmark True使用混合精度训练减少显存占用scaler torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): losses model(images, targets) scaler.scale(losses).backward() scaler.step(optimizer)在RTX 3060上经过优化后推理速度从15FPS提升到28FPS。如果还需要更快可以考虑将RoI Pooling换成RoI Align精度提升但稍慢使用更轻量级的backbone如MobileNetV3量化模型到FP16最后提醒大家训练时多使用TensorBoard监控指标变化。我在实际项目中发现RPN的loss曲线如果能稳定在0.2以下最终检测效果通常不会太差。