• faster rcnn流程


    1、执行流程

    数据准备

    train_net.py中combined_roidb函数会调用get_imdb得到datasets中factory.py生成的imdb
    然后调用fast_rcnn下的train.py中get_training_roidb,
    进而调用roi_data_layer下roidb.py中的prepare_roidb会为roidb添加image等信息。

    数据输入

    roi_data_layer下layer.py中的forword函数会调用minibatch.py中的get_minibatch得到输入信息。
    ‘data’是数据信息
    ‘gt_boxes’包含roidb['boxes']*imscale(缩放尺寸)和roidb['gt_classes']为n*5的数组
    ‘im_info’是[图片行,图片列,imscale]
    conv1-conv5 dcnn层
    conv1/pool1/conv2/poll2缩小了16倍,后面的三个卷积stride:1

    RPN模块

    rpn_conv/3x3层,3*3卷积卷积层,featuremap为256。每个像素点用256的向量表示。
    rpn_cls_score层,生成2(bg/fg) * (anchors)的output。
    rpn_bbox_pred层,生成4 * (anchors)的output。
    这里的4暗示的是(x-xa)/wa;(y-ya)/ha; log(w/wa); log(h/ha);
    rpn_cls_score_reshape层将rpn_cls_score转化为rpn_cls_score_reshape
    shape { dim: 0 dim: 2 dim: -1 dim: 0 }
    batch不变,channel为2,行变成了原来的anchors倍,列数不变。
    口->日
    AnchorTargetLayer层
    输入:  
    bottom: 'rpn_cls_score'#只是为了确定大小height、width
    bottom: 'gt_boxes'框的ground truth
    bottom: 'im_info'过滤不在图片内部的
    bottom: 'data'
    输出:
    top: 'rpn_labels'大小是1,1,A*height,width,A是anchar的数目
    top: 'rpn_bbox_targets'大小是1,A*4,height,width
    top: 'rpn_bbox_inside_weights'大小是1,A*4,height,width
    top: 'rpn_bbox_outside_weights'大小是1,A*4,height,width
    shifts是每个点*_feat_stride的(x,y),这里feat_stride=16,可以理解为rpn_cls_score映射到原图的坐标点。K是点数应该基本等于height*width。
    all_anchors是这些坐标点处安放anchor后的信息,大小是(K*A),4。total_anchors = int(K * A)
    过滤不在图片内部的得到anchors。
    计算anchors和gt_boxes的overlap,判断K*A个那些为正,那些为负。
    最后labels中存在的是抽样的,抽128个fg,正样本不够128,负样本多取点,凑够256个。不用的赋值为-1。
    bbox_targets存储的是anchors和最高重叠的gt的(x*-xa)/wa,(y*-ya)/ha,log(w*/wa),log(h*/hg),*为gt。
    bbox_inside_weights被抽中的正类为1,其他为0;
    bbox_outside_weights外部权重,目前负例的外部权重=正例的外部权重=np.ones((1, 4)) * 1.0 / np.sum(labels >= 0)
    ps:可以全是负样本,但是也没什么用,回归框没什么用,但是label还是有用的。
    rpn_loss_cls层
    计算rpn_cls_score_reshape和rpn_labels的loss。知道reshape的作用了吧。ignore_label: -1
    rpn_loss_bbox层
    计算smoothL1的loss。
    bottom: "rpn_bbox_pred"
    bottom: "rpn_bbox_targets"
    bottom: 'rpn_bbox_inside_weights'
    bottom: 'rpn_bbox_outside_weights'

    RoI Proposal模块

    rpn_cls_prob层基于rpn_cls_score_reshape生成概率,大小为1,2,A*height,width
    rpn_cls_prob_reshape层将rpn_cls_prob进行Reshape为1,2*A,height,width。
    ProposalLayer层
    将RPN的输出转变为object proposals。
    bottom: 'rpn_cls_prob_reshape'#用于nms
    bottom: 'rpn_bbox_pred'#生成候选框
    bottom: 'im_info'#生成的框别出图像外了
    输出:rpn_rois
    bbox_deltas(rpn_bbox_pred)和anchors得到所有的proposals,proposals的大小和bbox_deltas一样。1,A*4,height,width
    # bbox deltas will be (1, 4 * A, H, W) format
    # transpose to (1, H, W, 4 * A)
    # reshape to (1 * H * W * A, 4) where rows are ordered by (h, w, a)
    # in slowest to fastest order
    bbox_deltas = bbox_deltas.transpose((0, 2, 3, 1)).reshape((-1, 4))
    图片外的重算下不能小于0大于图片宽高(im_info)
    宽度和高度要大于等于RPN_MIN_SIZE(16)
    按照scores(bottom[0].data[:, self._num_anchors:, :, :]为fg)概率自高到低取RPN_PRE_NMS_TOP_N个候选,进行nms,nms后选择RPN_POST_NMS_TOP_N个。
    最后添加第一列为0,rpn_roisde的每行为[0,x,y,w,h]
    ProposalTargetLayer层(也是为了后面的loss服务的)
    计算回归差参考rcnn的论文附录C. Bounding-box regression。
    bottom: 'rpn_rois'#rpn得到的所有区域
    bottom: 'gt_boxes'#包括boxes、gt_classes
      
    top: 'rois'#区域块(0,x1,y1,x2,y2)
    top: 'labels'#标签
    top: 'bbox_targets'#4N(计算的rois和最新gt的target)
    top: 'bbox_inside_weights'#1
    top: 'bbox_outside_weights'#1
    setup输出的大小为:(1, 5)(1, 1)和(1, self._num_classes * 4)(1, self._num_classes * 4)(1, self._num_classes * 4),第一个维度大小根据下面的运算再reshape。
    按照FG_THRESH、BG_THRESH_HI、BG_THRESH_LO抽取背景前景。
    按照gt_boxes给labels赋标签,bg为0。rois为最后留下的。
    bbox_targets为4N,只有labels(N个类别)的那个4是有值的。bbox_inside_weights类似。bbox_outside_weights=inside。

    RCNN模块

    ROIPooling层,进行POIpooling。得到roi_pool_conv5大小为rois的多少*256(conv5的output)*6*6。
    fc6-fc7得到rois的多少*4096。
    cls_score得到:rois的多少*N(类别),即cls_score
    bbox_pred得到: rois的多少*4N,即bbox_pred
    
    loss_cls计算cls_score和labels的loss。
    loss_bbox计算bbox_pred和bbox_targets的loss。

    附录

    A=9的示例
    # anchors =
    #
    # -83   -39   100    56
    # -175   -87   192   104
    # -359  -183   376   200
    # -55   -55    72    72
    # -119  -119   136   136
    # -247  -247   264   264
    # -35   -79    52    96
    # -79  -167    96   184
    # -167  -343   184   360

    2、训练过程

    设$FRCN_ROOT=/data/houkai/faster-rcnn/py-faster-rcnn/,在该目录下:
    data/icdar为数据文件夹,Annotations是标注,hs是图片,ImageList.txt是文件名列表

    必须要在data/cache/目录下把数据库的缓存文件.pkl给删除掉,否则其不会重新读取相应的数据库

    ./tools/train_net.py
    --gpu 0
    --solver models/pascal_voc/ZF/faster_rcnn_end2end/solver.prototxt
    --weights data/imagenet_models/ZF.v2.caffemodel
    --imdb hs
    --iters 90000
    --cfg experiments/cfgs/faster_rcnn_end2end.yml
    output/faster_rcnn_end2end/hs中有生成的模型文件。
    训练采用的参数:

    'TEST': {'BBOX_REG': True,
              'HAS_RPN': True,
              'MAX_SIZE': 1000,
              'NMS': 0.3,
              'PROPOSAL_METHOD': 'selective_search',
              'RPN_MIN_SIZE': 16,
              'RPN_NMS_THRESH': 0.7,
              'RPN_POST_NMS_TOP_N': 300,
              'RPN_PRE_NMS_TOP_N': 6000,
              'SCALES': [600],
              'SVM': False},
    'TRAIN': {'ASPECT_GROUPING': True,//按宽高比shuffle
               'BATCH_SIZE': 128,//fastrcnn训练的样本数,每张图片抽取128张
               'BBOX_INSIDE_WEIGHTS': [1.0, 1.0, 1.0, 1.0],
               'BBOX_NORMALIZE_MEANS': [0.0, 0.0, 0.0, 0.0],//norm的均值
               'BBOX_NORMALIZE_STDS': [0.1, 0.1, 0.2, 0.2],//norm的方差
               'BBOX_NORMALIZE_TARGETS': True,//不用rpn是的归一化
               'BBOX_NORMALIZE_TARGETS_PRECOMPUTED': True,//计算ProposalTargetLayer中targets时norm。使用rpn时只能为true
               'BBOX_REG': True,//训练gt样本的regression
               'BBOX_THRESH': 0.5,//不用rpn时用于筛选样本,regression的参数
               'BG_THRESH_HI': 0.5,//[LO,HI]之间的算背景
               'BG_THRESH_LO': 0.0,
               'FG_FRACTION': 0.25,//128中前景的比例,不够负样本补充,如果负样本不够那就不够吧
               'FG_THRESH': 0.5,//rpn提取的候选和gt重合大于0.5算前景
               'HAS_RPN': True,
               'IMS_PER_BATCH': 1,//一次取一张
               'MAX_SIZE': 1000,
               'PROPOSAL_METHOD': 'gt',
               'RPN_BATCHSIZE': 256,//rpn样本数
               'RPN_BBOX_INSIDE_WEIGHTS': [1.0, 1.0, 1.0, 1.0],//被抽中正例的内部权重,针对x,y,w,h。
               'RPN_CLOBBER_POSITIVES': False,//先按照RPN_NEGATIVE_OVERLAP挑选bg
               'RPN_FG_FRACTION': 0.5,//rpn样本数中,fg的比例
               'RPN_MIN_SIZE': 16,//rpn 宽高的最小尺寸
               'RPN_NEGATIVE_OVERLAP': 0.3,//选择rpn的阈值bg
               'RPN_NMS_THRESH': 0.7,//12000进程nms的阈值
               'RPN_POSITIVE_OVERLAP': 0.7,//选择rpn的阈值fg
               'RPN_POSITIVE_WEIGHT': -1.0,//uniform抽中正例的权重<0
               'RPN_POST_NMS_TOP_N': 2000,//nms后保留2000个
               'RPN_PRE_NMS_TOP_N': 12000,//按score自高向第取12000个框
               'SCALES': [600],
               'SNAPSHOT_INFIX': '',//输出模型前缀
               'SNAPSHOT_ITERS': 10000,
               'USE_FLIPPED': True,//水平翻转
               'USE_PREFETCH': False//没有prefetch
        },

    命令:

    ./tools/train_net.py --gpu 0 --solver models/hs/solver.prototxt --weights data/imagenet_models/VGG16.v2.caffemodel --imdb hs --iters 500000 --cfg experiments/cfgs/faster_rcnn_end2end.yml
  • 相关阅读:
    完全背包
    二分求值(二分适合求答案在两个数之间的题目)
    set<pair<int,int> >的用法
    01背包 (dp专题)
    矩阵快速幂
    BZOJ1977 [BeiJing2010组队]次小生成树 Tree
    BZOJ1854 [Scoi2010]游戏
    BZOJ1054 [HAOI2008]移动玩具
    NOIP系列复习及题目集合
    BZOJ2708 [Violet 1]木偶
  • 原文地址:https://www.cnblogs.com/houkai/p/6824455.html
Copyright © 2020-2023  润新知