RCNN
物體檢測不再是對單一物體進行分類,而是要分類多個物體,另一方面還需要知道這些物體在什么地方,也就是bounding box。這兩點使得識別比分類更加困難。
因此采用來扣一塊區域出來,放卷積神經網絡來看一看是不是我要的物體,如果不是就丟棄,如果是,那就找到這個物體了。如此使用Selective Search生成若干個區域,然后對每一個區域進行一次分類,就可以了。
每一個生成的感興趣區域的框大小肯定是不一樣的,因此卷積神經網絡會將這些區域resize成大小相等的框,然后丟進卷積神經網絡生成特征
1、分類,最早的RCNN是采用單分類的SVM,比如有十個感興趣的物體則采用十個SVM分類器
2、定位,Selective Search出來的box不一定就是我所需要的box,可能會存在偏差,因此會采用回歸來判斷預測框與真實框的loss。
選擇性搜索算法使用《Efficient Graph-Based Image Segmentation》論文里的方法產生初始的分割區域作為輸入,通過下面的步驟進行合並:
- 首先將所有分割區域的外框加到候選區域列表中
- 基於相似度合並一些區域
- 將合並后的分割區域作為一個整體,跳到步驟1
通過不停的迭代,候選區域列表中的區域越來越大。可以說,我們通過自底向下的方法創建了越來越大的候選區域。表示效果如下:
選擇性搜索算法如何計算兩個區域的像素度的呢?
主要是通過以下四個方面:顏色、紋理、大小和形狀交疊
最終的相似度是這四個值取不同的權重相加
FAST RCNN
由於RCNN一張圖片大概會生成兩千個候選區域,fast RCNN 想讓速度提升,並不是在原始圖片上進行感興趣區域搜索,而是先對圖片進行卷積,也就是只對原始圖片進行一次卷積。然后在特征圖片上進行,Selective Search操作得到感興趣區域,同時不再對區域進行resize操作(不好求導),而是ROI Pooling。
另一個區別就是用SoftMax代替了SVM.
ROI Pooling
ROI pooling具體操作如下:
根據輸入image,將ROI映射到feature map對應位置;
將映射后的區域划分為相同大小的sections(sections數量與輸出的維度相同);
對每個sections進行max pooling操作;
這樣我們就可以從不同大小的方框得到固定大小的相應 的feature maps。值得一提的是,輸出的feature maps的大小不取決於ROI和卷積feature maps大小。ROI pooling 最大的好處就在於極大地提高了處理速度。
ROI pooling example
我們有一個8*8大小的feature map,一個ROI,以及輸出大小為2*2.
region proposal 投影之后位置(左上角,右下角坐標):(0,3),(7,8)。
將其划分為(2*2)個sections(因為輸出大小為2*2),我們可以得到:
對每個section做max pooling,可以得到:
整體過程如下:
說明:在此案例中region proposals 是5*7大小的,在pooling之后需要得到2*2的,所以在5*7的特征圖划分成2*2的時候不是等分的,行是5/2,第一行得到2,剩下的那一行是3,列是7/2,第一列得到3,剩下那一列是4。
Faster RCNN
主要改進就是用RPN代替了Selective Search
對每個像素生成9個錨框,因為這樣生成的錨框在大部分情況下只是背景,所以 利用一個二分類的Softmax,判斷錨框內是否為感興趣物體,如果不是則拋棄,如果是則放入ROI Pooling內
后面的Softmax則是判斷具體為哪個物體