引言:大大降低水平框检测器改旋转框检测器的难度
MMRotate 是一个基于 PyTorch 和 MMDetection 的开源旋转框目标检测工具箱。它将目标检测从水平框扩展到旋转框,为场景文字、遥感影像、自动驾驶等领域的应用打下了基础,为学术界和产业界提供了高效强大的基准模型。
从今年 2 月 28 日发布至今,MMRotate 收获了 20 余位来自世界各地的贡献者,解决了 300 多个来自社区的 issues,收获了不少忠实用户和热情的社区开发者。截止到目前,MMRotate 已经 4 次登上 GitHub Trending 总榜,star 数也已经破千,这着实让我们受宠若惊。
为了回应大家的支持,经过半年多的迭代,MMRotate 终于在 11 月迎来了 1.0 版本的发布。我们根据社区的需求和算法的进展,对现有设计做出了改进,进一步提升了代码的扩展性和易用性。接下来,我们就一起来了解一下 MMRotate 1.0 中的主要变化吧!
全新引擎,全新体验
OpenMMLab 2.0 最新发布的深度学习训练框架 MMEngine,提供了功能非常强大的执行器,统一了算法库训练测试的启动和执行逻辑,另外规范了数据接口协议,使得各模块间(包括模型、数据集、数据增强、评测、可视化等)的数据传递更流畅,模块间的组合更灵活。
在 MMRotate 1.x 中,我们基于 MMEngine 和 MMDetection 3.x 对所有模型进行了重构,统一了各组件的接口。相信用户很快就能体验到 MMEngine 带来的全新体验!
在 MMRotate 0.x 中,组件都被注册到了 MMDetection 下面,不利于跨库调用。而在 MMRotate 1.x 中,我们搭上了 OpenMMLab 2.0 的顺风车,顺势将所有组件都注册到了 MMEngine 下面,与其他算法库平级。
这使得 MMRotate 1.x 可以和 OpenMMLab 2.0 中的其他算法库更加优雅地进行跨库调用,也为 MMRotate 带来了更多的玩法和可能性。
OpenMMLab 2.0 全家桶
后续我们将继续完善 MMRotate 的教程文档,手把手教大家:如何“白嫖” MMClassification 中各种强大的 Backbone,如何支持半监督旋转框检测任务,如何支持 MMOCR 中的文本检测任务,如何用 MMDeploy 部署模型。欢迎大家持续关注 MMRotate!
全新 BoxType 设计
在 OpenMMLab 2.0 中,我们对不同类型的 Box (水平框/旋转框/四边形框) 进行了抽象,统一了 MMDetection 3.x 和 MMRotate 1.x 中不同类型边界框的用法,以简化实现并减少冗余代码。
首先,我们在 MMDetection 3.x 中创建了一个抽象基类 BaseBoxes,所有的 BoxType 都会继承它并拥有一套统一的 API。OpenMMLab 2.0 一共支持了 3 种 BoxType 类型,包括 MMDetection 中的 HorizontalBoxes,MMRotate 中的 RotatedBoxes 和 QuadriBoxes。
用户只需要将水平框模型中相关函数用统一的 API 替换,就能让重构后的模型同时支持水平框检测、旋转框检测、四边形框检测任务。
水平框,旋转框和四边形框都具有统一的 API
目前我们对 MMDetection 3.x 中的 RetinaNet、Faster R-CNN、Cascade R-CNN 等模型进行了重构,使用统一的 API 替换掉了原来代码中写死的水平框操作。这样一来,用户在 MMRotate 1.x 中不再需要 MMDetection 中的 head 进行任何修改就能直接使用。
不得不说,BoxType 的提出大大降低了用户用水平框检测器改旋转框检测器的难度。我们鼓励感兴趣的同学自己动手试一试,将 MMDetection 中你认为最具潜力的水平框模型改造成旋转框模型,亲自体验一把 BoxType 统一 API 带来的便捷。当然也请大家别忘了给我们提 PR 哦!
上手简单,一学就会
听完上面那些抽象的概念,可能有的同学心里已经打起退堂鼓了。且慢!BoxType 其实并没有你想的那么复杂。为了降低用户的使用门槛,BoxType 实例具备了大多数 Tensor 的特性。这意味着用户能够直接将 BoxType 实例当作普通 Tensor 进行操作,真正降低了用户的学习成本。
Torch.Tensor 和 BaseBoxes 所共同拥有的内置函数和方法
一套代码,多框复用
BoxType 的设计不仅降低了用水平框检测模型魔改旋转框/四边形框目标检测模型的难度,还显著减少了 MMRotate 中的冗余代码。经过重构和精简,MMRotate 的各类 head 数量从 27 个变为了 14 个,减少了 48%。同时,MMRotate 支持的旋转框数据增强数量更是增加了近 5 倍!
模型数量不变,Head 更少,数据增强更多
以 Rotated RetinaNet 和 Rotated Faster R-CNN 为例,过去我们需要针对旋转框对 MMDetection 中的 head 进行一些修改和继承才能使其支持旋转框模型。
通过对 MMDetection 3.x 中的相关 head 进行 BoxType 升级,用户在 MMRotate 1.x 中不需要对 head 进行任何修改和继承就能直接支持旋转框模型,显著减少了 head 的数量。
大刀阔斧,砍掉冗余 head
通过重构 MMDetection 中的数据增强模块,MMRotate 1.x 的用户目前已经能够直接使用绝大部分 MMDetection 3.x 中的数据增强策略了。在 MMRotate 1.0 版本中,用户能够直接使用的旋转框数据增强总数已经达到了 24 个。真正做到了“一套代码,多框复用”。丰富数据增强也为用户训练强大和鲁棒的旋转框模型提供了坚实的后盾。
更多数据增强,带来更多可能
任意切换,来去自如
另外,我们还提供了统一的转换函数,方便用户在不同类型的 BoxType 实例之间进行转换。用户不需要关心 BoxType 的具体类型,就能将其转为指定类型的框。
这种特性在一些实际应用中是十分方便的。例如在计算旋转框指标时,不管模型输出的预测结果的是水平框、旋转框还是多边形框,转换函数都能自动将其转换成旋转框。
不同框之间可以通过统一的函数任意转换
在 MMRotate 1.x 中,我们将角度表示法的切换功能移到了 RotatedBoxes 内部,通过 regularize_boxes 接口来进行统一的管理。另外,我们对模型旋转框角度表示法的切换也进行了精简和优化。
在 MMRotate 0.x 版本中,用户在一个配置文件中需要同时给 dataset、 pipeline、head 传入角度表示法的参数。过于分散的参数对用户的使用和理解都造成了困扰,稍不留神就会漏掉一两个参数。
通过用户反馈和实验分析,我们发现在最初的数据读取阶段就将角度转换成对应的表示法是没有必要的,实际上只需要在 bbox coder 前将旋转框的角度表示法转换好即可。
为了减轻用户的负担,我们将角度表示法的作用范围限定在了 head 内部。用户只需要修改 anchor_generator 和 bbox_coder 两个组件就可以完成对旋转框模型角度表示法的切换,不再需要关心其他地方的角度表示法。
降低角度表示法的配置难度
管你啥框,手到擒来
BoxType 还具备良好的扩展性,用户可以根据实际的需求注册新的 BoxType 类或者增加新的 API。在 MMRotate 1.0 中,我们通过添加 QuadriBoxes 类实现了对四边形框检测任务的支持。
用户只需要修改 LoadAnnotations 中的 box_type 字段,就可以轻松地加载四边形框标注用于模型训练。后续我们还会根据用户的反馈和实际需求,考虑添加更多的 BoxType 类型。
加载四边形框标注的流程
其他升级
除了全新的引擎和 BoxType 设计之外,MMRotate 1.0 还为大家准备了一些实用的小更新。在数据集方面,MMRotate 1.0 新增了对 SRSDD 和 RSDD 两个 SAR 数据集的支持。
目前,MMRotate 一共支持了 6 个数据集,包括 2 个光学遥感数据集和 4 个 SAR 数据集。同时,我们还支持了 COCO 格式自定义数据集的读取。
Mask2BoxType 数据增强模块会将 mask 格式的标注转换成旋转框或者多边形框标注。在评测指标方面,我们不仅新增了对四边形框的支持,还支持了更为详尽的 COCO 格式的旋转框指标。
新的数据集和评测指标
总结
经过数个月紧锣密鼓的开发与打磨,MMRotate 1.0 的整体架构已经变得更加成熟和鲁棒。作为 OpenMMLab 2.0 的旋转框目标检测算法库,MMRotate 已在开源社区被广泛使用。基于全新的架构和 BoxType 设计,我们进一步统一了 MMDetection 3.x 和 MMRotate 1.x 中不同类型边界框的用法,显著减少了冗余代码。
同时,可扩展易配置的特性将会为学术研究带来更多的可能性。MMRotate 绝不仅仅只是一个开源旋转框目标检测工具箱,它更是我们对该领域经常被吐槽的“角度定义不统一”、“算子编译难度大”等问题的不妥协。
MMRotate 之后的发展,除了进一步紧跟学术热点,实时支持学术界最新的 sota 模型之外,我们也希望它能更高效、更强大,更灵活,应用场景更全面,更易上手,希望能助力旋转框检测新算法的诞生,和科技产业的落地。开源项目的核心是社区共建,我们也希望让更多社区成员有机会参与到算法库的开发和管理中来,共同推进旋转框目标检测领域研究的发展。
后续规划
未来,我们也将不断地迭代更新,为社区带来更好用的旋转目标检测模型库。我们计划在未来支持更多的数据集和精度更高的算法,积极与其他算法库进行联动。同时我们也将不断提高 MMRotate 的易用性,完善并充实文档内容。欢迎更多的社区用户参与到 MMRotate 的建设中来,为旋转框目标检测社区的发展助力。
我们将在 2023 年 1 月 1 日正式发布 MMRotate 1.0.0 版本到主分支,对新版本感兴趣的同学可以使用 dev-1.x 分支来体验我们的全新版本。我们将在未来保持双分支的同时维护,主要维护时间线如下所示: