综述与实践指南
MMDetection是一个基于PyTorch的开源框架,是一个目标检测工具箱,包含了丰富的目标检测、实例分割、全景分割算法以及相关的组件和模块,支持多种经典和现代模型,如ResNet、VGG、EfficientNet等。它还集成了单阶段和两阶段检测器,如YOLO、SSD、Faster R-CNN等,并提供了模块化设计,简化了模型组合、调整和优化的流程。框架还包括数据处理、模型训练、验证和测试的集成解决方案,并附有详细的文档和示例。MMDetection 由 7 个主要部分组成,apis、structures、datasets、models、engine、evaluation 和 visualization。
MMDetection广泛应用于自动驾驶、安防监控等领域,为研究者和开发者提供了一个强大的工具,以促进深度学习目标检测的实践和创新。
模型算法下载
在 Coovally AI Hub 公众号后台回复 「 模型算法 」,即可获取下载链接!
SSD (Single Shot MultiBox Detector)
SSD,是一种单阶段目标检测器。其优点是原始的YOLO和Faster R-CNN在推理速度和精度之间取得了更好的平衡。SSD模型是由Wei Liu等人在使用卷积神经网络(CNN)进行目标检测的研究中,提出的一种改进思路。
SSD用于图像分类、物体检测和语义分割等各种深度学习任务。相对于其他目标检测算法,SSD模型有更高的精度,而且速度也是非常快的。其主要思路是通过在CNN的最后几层添加多个预测层实现多尺度的目标检测,然后通过一个过滤策略对每个检测框进行筛选,最后输出最终的检测结果。
SSD模型结构分为两个部分,一个是特征提取网络,另一个是多尺度检测网络。SSD模型可以被应用在各种目标检测任务中,比如人脸检测、车辆检测等。
基本配置和使用代码
ini
# 配置文件路径
config_file = 'configs/ssd/ssd300_coco.py'
# 模型权重路径
checkpoint_file = 'ssd300_coco_20200307-b3c19318.pth'
# 创建模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# 测试单张图片
img = 'test.jpg' # 测试图片路径
result = inference_detector(model, img)
# 可视化结果
show_result_pyplot(model, img, result)
- 参考论文:SSD: Single Shot MultiBox Detector
- 论文链接:arxiv.org/pdf/1512.02...
RetinaNet
RetinaNet来自FAIR 论文:Focal Loss for Dense Object Detection,其简要概述为:深入分析了极度不平衡的正负(前景背景)样本比例导致 one-stage 检测器精度低于 two-stage 检测器,基于上述分析,提出了一种简单但是非常实用的 Focal Loss 焦点损失函数,并且 Loss 设计思想可以推广到其他领域,同时针对目标检测领域特定问题,设计了 RetinaNet 网络,结合 Focal Loss 使得 one-stage 检测器在精度上能够达到乃至超过 two-stage 检测器。
总的来说,RetinaNet 有两个大创新:1.Focal Loss,2.RetinaNet网络。Focal Loss 几乎已经成为 one-stage 算法的标配,而 RetinaNet 网络结构也是目前主流的目标检测网络结构,其变体不计其数。
RetinaNet网络主要由ResNet作为主干网络、FPN(特征金字塔网络)作为 neck、以及分类和边框回归子网络作为head组成。RetinaNet模型的特点是它是一种单阶段目标检测器,与传统的两阶段检测器(如Faster R-CNN)相比,它更为简洁和高效。RetinaNet的结构主要包括三个部分:Backbone、Neck和Head。Backbone通常采用深度卷积神经网络来提取特征,Neck部分用于收集不同尺度的特征图,而Head则负责生成最终的检测结果。
标准的 RetinaNet 骨架网络采用的是 ResNet 系列。由于骨架本身没有限制,MMDetection 中目前提供的预训练权重所涉及的骨架网络包括:ResNet50-Caffe、ResNet50-Pytorch、ResNet101-Caffe、ResNet101-Pytorch、ResNeXt101,非常丰富。
MMDetection RetinaNet包括了详细的配置和参数设置,这使得用户可以根据自己的需求灵活地调整模型。例如,用户可以自定义Backbone网络、调整锚点生成策略、选择不同的损失函数等。
基本配置和使用代码
ini
# 配置文件路径
config_file = 'configs/retinanet/retinanet_r50_fpn_1x_coco.py'
# 模型权重路径
checkpoint_file = 'retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth'
# 创建模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# 测试单张图片
img = 'test.jpg' # 测试图片路径
result = inference_detector(model, img)
# 可视化结果
show_result_pyplot(model, img, result)
- 参考论文:Focal Loss for Dense Object Detection
- 论文链接:arxiv.org/abs/1708.02...
Faster R-CNN
Faster R-CNN是目标检测领域最为经典的方法之一,通过RPN(Region Proposal Networks)区域提取网络和 R-CNN 网络联合训练实现高效目标检测。其简要发展历程为:R-CNN➡Fast R-CNN➡Faster R-CNN。
Faster R-CNN是在Fast R-CNN基础上引入了RPN,Faster R-CNN的出现改变了整个目标检测算法的发展历程。之所以叫做two-stage检测器,原因是其包括一个区域提取网络RPN和RoI Refine网络R-CNN,同时为了将 RPN 提取的不同大小的RoI特征图组成batch输入到后面的 R-CNN 中,在两者中间还插入了一个RoI Pooling层,可以保证任意大小特征图输入都可以变成指定大小输出。简要结构图如下所示:
由于Faster R-CNN是后续各个算法的baseline且用途非常广泛,OpenMMLab提供了非常多的模型配置供研究或者不同任务fintune用,几乎覆盖了所有常用配置,如下所示:
- 1x、2x 和 3x 的模型配置和权重;
- 多尺度训练配置和权重;
- 不同骨架的配置和权重;
- PyTorch和Caffe style的配置和权重;
- 各种 loss 对比配置和权重;
- 不包含FPN的Faster R-CNN配置和权重;
- 常用类别例如person的配置和权重,可作为下游任务例如行人检测的预训练权重,性能极佳。
基本配置和使用代码
#
img = 'path/to/test/image.jpg' # 图片路径
result = inference_detector(model, img)
# 可视化结果
show_result_pyplot(model, img, result)
# 如果你需要批量处理图片,可以使用以下代码
# images = ['path/to/image1.jpg', 'path/to/image2.jpg', ...]
# for img in images:
# result = inference_detector(model, img)
# show_result_pyplot(model, img, result)
-
参考论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
-
论文链接:
Mask R-CNN
在 FPN 提出后,Kaiming He等进一步对其进行任务扩展,提出了Mask R-CNN,通过新增mask掩码分支实现实例分割任务,其最大特点是任务扩展性强,通过新增不同分支就可以实现不同的扩展任务。例如可以将mask分支替换为关键点分支即可实现多人姿态估计。除此之外,为解决特征图与原始图像上的RoI不对准的问题,提出了ROIAlign模块。
Mask R-CNN和Faster R-CNN的区别主要包括两个方面:
- R-CNN中额外引入Mask Head,从而可以实现实例分割任务;
- 针对特征图与原始图像上的RoI不对准问题,提出了RoIPool的改进版本 RoIAlign。
Mask R-CNN易于推广到其他任务例如,我们可以在同一框架内实现多人姿态估计。我们在COCO整套挑战赛的所有三个赛道上都取得了优异成绩,包括实例分割、边界框对象检测和人物关键点检测。在没有任何附加功能的情况下,Mask R-CNN在每项任务中的表现都优于所有现有的单一模型参赛者,包括COCO 2016挑战赛的获奖者。我们希望我们简单有效的方法能成为一个坚实的基线,并为未来的实例级识别研究提供帮助。
基本配置和使用代码
ini
# 配置文件路径
config_file = 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py'
# 模型权重路径
checkpoint_file = 'mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth'
# 创建模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# 测试单张图片
img = 'test.jpg' # 测试图片路径
result = inference_detector(model, img)
# 可视化结果
show_result_pyplot(model, img, result)
- 参考论文:Mask R-CNN
- 论文链接:arxiv.org/pdf/1703.06...
Cascade R-CNN
Cascade R-CNN,即级联区域卷积神经网络,是一种高效的目标检测算法。它的出现解决了传统R-CNN系列算法在处理小目标、重叠目标和背景混杂等复杂场景时的困扰。Cascade R-CNN通过多阶段精细化的检测过程,克服了单阶段处理器在处理复杂场景时的不足,显著提升了目标检测的性能。
在目标检测中,需要使用IoU阈值来区分正负样本。一个使用低IoU阈值(比如0.5)训练的目标检测器,往往会产生噪声检测结果。但是,增加IoU阈值往往又会导致检测性能下降。这主要是由于两个原因:①在训练过程中,正样本数目呈指数级减少而导致过拟合;②推理过程中,训练检测器时的IoU和预测结果时的IoU不匹配(mismatch,这一点后面会具体解释)。针对这些问题,论文中提出了一种多阶段目标检测结构Cascade R-CNN。它由一系列随着IoU阈值增加训练而成的检测器组成,对close false positives具有更高的选择性。这个算法是分阶段训练的,每个阶段的检测器的输出都会获得一个更好的分布,从而以该输出作为新的输入来训练下一个更高质量的检测器。通过逐步改进预测输出结果的重采样可以保证所有检测器在训练时都有一个大小相当的正样本集,从而减少了过拟合问题。在推理阶段会采用相同的级联过程,使得每个阶段的hypotheses和detector quality更加匹配。Cascade R-CNN在COCO数据集上的表现超过了所有单阶段目标检测模型。实验表明,Cascade R-CNN适用于不同的检测器结构,并且取得了一致性的提升。
Cascade R-CNN与Faster R-CNN流程对比图,如下图所示。
论文中提出了多阶段/多阈值的cascade rcnn网络,主要目的就是通过级联的、逐渐提升iou阈值的head,有选择性的抑制很相近的假阳样本(close false positives), 尤其是"close but not correct" bounding boxes,从而提升整体检测效果。该网络结构清晰,效果显著,并且能简单移植到其它detector中,带来2-4%的性能提升。
基本配置和使用代码
ini
# 配置文件路径
config_file = 'configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py'
# 模型权重路径
checkpoint_file = 'cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth'
# 创建模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# 测试单张图片
img = 'test.jpg' # 测试图片路径
result = inference_detector(model, img)
# 可视化结果
show_result_pyplot(model, img, result)
- 参考论文:Cascade R-CNN: High Quality Object Detection and Instance Segmentation
- 论文链接:arxiv.org/pdf/1906.09...
总结
MMDetection计算机视觉系列模型在目标检测领域不断刷新纪录,从精度到效率均取得了显著成就,推动了多个领域的AI发展。
值得一提的是,Coovally模型训练平台涵盖了国内外开源社区1000+模型算法,本期文章中的SSD、Faster R-CNN等热门算法全部包含,用户可一键进行下载。