天天看點

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

rpn的作用是從圖像中提取proposals(這裡是1000個),也就是預測框。在faster-rcnn之前,提取的方法有selective search等。但RPN是可以端到端訓練的。我們看下torchvision的RPN:

rpn = RegionProposalNetwork(
            rpn_anchor_generator, rpn_head,
            rpn_fg_iou_thresh, rpn_bg_iou_thresh,
            rpn_batch_size_per_image, rpn_positive_fraction,
            rpn_pre_nms_top_n, rpn_post_nms_top_n, rpn_nms_thresh)
           

從類的初始化也可以看出,RPN主要有rpn_anchor_generator, rpn_head兩部分,其餘是可調節的參數。

(一)rpn_anchor_generator

從上幾篇教程我們知道,我們輸入的圖檔size為3x800x800,也就是長寬為800。特征大小為torch.Size([1, 256, 50, 50]),是以縮放比例(stride)為800/50=16。現在在800x800的圖像上,我們以16x16為機關進行分割,我們标記出這些16x16的中心點,那麼就是下面這樣,這些點我們叫做anchors

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

為了說明,替換成空白圖像

對于每個中心點(anchors)我們建立3個anchor box,也就是矩形框。

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

中間的正方形anchor box大小是128,其他兩個長寬比分别為1:2和2:1.

所有anchor生成的anchor box就變成下面這樣,密密麻麻,總共50x50x3=7500個box

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

由于我們使用FPN,提取的是分層的特征

torch.Size([1, 256, 200, 200])

torch.Size([1, 256, 100, 100])

torch.Size([1, 256, 50, 50])

torch.Size([1, 256, 25, 25])

torch.Size([1, 256, 13, 13])

上面介紹到torch.Size([1, 256, 50, 50])這個提取了50x50x3=7500個anchor box,同理其它三層anchor box數量為200x200x3,100x100x3,25x25x3,13x13x3合并起來就有159882個anchor box。

(二) rpn_head

rpn head将圖像特征作為輸入,生成框(anchors)的分類objectness(這裡隻分為兩類:1.包含物體 2. 圖像背景,也就是不包含物體)和anchor box回歸系數pred_bbox_deltas。

objectness: 數值越大說明越可能包含物體而不是背景

pred_bbox_deltas:前面我們生成的是固定的基本框anchor box。雖然我們在上面的圖檔上可以看到基本上框已經密密麻麻地覆寫了整個圖檔,但實際的物體位置肯定不是固定的,需要調整。怎麼在上面生成的框的基礎上調整?那就是使用預測出來的pred_bbox_deltas。

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

圖檔來自:http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/

圖檔中紅色框是我們的基礎anchor box,藍色是預測框。有了回歸系數(pred_bbox_deltas),應用上面的公式,我們可以很友善地在基礎anchor box(上一節生成的159882個框)和預測框之間轉換。

proposals = self.box_coder.decode(pred_bbox_deltas.detach(), anchors)
           

torchvision/models/detection/_utils.py中的BoxCoder類實作了上面的轉換方法,分别是encode、decode方法

(三)filter_proposals

現在我們已經有每個anchor box 的預測分數,現在在每一層我們選取前1000個分數高的,每一層anchor的數量我們上面算過,由于最後一層隻有507,是以我們總共選取了4507個anchor box。

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

這樣我們便從159882個anchor box,篩減到4507個。現在我們做進一步的過濾。

  1. 先将超出圖像的邊框裁剪到不超出圖像
  2. 邊框太小,小于某個閥值的去掉
  3. 使用Non-Maximum Suppression (NMS)算法去掉重疊度比較高的
  4. 最後我們設定了一個閥值,最多保留n個(這裡我們取1000)

Non-Maximum Suppression算法在下一章單獨介紹

這樣我們RPN就得到了1000個proposals。

鐵馬:Faster-RCNN詳解和torchvision源碼解讀(五):NMS(非極大值抑制)​zhuanlan.zhihu.com

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

鐵馬:Faster-RCNN詳解和torchvision源碼解讀(六):roi pooling​zhuanlan.zhihu.com

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN

鐵馬:Faster-RCNN詳解和torchvision源碼解讀(七):roi aglin​zhuanlan.zhihu.com

faster rcnn fpn_Faster-RCNN詳解和torchvision源碼解讀(四):RPN