R-CNN總結
不總結就沒有積累
R-CNN的全稱是 Regions with CNN features。它的主要基礎是經典的AlexNet,使用AlexNet來提取每個region特征,而不再是傳統的SIFT、SURF的特征。同時,還利用了AlexNet本來的功能:分類,這時所得的分類結果相當於預分類。最后,由於每個Region是有邊界的,使用SVM對其進行分類得到一個score,定位每個物體的bounding box。
預處理:
先看一看AlexNet的網絡結構
可以看到,它的輸入圖像是一個224*224*3的3通道的圖像,包含有五層的卷積層,兩層的全連接層,最后輸出是softmax層。
R-CNN開始對圖片進行提取region,稱為Region proposal,並且使用的是selective search。對每張region圖片warp,可以認為是調整圖片的大小,但論文上提到的圖片的大小是227*227,與AlexNet有一點區別。在圖片warp之前,會先擴張bounding box的大小為p=16個像素。我猜這是為了消除圖像的邊緣效應。
訓練:
這里會先做pre-training。Pre-training的好處是可以加快訓練的速度,參數可以直接從其他AlexNet遷移過來,也可以重新訓練,AlexNet的類別數是1000的。從圖中的結構看出,最后輸出的特征向量有4096維。
AlexNet的參數訓練完之后,就更改它的類別數(論文使用21維,包括20維的類別,和一維的背景)。這時使用有監督訓練微調參數(fine tuning),這個fine tuning我認為是由於初始的學習率較小吧,是0.001。有監督訓練會涉及到類別的問題(因為這里網絡最后的結果還是分類),於是,當region proposal和人工標注的ground truth 的IOU(即交集/並集)大於等於0.5時,把相應的region標記為正的,即有類別的,否則標記為負樣例即background。訓練的方法使用隨機梯度下降的方式,與AlexNet類似,可以參考文獻《ImageNet Classification with Deep Convolutional Neural Networks》。
訓練的一個batch的大小為128,其中包括38個正樣例,和90個負樣例。(batch代表批,訓練一批又叫1 iteration,所有的批訓練了一次成為epoch)。
得到region即bounding box的類別之后,使用SVM訓練一個二分類的分類器。算法為每一個類別都訓練一個SVM分類器,注意,SVM訓練的數據是經過R-CNN提取特征的4096維特征向量。此處SVM標記為負樣例的閾值為IOU小於0.3,而正樣例直接取ground truth box的region。訓練的過程如下圖:
測試:
測試的過程相對簡單,對每一張圖片進行region proposal之后,一般是2000個region proposal,使用R-CNN提取每個region proposal的4096維特征向量。使用SVM分類器進行分類,對得到的每個bounding box(region proposal本身是有邊界的)都有一個score,在排序前先把那些IOU低於某個閾值的bounding box去掉。然后再使用非極大值抑制的方法選出最好的bounding box,從而實現定位。
論文中還做了一個對比實驗,就是如果只提取特征用於分類,對於最后一個pooling層和兩個全連接層fc6、fc7,當沒有fine-tuning時,發現三者的分類精度其實差不多,但是如果有fine-tuning時,加入全連接層所提取的特征所得的精度會高很多。
減少定位錯誤:
這里定位錯誤使用了一種方法叫做bounding box regression,而且使用的特征就是pooling層提取的特征向量(這里是為什么呢?)。
關於bounding box regression的內容來自
http://blog.csdn.net/u011534057/article/details/51235964,這篇文章里說的很好。