Faster RCNN最終候補ボックス座標値の取得


以前の训练を経て、小鱼はFaster RCNNネットワークの実现の検出机能に対してすでに少し理解して、次はネットの検出结果を利用して多目标の追迹を実现します.この特定のテーマはいくつかの実现の追迹の道の上の小さい知识の点を记录するために使います.
今日小魚が共有しているのは、訓練されたネットワークを利用してテスト画像の候補枠座標を得る方法です.~/py-faster-rcnn/tools/demo.pyというファイルを実行する際に、テストセットのターゲットを候補ボックスの可視化、すなわちdemo.pydef vis_detections関数を行う.ここではdemoを参照する.pyコード解析はこのコードの主な3つの機能を理解する:候補ボックスの結果の可視化;ターゲットボックスの取得を検出する.パラメータの取得
小魚はここから最終的な候補枠座標を得て、具体的な方法は:1.可視化の何の可視化関数を分析するのは:
def vis_detections(im, class_name, dets, thresh=0.5):
    """Draw detected bounding boxes."""
    inds = np.where(dets[:, -1] >= thresh)[0]
    if len(inds) == 0:
        return

    im = im[:, :, (2, 1, 0)]
    fig, ax = plt.subplots(figsize=(12, 12))
    ax.imshow(im, aspect='equal')
    for i in inds:
        bbox = dets[i, :4]
        score = dets[i, -1]
        ax.add_patch(
            plt.Rectangle((bbox[0], bbox[1]),
                          bbox[2] - bbox[0],
                          bbox[3] - bbox[1], fill=False,
                          edgecolor='red', linewidth=3.5)
            )
        ax.text(bbox[0], bbox[1] - 2,
                '{:s} {:.3f}'.format(class_name, score),
                bbox=dict(facecolor='blue', alpha=0.5),
                fontsize=14, color='white')

    ax.set_title(('{} detections with '
                  'p({} | box) >= {:.1f}').format(class_name, class_name,
                                                  thresh),
                  fontsize=14)

    plt.axis('off')
    plt.tight_layout()
    plt.draw()

関数から検出されたターゲットボックスbboxを可視化することができ、各ターゲットボックスに検出精度score.2.可視化されたものを見つけてどのようにbbox,scoreを生成するかを示し、可視化関数の2つのパラメータから次の関数に遡って可視化関数、すなわちdemo関数を呼び出すことができる.
def demo(net, image_name):
    """Detect object classes in an image using pre-computed object proposals."""

    # Load the demo image
    im_file = os.path.join(cfg.DATA_DIR, 'demo', image_name)
    im = cv2.imread(im_file)

    # Detect all object classes and regress object bounds
    timer = Timer()
    timer.tic()
    **scores, boxes = im_detect(net, im)**
    timer.toc()
    print ('Detection took {:.3f}s for '
           '{:d} object proposals').format(timer.total_time, boxes.shape[0])

    # Visualize detections for each class
    CONF_THRESH = 0.8
    NMS_THRESH = 0.3
    for cls_ind, cls in enumerate(CLASSES[1:]):
        cls_ind += 1 # because we skipped background
        cls_boxes = boxes[:, 4*cls_ind:4*(cls_ind + 1)]
        cls_scores = scores[:, cls_ind]
        dets = np.hstack((cls_boxes,
                          cls_scores[:, np.newaxis])).astype(np.float32)
        keep = nms(dets, NMS_THRESH)
        dets = dets[keep, :]
        vis_detections(im, cls, dets, thresh=CONF_THRESH)

この関数からbbox,score,コードの太くなった部分も見られます.ここではim_に遡りますdetect(net,im)関数、この関数は~/py-faster-rcnn/lib/fast_rcnn/test.pyに現れ、私たちはこの関数に移動して、im_detect(net,im)関数にはbbox,scoreコードとreturn scores,pred_の完全な計算があります.boxes.ここで注意しなければならないのは、im_detect(net,im)関数では、182行に印刷コードが追加されます.
print pred_boxes.shape
return scores, pred_boxes

すなわちreturnコードの上に出力bboxの次元を直接印刷して300*(4(K+1))の行列を得る.kはカテゴリ数を表す.最後にFast RCNNに入力された300個の候補枠であり,我々が望む最終可視化の候補枠ではない.3.これらの必要なものを利用して探した後,それぞれ必要なものを取り始める.ここで小魚は最終的な候補枠を必要とする.それは可視化における候補枠である.私は~/py-faster-rcnn/tools/demo.pyにprint出力命令を加えるだけでいいです.53行程度でprint bboxを加えると、最終的な結果は以下のフォーマットになります.
Demo for data/demo/00109.jpg
Detection took 0.142s for 300 object proposals
[ 1198.58422852  1014.32049561  1291.8581543   1123.05639648]
[ 675.29943848  634.83068848  766.93762207  724.48535156]
[ 1463.50634766   131.7862854   1548.50048828   223.23049927]
[ 1021.40447998   367.55706787  1138.07788086   479.88537598]
[ 1228.62817383   665.61010742  1330.26538086   781.8638916 ]
[ 1069.45117188   457.67938232  1159.40161133   542.62628174]
[ 588.99707031  251.40000916  685.6192627   361.50817871]
[ 1058.63061523   542.11383057  1131.95068359   612.54180908]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

各動作~/data/demo/01009.jpgピクチャの1つのターゲットボックスの座標は、合計数行で、そのピクチャに何個のターゲットが検出されたかを証明する.