• (二十)mmdetection源码解读:config配置文件models Faster R-CNN


    一、配置文件models理解

    
    model = dict(
        type='FasterRCNN',                         # model类型
        pretrained='modelzoo://resnet50',          # 预训练模型:imagenet-resnet50
       ####### resnet50
        backbone=dict(
            type='ResNet',                         # backbone类型
            depth=50,                              # 网络层数
            num_stages=4,                          # resnet的stage数量
            out_indices=(0, 1, 2, 3),              # 输出的stage的序号,//stride=(4, 8, 16, 32),channel=(256, 512, 1024, 2048)
            frozen_stages=1,                       #该参数表示你想冻结前几个 stages 的权重,ResNet 结构包括 stem+4 stage
    #frozen_stages=-1,表示全部可学习
    #frozen_stage=0,表示stem权重固定
    #frozen_stages=1,表示 stem 和第一个 stage 权重固定
    #frozen_stages=2,表示 stem 和前两个 stage 权重固定
            style='pytorch'),                      # 网络风格:如果设置pytorch,则stride为2的层是conv3x3的卷积层;如果设置caffe,则stride为2的层是第一个conv1x1的卷积层
      ####### FPN,原理参考后面原理图        
        neck=dict(
            type='FPN',                            # neck类型
            in_channels=[256, 512, 1024, 2048],    # 输入的各个stage的通道数
            out_channels=256,                      # 输出的每个特征层的通道数
            num_outs=5),                           # 输出的特征层的数量
            ######## rpn_head   经过RPN后,我们得到了Classification/Regression loss和Proposal Region,接下来要对得到的loss和
            ##proposals做后续处理,其中包括proposal的细分类和再回归,以及ROI Pooling等操作
     	#feat_size=[image_size/4,image_size/ 8,image_size/ 16, image_size/32, image_size/64]
     	anchor_size=[32, 64,128, 256,512] 不同宽高比,面积相同,每个特征图生成对应三个anchor,五个特征图也就是生成15个anchor
        rpn_head=dict(
            type='RPNHead',                        # RPN网络类型
            in_channels=256,                       # RPN网络的输入通道数
            feat_channels=256,                     # 特征层的通道数
            anchor_scales=[8],                     # 生成的anchor的baselen,baselen = sqrt(w*h),w和h为anchor的宽和高
            anchor_ratios=[0.5, 1.0, 2.0],         # anchor的宽高比
            anchor_strides=[4, 8, 16, 32, 64],     # 在每个特征层上的anchor的步长(对应于原图)
            target_means=[.0, .0, .0, .0],         # 均值
            target_stds=[1.0, 1.0, 1.0, 1.0],      # 方差
            use_sigmoid_cls=True),                 # 是否使用sigmoid来进行分类,如果False则使用softmax来分类
    
    #### roi_head主要做了以下几件事:
    ######1、对rpn得到的proposals做了随机筛选,保证正样本和负样本比例一定(默认1:3),并且总数量一定(默认512)
    ######2、通过roi_align对feature map做剪裁,得到固定尺寸的feature
    ######3、roi_align得到的feature经过全连接层得到分类和回归结果
    ######4、对分类和回归结果进行后处理,包括:box_decode,过滤分类置信度过小或者box size过小的结果,并进行nms
    
           ######## bbox_roi_extractor      
        bbox_roi_extractor=dict(
            type='SingleRoIExtractor',                                   # RoIExtractor类型
            roi_layer=dict(type='RoIAlign', out_size=7, sample_num=2),   # ROI具体参数:ROI类型为ROIalign,输出尺寸为7,sample数为2
            out_channels=256,                                            # 输出通道数
            featmap_strides=[4, 8, 16, 32]),                             # 特征图的步长
            ######## bbox_head     
        bbox_head=dict(
            type='SharedFCBBoxHead',                     # 全连接层类型
            num_fcs=2,                                   # 全连接层数量
            in_channels=256,                             # 输入通道数
            fc_out_channels=1024,                        # 输出通道数
            roi_feat_size=7,                             # ROI特征层尺寸
            num_classes=81,                              # 分类器的类别数量+1,+1是因为多了一个背景的类别,2.0之后不需要+1
            target_means=[0., 0., 0., 0.],               # 均值
            target_stds=[0.1, 0.1, 0.2, 0.2],            # 方差
            reg_class_agnostic=False))                   # 是否采用class_agnostic的方式来预测,class_agnostic表示输出bbox时只考虑其是否为前景,后续分类的时候再根据该bbox在网络中的类别得分来分类,也就是说一个框可以对应多个类别
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    二、模型算法FasterRCNN介绍

    resnet50 示意图----图片来源知乎作者臭咸鱼
    图中的stage0对应stem,stage1,stage2,stage3,stage4,对应out_indices=(0, 1, 2, 3)
    FPN示意图----图片来源知乎作者Hans
    ResNet用每级最后一个Residual Block的输出,记为{C1,C2,C3,C4,C5}。FPN用2~5级参与预测(因为第一级的语义还是太低了),{C2,C3,C4,C5}表示conv2,conv3,conv4和conv5的输出层(最后一个残差block层)作为FPN的特征,分别对应于输入图片的下采样倍数为{4,8,16,32}。
    Faster R-CNN整体框架结构 -----图片来源bilibili作者 深蓝学院
    Extrator进行特征提取、RPN 生成候选框、RoIHead对候选框进行分类并调整目标预测框的位置与大小。

    RPN是一个设计出来专门生成候选区域的网络,这个网络的输入是特征图,输出是一堆候选区域

    RoI Pooling 与 RoI Align 的区别:https://zhuanlan.zhihu.com/p/161540817
    RoI Pooling, 对于具有不同特征大小的的输入区域, 都可以得到相同大小输出特征。
    每一次量化操作都会对应着轻微的区域特征错位(misaligned), 这些量化操作在RoI和提取到的特征之间引入了偏差。这些量化可能不会影响对分类任务,但它对预测像素精度掩模有很大的负面影响。
    RoI Align, 对于具有不同特征大小的的输入区域, 都可以得到相同大小输出特征。
    将量化RoI 特征进一步细分为量化的空间单元(bin)

    backbone–resnet50:提取特征
    neck–FPN:多尺度特征
    RPN: 网络比较简单,就一个卷积进行特征通道变换,加上两个输出分支即可,生成候选框,前景和背景二分类,候选框粗回归。
    ROIhead:目标具体分类,候选框精确回归,主要做了以下几件事
    1、对rpn得到的proposals做了随机筛选,保证正样本和负样本比例一定(默认1:3),并且总数量一定(默认512)
    2、proposal经过筛选后,需要进行ROIAlign操作,因为输入到roi head模块中的特征是完整尺寸的feature map,需要根据proposals的尺寸在对应的feature map中剪裁出相应的特征,这也就是ROIPooling和ROIAlign要完成的事情,通过roi_align对feature map做剪裁,得到固定尺寸的feature
    3、roi_align得到的feature经过全连接层得到分类和回归结果
    4、对分类和回归结果进行后处理,包括:box_decode,过滤分类置信度过小或者box size过小的结果,并进行nms
    算法FasterRCNN简介:
    https://zhuanlan.zhihu.com/p/422456194
    https://zhuanlan.zhihu.com/p/31426458
    https://www.bilibili.com/read/cv9043728/
    https://blog.csdn.net/watermelon1123/article/details/99942646

  • 相关阅读:
    写项目要有“靠“字诀!
    echarts-锥型柱状图
    数据结构--排序
    AI顶会ICLR‘23作者竟让审稿人重读幼儿园? 大会主席强硬回复!
    docker swarm集群部署rabbit-mq
    AtCoder Beginner Contest 262 部分题解
    【刷题】怎么样才能正确的迎接面试?
    【Yarn】清除Yarn的缓存,更新Yarn本身、更新项目的依赖项
    (附源码)php校园寝室分配查询系统 毕业设计 032027
    Unity UI与粒子 层级问题Camera depth Sorting Layer Order in Layer RenderQueue
  • 原文地址:https://blog.csdn.net/m0_37737957/article/details/132894345