py-faster-rcnn 源码解析1

faster rcnn是在fast rcnn的基础上,包装了RPN以及网络共享。首先,看一下除fast rcnn以外的内容。

tools
1._init_paths.py
初始化路径,要访问module/package的路径的加进去,给PYTHONPATH加上访问caffe和lib的路径
2.compress_net.py
使用truncated SVD压缩网络参数,这里,对fc6和fc7进行了压缩,即全连接层
3.demo.py
使用VGG16 trained on PASCAL VOC 2007 在示例图片上进行测试。
4.eval_recall.py

5.reval.py

6.rpn_generate.py
调用了rnp中的generator函数,这里只是一个封装调用的过程, 我们在这里调用配置的参数、设置rpn的test参数,以及输入输出等操作。
7.test_net.py
调用lib/fast_rcnn/test.py中的函数test_net,用数据集测试fast r-cnn网络,主要是一些参数的配置
8.train_faster_rcnn_alt_opt.py
用交替优化的方式训练faster r-cnn,这里就是根据faster rcnn文章中的具体实现。可以在主函数中看到,其包括的步骤为:

  • RPN 1,使用imagenet model进行初始化参数,生成proposal,这里存储在mp_kwargs
  • fast rcnn 1,使用 imagenet model 进行初始化参数,使用刚刚生成的proposal进行fast rcnn的训练
    *RPN 2使用 fast rcnn 中的参数进行初始化(这里要注意哦),并生成proposal
  • fast rcnn 2,使用RPN 2 中的 model进行初始化参数,
    值得注意的是:在我们训练时,我们可以在get_solvers中的max_iters中设置迭代次数,在不确定网络是否可以调通时,减少迭代次数可以减少测试时间。
    我们在训练faster rcnn网络时,就是调用这个文件训练的。
    9.train_net.py
    调用lib/fast_rcnn/train.py中的函数train_net,使用自己的数据集训练fast r-cnn网络
    10.train_svms.py
    使用r-cnn中的算法和超参数,训练post-hoc SVMs

lib/rpn
1.generate_anchors.py
生成多尺度和多比例的锚点。这里由generate_anchors 函数主要完成,可以看到,使用了3个尺度(128,256,512)以及3个比例(1:1,1:2,2:1)。一个锚点由w,h,x_str,y_str固定,也就是宽、高、x_center和y_center固定。
2.anchor_target_layer.py
生成每个锚点的训练目标和标签,将其分类为1(object),0(not object),-1(ignore)。当label>0,yejiushi you object),-1(ignore)。当label>0,也就是有object时,将会进行box的回归。其中,forward函数功能:在每一个cell中,生成9个锚点,提供这9个锚点的细节信息,过滤掉超过图像的锚点,测量同GT的overlap。
3.proposal_layer.py
这个函数是用来将RPN的输出转变为object proposal的。作者新增了ProposalLayer类,其中forward实现了:生成锚点box、对每个锚点提供box的参数细节、将预测框切成图像、删除宽高小于阈值的框、将所有的(proposal,score)对排序、获取pre_nms_topN proposals、获取NMS、获取after_nms_topN proposals。
4.proposal_target_layer.py
将proposal与 ground-truth targets对比,对每一个object proposal生成 proposal classification labels and bounding-box regression targets。
5.generate.py
使用一个rpn生成object proposals。

lib/nms
nms里的核心函数就是py_cpu_nms.py
py_cpu_nms.py

def py_cpu_nms(dets, thresh):
    """Pure Python NMS baseline."""
    #x1、y1、x2、y2、以及score赋值
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    #每一个op的面积
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    #order是按照score排序的
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        #计算相交的面积
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        #计算:重叠面积/(面积1+面积2-重叠面积)
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1]

posted on 2017-10-24 23:05  MissSimple  阅读(1437)  评论(0编辑  收藏  举报

导航