• 「记录」MMDetection入门篇


    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'	]
    
    • 1
    • 2
    • 3

    通过 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'),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    neck

    neck 可以认为是 backbone 和 head 的连接层,主要负责对 backbone 的特征进行高效融合和增强,能够对输入的单尺度或者多尺度特征进行融合、增强输出等。
    mmdet/models/necks

    __all__ = [
        'FPN', 'BFP', 'ChannelMapper', 'HRFPN', 'NASFPN', 'FPN_CARAFE', 'PAFPN',
        'NASFCOS_FPN', 'RFP', 'YOLOV3Neck'
    ]
    
    • 1
    • 2
    • 3
    • 4

    最常用的应该是 FPN,一个典型用法是:

    neck=dict(
        type='FPN',
        in_channels=[256, 512, 1024, 2048], # 骨架多尺度特征图输出通道
        out_channels=256, # 增强后通道输出
        num_outs=5), # 输出num_outs个多尺度特征图
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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'
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    需要注意的是: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 .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意! --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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    CMake高级用法实例分析(学习paddle官方的CMakeLists)
    MariaDB落幕和思考
    python debug
    Node与ES6模块
    abaqus在仿真过程中中断了,这是为什么
    【Java 进阶篇】JQuery 遍历:发现元素的魔法之旅
    世界前沿技术发展报告2023《世界航空技术发展报告》(四)无人机技术
    电容的电路应用
    托尔斯泰:生活中只有两种不幸
    分词算法----正向和逆向最大匹配算法(含Python代码实现)
  • 原文地址:https://blog.csdn.net/ViatorSun/article/details/124491656