MMDetection项目中的关键开发约定解析
前言
MMDetection作为目标检测领域的重要框架,其内部实现遵循了一系列严谨的约定。理解这些约定对于开发者自定义模型、扩展功能或进行二次开发至关重要。本文将深入解析MMDetection中的关键开发约定,帮助开发者更好地理解框架设计思想。
图像尺寸处理规范
输入与存储的尺寸顺序差异
在图像处理过程中,MMDetection 2.0版本采用了明确的尺寸顺序规范:
- 输入参数:所有图像处理pipeline的输入参数采用
(宽度, 高度)
顺序,这与OpenCV的规范保持一致 - 内部存储:经过pipeline处理后,所有shape相关字段均采用
(高度, 宽度)
顺序存储
这种设计既保证了与常用图像处理库的兼容性,又符合深度学习领域常见的矩阵表示习惯。
关键字段说明
在数据pipeline处理后,结果字典中包含以下重要shape字段:
img_shape
:处理后图像的实际尺寸ori_shape
:原始图像的尺寸pad_shape
:填充后的图像尺寸batch_input_shape
:批量输入的统一尺寸
开发者在使用自定义transform时,需要特别注意保持这种尺寸顺序的一致性。
损失函数设计规范
损失字典结构
MMDetection中模型的forward方法返回一个包含所有损失和指标的字典。这种设计具有以下特点:
- 损失项:以'loss_'为前缀的键值会被自动用于反向传播
- 评估指标:其他键值仅用于训练过程监控
# 典型示例
losses = {
'loss_cls': classification_loss, # 参与反向传播
'acc': accuracy_metric, # 仅作为指标
'loss_bbox': bbox_regression_loss # 参与反向传播
}
自定义扩展建议
如需修改默认行为,可通过重写BaseDetector.train_step()
方法实现:
- 修改损失筛选逻辑
- 添加自定义的评估指标
- 实现特殊的梯度回传策略
空proposals处理机制
两阶段检测器的特殊处理
针对Faster R-CNN等两阶段检测器,MMDetection实现了完善的空proposals处理:
- 批量级别处理:当整个batch都没有有效proposals时
- 图像级别处理:当单张图像没有有效proposals时
# 典型处理逻辑
if rois.shape[0] == 0: # 无proposals情况
return zero_results # 返回格式兼容的零结果
自定义Head实现建议
开发者在实现自定义RoIHead时应当:
- 显式检查proposals数量
- 返回与正常情况结构一致的零值结果
- 保持多阶段检测器的中间结果传递
全景分割数据规范
标签语义变更
MMDetection对全景分割数据标签处理经历了重要变更:
-
旧版本(mmdet<=2.16.0):
- 0表示VOID(无效区域)
- 前景类别从1开始
-
新版本(mmdet>=2.17.0):
- 255表示VOID
- 类别索引从0开始,与检测框类别对齐
结果格式要求
评估时全景分割预测结果必须满足:
- 尺寸与原图严格一致
- 像素值编码格式:
instance_id * INSTANCE_OFFSET + category_id
- 使用Pad transform时需正确设置seg填充值(通常为255)
最佳实践建议
- 图像处理:始终明确区分输入(width,height)和存储(height,width)的顺序
- 损失设计:保持'loss_'前缀规范,非损失指标不使用该前缀
- 边界处理:在自定义模块中完整处理空输入等边界情况
- 版本兼容:注意不同MMDetection版本间的标签语义差异
理解并遵循这些约定将帮助开发者构建更加健壮、可维护的检测模型,并确保与MMDetection生态系统的良好兼容性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考