OpenMMLab通过深度学习,是一个高级库OpenMMLab 软件栈可以看出,低层仍然使用 Pytorch,因此用户并不是在学一个全新的库,而是更加高级,更加方便的Pytorch库,OpenMMLab它能给用户带来更高的效率,使用户只关注核心算法,而不必在配置文件上浪费更多的时间
MMdet 主要由 4 部分组成,datasets、models、core 和 apis 另外,MMCV 是面向整个 OpenMMLab 所有开源库均为通用类和工具类,方便下游各类 codebase 复用

backbone
mmdet/models/backbones
__all__ = [ 'RegNet', 'ResNet', 'ResNetV1d', 'ResNeXt', 'SSDVGG', 'HRNet', 'Res2Net', 'HourglassNet', 'DetectoRS_ResNet', 'DetectoRS_ResNeXt', 'Darknet', 'ResNeSt', 'TridentResNet' ]
通过 MMCV 你可以通过注册机制 dict 任何注册类别的形式配置都非常方便灵活。
# 骨架预训练权重路径 pretrained='torchvision://resnet50', backbone=dict( type='ResNet', # 骨架类名,以下参数是该类的初始参数 depth=50, num_stages=4, out_indices=(0, 1, 2, 3), frozen_stages=1, norm_cfg=dict(type='BN', requires_grad=True), norm_eval=True, style='pytorch'),
neck
neck 可以认为是 backbone 和 head 主要负责连接层 backbone 高效融合和增强特性,可以整合和增强输入的单尺度或多尺度特性。 mmdet/models/necks
__all__ = [ 'FPN', 'BFP', 'ChannelMapper', 'HRFPN', 'NASFPN', 'FPN_CARAFE', 'PAFPN',
'NASFCOS_FPN', 'RFP', 'YOLOV3Neck'
]
最常用的应该是 FPN,一个典型用法是:
neck=dict(
type='FPN',
in_channels=[256, 512, 1024, 2048], # 骨架多尺度特征图输出通道
out_channels=256, # 增强后通道输出
num_outs=5), # 输出num_outs个多尺度特征图
head
目标检测算法输出一般包括分类和框坐标回归两个分支,不同算法 head 模块复杂程度不一样,灵活度比较高。在网络构建方面,理解目标检测算法主要是要理解 head 模块。
MMDetection 中 head 模块又划分为 two-stage 所需的 RoIHead 和 one-stage 所需的 DenseHead,
- 所有的 one-stage 算法的 head 模块都在mmdet/models/dense_heads中
- 而 two-stage 算法还包括额外的mmdet/models/roi_heads
几乎每个算法都包括一个独立的 head
# dense_heads:
__all__ = [
'AnchorFreeHead', 'AnchorHead', 'GuidedAnchorHead', 'FeatureAdaption',
'RPNHead', 'GARPNHead', 'RetinaHead', 'RetinaSepBNHead', 'GARetinaHead',
'SSDHead', 'FCOSHead', 'RepPointsHead', 'FoveaHead',
'FreeAnchorRetinaHead', 'ATSSHead', 'FSAFHead', 'NASFCOSHead',
'PISARetinaHead', 'PISASSDHead', 'GFLHead', 'CornerHead', 'YOLACTHead',
'YOLACTSegmHead', 'YOLACTProtonet', 'YOLOV3Head', 'PAAHead',
'SABLRetinaHead', 'CentripetalHead', 'VFNetHead', 'TransformerHead'
]
需要注意的是:two-stage 或者 mutli-stage 算法,会额外包括一个区域提取器 roi extractor,用于将不同大小的 RoI 特征图统一成相同大小。
虽然 head 部分的网络构建比较简单,但是由于正负样本属性定义、正负样本采样和 bbox 编解码模块都在 head 模块中进行组合调用,故 MMDetection 中最复杂的模块就是 head。
下载配置文件
建议在 Conda环境中,在Pycharm中好像不能用,暂时还不知道是什么原因造成的
# 安装 mim
pip install openmim
mim search mmdet --model "mask r-cnn"
mim download mmdet --config "mask_rcnn_r50_fpn_2x_coco" --dest .
--dest .
中间有空格
运行测试模型
from mmdet.apis import init_detector, inference_detector, train_detector, show_result_pyplot
from mmdet.datasets import build_dataset
from mmcv import Config
import mmcv
import os.path as osp
import multiprocessing
if __name__ == '__main__':
multiprocessing.freeze_support()
config_file = 'solo_r50_fpn_3x_coco.py'
checkpoint_file = 'solo_r50_fpn_3x_coco_20210901_012353-11d224d7.pth'
model = init_detector(config_file, checkpoint_file, device='cuda:0')
# print(model)
cfg = Config.fromfile(config_file)
dataset = [build_dataset(cfg.data.train)]
mmcv.mkdir_or_exist(osp.abspath('./work_dir_sum'))
train_detector(model, dataset, cfg, distributed=False, validate=False)
# 推理演示图像
result = inference_detector(model, '81.jpg')
show_result_pyplot(model,'81.jpg', result)