MMRotate训练遥感小目标?从DOTA数据集裁剪到模型调优的全流程实战
MMRotate遥感小目标检测实战从数据裁剪到模型调优的完整指南遥感图像中的小目标检测一直是计算机视觉领域的难点。当目标尺寸仅为几十像素甚至更小时常规检测方法往往难以奏效。本文将基于MMRotate框架分享一套针对DOTA等遥感数据集的完整解决方案涵盖数据预处理、模型选择、参数调优等关键环节。1. 遥感小目标检测的核心挑战1920x1080像素的航拍图像中一栋建筑可能只占据50x30像素的区域。这种目标与背景的极端不平衡带来了三个典型问题特征提取困难小目标在卷积过程中容易丢失细节信息正负样本失衡背景区域远多于有效目标区域定位精度不足旋转框的倾斜角度增加了回归难度以DOTA数据集为例其图像尺寸普遍在4000x4000像素以上但车辆等目标的最小外接矩形宽度可能不足15像素。直接输入原始图像会导致# 典型遥感图像尺寸与目标尺寸对比 image_size (4000, 4000) # 1600万像素 target_size (15, 8) # 120像素占比仅0.00075%2. 数据预处理智能裁剪策略2.1 分块裁剪的必要性MMRotate提供的img_split.py脚本通过滑动窗口实现大图切割其核心参数包括参数名推荐值作用说明patch_size1024输出图像块尺寸overlap200相邻块重叠区域image_ext.png输出图像格式rate_thr0.7有效区域保留阈值实际操作中建议采用重叠分块策略python tools/data/dota/split/img_split.py \ --base_json configs/split_configs/custom_train.json \ --patch_size 1024 \ --overlap 200注意overlap值应大于目标最大尺寸的1.5倍避免目标被切割2.2 标签转换与验证使用roLabelImg标注时需特别注意角度定义规则。推荐转换脚本包含以下关键步骤解析XML中的旋转框参数(cx,cy,w,h,angle)计算四个角点坐标按DOTA格式排序点集左上角开始顺时针def rotatePoint(xc, yc, xp, yp, theta): 坐标旋转转换 xoff xp - xc yoff yp - yc cosTheta math.cos(theta) sinTheta math.sin(theta) pResx cosTheta * xoff sinTheta * yoff pResy -sinTheta * xoff cosTheta * yoff return xc pResx, yc pResy验证转换结果时建议可视化检查边界框是否准确包裹目标3. 模型架构调优策略3.1 锚框(Anchor)优化配置针对小目标的锚框设置需要调整三个关键维度尺度(scale): 典型值[8,16,32]适用于常规目标小目标应改为[4,8,16]长宽比(ratio): 遥感目标常见比例[1,1.5,2,3,5]角度(angle): 建议每45°设置一个锚框共8个方向# MMRotate中的anchor生成配置 anchor_generatordict( typeRotatedAnchorGenerator, scales[4, 8, 16], ratios[1.0, 1.5, 2.0, 3.0, 5.0], strides[4, 8, 16, 32, 64], angles[0, 45, 90, 135])3.2 特征金字塔(FPN)增强在mmrotate/configs/base/models/faster_rcnn_r50_fpn.py中修改# 增加P2层获取更高分辨率特征 fpndict( in_channels[256, 512, 1024, 2048], out_channels256, start_level1, # 原为2 num_outs5) # 原为4 # ROI Align设置 roi_headdict( featmap_strides[4, 8, 16, 32]) # 对应FPN输出4. 训练参数调优实战4.1 学习率与批次大小基于裁剪后数据特点推荐采用渐进式学习率策略# 在configs/base/schedules/schedule_1x.py中修改 optimizer dict( typeSGD, lr0.01, # 基础学习率 momentum0.9, weight_decay0.0001) lr_config dict( policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[8, 11]) # 在第8和11epoch时衰减4.2 数据增强方案针对小目标的特殊增强策略train_pipeline [ dict(typeLoadImageFromFile), dict(typeLoadAnnotations, with_bboxTrue), dict(typeRResize, img_scale(1024, 1024)), dict( typeRRandomFlip, flip_ratio0.5, direction[horizontal, vertical]), dict( typePolyRandomRotate, rotate_ratio0.5, angles_range180, auto_boundFalse), dict(typeBrightnessTransform, level10), dict(typeContrastTransform, level10), dict(typeHSVAugment, hgain5, sgain5, vgain5), dict(typeNormalize, **img_norm_cfg), dict(typePad, size_divisor32), dict(typeDefaultFormatBundle), dict(typeCollect, keys[img, gt_bboxes]) ]5. 性能优化与结果分析5.1 典型评估指标对比在DOTA-v1.5测试集上的实验结果模型mAP0.5小目标召回率推理速度(FPS)R-50-FPN62.345.112.3R-101-FPN64.748.29.8R3Det68.253.67.55.2 显存优化技巧当遇到CUDA out of memory错误时可尝试以下调整减小批次大小data dict( samples_per_gpu2, # 原为4 workers_per_gpu2)使用梯度累积optimizer_config dict( typeGradientCumulativeOptimizerHook, cumulative_iters2)混合精度训练fp16 dict( loss_scale512., grad_clipdict(max_norm35, norm_type2))在实际项目中针对2000x2000像素的航拍图像经过1024x1024分块处理后使用R3Det模型训练时单个GPU的显存占用从18GB降至6GB使GTX 1080Ti等消费级显卡也能胜任训练任务。