R-CNN 系列 object detection 算法

引言

在 object detection 領(lǐng)域,近 5 年的突破性進(jìn)展似乎都與一個(gè)名字有關(guān)系:Ross Girshick躏仇。梳理從 R-CNN昙楚,F(xiàn)ast R-CNN, Faster R-CNN 到 Mask R-CNN 等各種經(jīng)典模型吵冒,Ross Girshick 都是作者之一,甚至連 YOLO 的作者中也出現(xiàn)了 Ross Girshick 的名字争涌。

這位大神簡歷如下:

從算法到實(shí)現(xiàn)框架再到數(shù)據(jù)集引颈,這位大神實(shí)現(xiàn)了一條龍的突破~

本文的目的是整理總結(jié) R-CNN 系列算法的發(fā)展歷程和模型本身的核心思想耕皮,不涉及太多技術(shù)細(xì)節(jié)(例如訓(xùn)練數(shù)據(jù)預(yù)處理,超參數(shù)設(shè)置等)蝙场。
參考文獻(xiàn)主要是上述各算法的原文以及下列資源:

R-CNN

R-CNN李丰,一般認(rèn)為全稱是 Region-based CNN 或者作者原文中提到的 Regions with CNN features苦锨。

概括地說,R-CNN 的步驟如下圖所示:

from http://www.robots.ox.ac.uk/~tvg/publications/talks/fast-rcnn-slides.pdf
  1. 輸入待檢測圖片
  2. 從圖片中提取若干子區(qū)域 (region proposal)
  3. 對(duì)每個(gè) region 扭曲變形 (warp)趴泌,得到 CNN 希望的輸入圖片大小舟舒,通過 CNN 進(jìn)行特征提取,得到該 region 的 feature vector
  4. 將 region feature vector 送入 SVM 進(jìn)行 image classification (或者稱為 recognition)嗜憔,同時(shí)通過線性回歸預(yù)測 bounding box 的位置調(diào)整秃励。

下面詳細(xì)介紹 R-CNN 中的關(guān)鍵環(huán)節(jié)。

region proposal

對(duì)于輸入的圖片吉捶,首先利用 selective search 算法生成約 2000 個(gè) region夺鲜。關(guān)于 selective search 算法可以參考原文,也可以參考我們之前的博客文章呐舔。原文中提到 R-CNN 對(duì)各種 region proposal 算法沒有偏好币励,之所以選擇 selective search 算法僅僅是為了方便與前人工作做對(duì)比。

region feature vector 提取

這一部分的目的是對(duì)于每一個(gè) region珊拼,通過 CNN (原文選用 AlexNet) 進(jìn)行特征提取食呻,得到統(tǒng)一長度的 feature vector甫题,以便后續(xù)的分類蜂科。

由于每個(gè) region 的大小差別比較大,而 AlexNet 默認(rèn)接收 227×227 pixel 的圖片饺藤,這里就需要對(duì) region 做一些預(yù)處理剑辫,主要是 region 大小的轉(zhuǎn)化干旧。

要把一個(gè)任意大小的圖片轉(zhuǎn)化成 227×227 像素的圖片方法有很多,原文中介紹了 4 種方式:

from the original paper

分別是:

  1. 保持原 region 比例妹蔽,填充周邊像素點(diǎn)椎眯,再縮放成 227×227挠将,對(duì)應(yīng)上圖中(B)列
  2. 保持原 region 比例,不填充周邊像素盅视,縮放成 227×227捐名,對(duì)應(yīng)上圖中(C)列
  3. 直接將原 region 扭曲(warp)縮放成 227 × 227,對(duì)應(yīng)上圖中(D)列
  4. 與 3 相同闹击,但是在周邊額外添加了一些像素點(diǎn)(即 padding)镶蹋,使得生成的 227×227 圖像中上下左右包含了 16 pixel 的填充,對(duì)應(yīng)上圖中第 2 行和第 4 行赏半。

最終作者選擇了 warp + padding 的方式贺归,一方面 warp 相對(duì)來說是最簡單的,直接把任意大小的圖片縮放成 227×227 即可断箫,另外 padding 是在原 region 周圍稍微添加了一些像素點(diǎn)拂酣,從實(shí)際效果看提高了檢測正確率。

將統(tǒng)一大小的 region 送入 CNN 中仲义,進(jìn)行特征提取婶熬。如何得到這個(gè) CNN 也是一個(gè)問題。

針對(duì)目標(biāo)檢測的數(shù)據(jù)集 ILSVRC detection dataset 包含了 200 類物體埃撵,PASCAL VOC (Visual Object Classes) 包含了 20 類物體赵颅。相對(duì)來說帶有標(biāo)簽的訓(xùn)練數(shù)據(jù)比較少,不足以訓(xùn)練一個(gè)大型的 CNN暂刘,因此采用了 transfer learning 的技術(shù)饺谬。原文中并沒有提到 transfer learning 這個(gè)名詞,只是說 fine-tuning谣拣。
首先借用在 ImageNet 上已經(jīng)訓(xùn)練好的 CNN 模型(最初的文章中用了 AlexNet募寨,后來 arXiv 上新版文章中用了 VGG,效果提升很明顯)森缠,然后在 PASCAL 數(shù)據(jù)集上進(jìn)行 fine-tuning拔鹰。這里對(duì) AlexNet 網(wǎng)絡(luò)結(jié)構(gòu)的改變只是將原本對(duì)應(yīng) ImageNet 1000 類輸出的 classification layer 替換成了對(duì)應(yīng) N+1 類輸出的 classification layer,該層權(quán)重隨機(jī)初始化贵涵。對(duì)于 PASCAL 數(shù)據(jù)集 N=20列肢,ILSVRC 數(shù)據(jù)集 N=200,另外 +1 對(duì)應(yīng) background 類型独悴。

經(jīng)過 fine-tuning 之后,CNN softmax layer 之前的 4096 維向量即為該 region 的 feature vector.

classification by SVM

得到 region 的 feature vector 之后锣尉,送入 SVM 進(jìn)行最后的分類刻炒。

這里 SVM 的訓(xùn)練是針對(duì)不同類型的物體分開進(jìn)行的,每一類訓(xùn)練一個(gè) SVM自沧,它只給出針對(duì)這一類物體的分類結(jié)果坟奥。之所以最后用 SVM 分類树瞭,而不是直接用 CNN 的 softmax 進(jìn)行分類,原文作者的解釋是嘗試過 softmax 之后發(fā)現(xiàn)效果比 SVM 差一些爱谁,但是同時(shí)指出如果調(diào)整一些訓(xùn)練策略晒喷,softmax 和 SVM 之間的差距有可能縮小。這也為后來基于 R-CNN 的改進(jìn)埋下了伏筆访敌。

得到所有 region 對(duì)應(yīng)的檢測結(jié)果(即包含某種類型物體的概率 score)之后凉敲,還有一步操作:Non-Maximum Suppression (NMS)。如果兩個(gè) region 檢測到同一類物體寺旺,比如都檢測到了行人爷抓,一個(gè) region score 較高,而另一個(gè) score 較低阻塑,當(dāng)這兩個(gè) region 的 IoU (intersection-over-union) 超過某個(gè)閾值時(shí)蓝撇,即它們重合較多時(shí),只保留那個(gè) score 較高的 region.

對(duì) bounding box 的調(diào)整

object detection 的任務(wù)除了檢測圖中的物體陈莽,還要給出定位渤昌,即用 bounding box 盡量準(zhǔn)確的圈出該物體。前邊基于 region 的分類過程可能能夠正確辨識(shí)出 region 中的物體走搁,但是初始的 region 并不一定是一個(gè)合適的 bbox独柑。在 R-CNN 最后又添加了一個(gè)線性回歸模型,基于 feature vector 來預(yù)測正確的 bbox 相對(duì)于 region 的位置變換朱盐,即預(yù)測 bbox 應(yīng)該如何調(diào)整群嗤。這個(gè)訓(xùn)練過程也是 class-specific 的。

在最終使用時(shí)兵琳,R-CNN 輸出包含兩部分:

  • 對(duì)每個(gè) region 進(jìn)行分類
  • 預(yù)測 bbox 位置的調(diào)整

理論上來說狂秘,更新 bbox 的位置之后,應(yīng)該在新的 bbox 中重新進(jìn)行分類躯肌,這樣準(zhǔn)確度可能更高一些者春,但是原文作者發(fā)現(xiàn)實(shí)際上并沒有明顯改進(jìn)。因此清女,實(shí)際使用中并沒有對(duì)新的 bbox 重新分類钱烟。

Fast R-CNN

總的來說,上述 R-CNN 的訓(xùn)練是分多步走的:先是 fine-tuning 一個(gè) CNN 得到 feature vector嫡丙,然后訓(xùn)練 SVM 進(jìn)行分類拴袭,最后還要再訓(xùn)練一個(gè)線性回歸環(huán)節(jié)預(yù)測 bounding box 的調(diào)整。

Fast R-CNN 的改進(jìn)是不再使用獨(dú)立的 SVM 和線性回歸曙博,而是統(tǒng)一用 CNN 將這三個(gè)環(huán)節(jié)整合起來拥刻。Fast R-CNN 在訓(xùn)練時(shí)間和檢測時(shí)間方面比當(dāng)時(shí)已有的其他算法快若干數(shù)量級(jí)。

Fast R-CNN 整體框架如下:

From the original paper

基本步驟:

  1. 輸入為一整幅圖片父泳,以及 Regions of Interest (RoI)般哼。RoI 在之前的 R-CNN 中稱為 region proposals吴汪,即通過 selective search 算法得到的原圖上的若干 regions;
  2. 圖片經(jīng)過若干卷積層和 max pooling 層處理之后得到 feature map蒸眠;
  3. 對(duì)于每一個(gè) RoI 通過 RoI project 找到 feature map 上對(duì)應(yīng)的區(qū)域漾橙,經(jīng)過 RoI pooling layer 轉(zhuǎn)化為統(tǒng)一大小的 sub feature map,進(jìn)而得到統(tǒng)一大小的 feature vector楞卡;
  4. 對(duì)于每個(gè) RoI 的 feature vector 有兩個(gè)輸出:用于分類的 softmax layer 和用于預(yù)測 bounding box 的 regressor.

在上述各環(huán)節(jié)中霜运,我認(rèn)為比較關(guān)鍵的有兩個(gè):一是 RoI projection,即將 image 上的 RoI 映射到 feature map 上的 RoI臀晃。二是通過 RoI pooling layer 將 feature map 上不同大小的 RoI 轉(zhuǎn)化成統(tǒng)一大小的 sub feature map觉渴。而這兩個(gè)環(huán)節(jié)都借鑒了 SPPnets,其中 RoI pooling layer 是 SPPnets 中 Spatial Pyramid Pooling layer 的特例徽惋。

RoI projection

原本 R-CNN 是在原圖上選取若干RoI案淋,然后經(jīng)過 CNN 處理,最后提取出 feature vector险绘。對(duì)于每個(gè)圖片上不同的 RoI 來說踢京,從輸入到輸出沒有任何共享的東西。

RoI projection 的作用是將 R-CNN 中對(duì) image RoI 的處理推遲到了 feature map 上宦棺,這樣可以讓一個(gè) image 的所有 RoI 共享從 image 到 feature map 的卷積處理過程瓣距。這很顯然會(huì)加速訓(xùn)練和測試過程。至于如何將 image RoI 映射到 feature map RoI代咸,已經(jīng)有了非常細(xì)致的討論蹈丸,這里不再贅述。

RoI pooling layer

如何將 feature map 上不同大小的 RoI 轉(zhuǎn)化成統(tǒng)一大小的 sub feature map? 這里有非常直觀的動(dòng)畫演示呐芥。

概括如下:
假設(shè)我們已經(jīng)得到下面的 feature map (只考慮 2D)

from https://deepsense.ai/region-of-interest-pooling-explained/.jpg

其中 RoI 為黑框部分逻杖,大小為 h\times w = 5\times 7

我們希望將 RoI 轉(zhuǎn)化成 2×2 大小思瘟,可以選擇一個(gè) 2×2 的窗口如下

from https://deepsense.ai/region-of-interest-pooling-explained/.jpg

對(duì)每一個(gè)格子進(jìn)行 max pooling 操作荸百,得到如下的 2×2 的 feature map

from https://deepsense.ai/region-of-interest-pooling-explained/.jpg

總的來說,如果 RoI 大小為 h \times w滨攻,希望得到的 feature map 大小為 H \times W够话,則窗口中格子數(shù)目為 h/H \times w/W」馊疲可以根據(jù)具體情況向上或向下取整女嘲。

結(jié)合實(shí)際應(yīng)用,如果 CNN 網(wǎng)絡(luò)選用 VGG16诞帐,結(jié)構(gòu)如下:

VGG16.jpg

將最后一個(gè) max pooling layer 替換為 RoI pooling layer欣尼。前部的卷積層對(duì)輸入圖片的大小沒有嚴(yán)格限制,這一限制主要是在 fully connected layer景埃,所以為了配合 VGG16 網(wǎng)絡(luò)結(jié)構(gòu)媒至,要確保每個(gè) RoI 輸出的 feature map 依然為 H \times W = 7 \times 7

對(duì)于 VGG16 網(wǎng)絡(luò)結(jié)構(gòu)的修改還包括:

  • 去掉最后的 FC layer 和 softmax layer (原為 ImageNet 對(duì)應(yīng)的 1000 類輸出)
  • 添加隨機(jī)參數(shù)的 FC layer 和 K+1 輸出的 softmax layer谷徙,其中 K 為物體種類拒啰,+1 對(duì)應(yīng) background
  • 添加隨機(jī)參數(shù)的 FC layer 和 K 個(gè)輸出,每個(gè)輸出對(duì)應(yīng)一類物體完慧,輸出內(nèi)容為 bbox 的調(diào)整函數(shù)谋旦,這里與 R-CNN 相同。

Faster R-CNN

在 Fast R-CNN 中屈尼,region proposal 是由 CNN 網(wǎng)絡(luò)之外的算法提供的册着,例如 selective search。相對(duì)于后續(xù)的 region recognition 過程脾歧,region proposal 這一步實(shí)際上是整個(gè)算法的速度瓶頸甲捏。

Faster R-CNN 之所以 "Faster",就是因?yàn)樘岢隽?Region Proposal Network (RPN) 鞭执,加速了 region proposal 過程司顿。Faster R-CNN 本質(zhì)上就是 RPN + Fast R-CNN.

整個(gè) Faster R-CNN 結(jié)構(gòu)如下:

From the original paper

或者更加詳細(xì)的結(jié)構(gòu)如下:


From https://towardsdatascience.com/faster-rcnn-object-detection-f865e5ed7fc4

RPN 和 Fast R-CNN 共享從 image 到最后一層 CNN 輸出的 feature map 這一段網(wǎng)絡(luò)結(jié)構(gòu)。有些文章也將 Faster R-CNN 看做三個(gè)模塊:用于生成 feature map 的 Feature network兄纺,用于生成 region proposal 的 RPN大溜,以及用于最終的 object detection 的 Detection network。我們這里還是采用 RPN + Fast R-CNN 的形式估脆。

Region Proposal Network

RPN 的輸入是原始 image钦奋,輸出是 region proposals。在具體實(shí)現(xiàn)中疙赠,RPN 是 fully convolutional network (FCN)付材,只包含 convolutional layer,原本在分類/回歸中常用的全連通層也由卷積操作替代棺聊。

  1. 原始 image 經(jīng)過卷積層操作得到 feature map伞租。
  2. 對(duì) feature map 中每一個(gè) "pixel",找到其在原圖中的 receptive field限佩,以此為中心選取不同大小和高寬比的 k 個(gè) anchors葵诈,原文中選擇了 3 個(gè) size: 128^2, 256^2, 512^2 pixels,3 個(gè) ratio: 2:1, 1:1, 1:2祟同,不同組合共 k=9 個(gè) anchors作喘。之所以稱為 anchor (錨),是因?yàn)?RPN 輸出的 region 是以這些 anchor 為參考/基準(zhǔn)進(jìn)行調(diào)整的晕城。如果 feature map 的 size 為 W\times H泞坦,相應(yīng)的 anchors 數(shù)目為 W\times H \times k
    Anchors.png
  1. RPN 通過一個(gè) n\times n (默認(rèn) 3×3) 的滑動(dòng)窗口依次掃過 feature map砖顷,每個(gè)窗口通過 512 個(gè) 3×3 filter (對(duì)應(yīng) pre-trained CNN 為 VGG16)進(jìn)行卷積操作得到 1×1×512 feature map (實(shí)際上也是 feature vector)贰锁。

    注意 step 2 和 step 3 是兩個(gè)層面上的操作:step 3 中是在 feature map 中對(duì)每個(gè) 3×3 滑動(dòng)窗口進(jìn)一步特征提取和降維赃梧,step 2 中是在原始圖片中與滑動(dòng)窗口中心 "pixel" 對(duì)應(yīng)的位置選取 9 個(gè)不同大小和高寬比的 anchors。這些 anchors 顯然不太可能都包含物體豌熄,到底那些 anchors 可以作為最后的 region授嘀,需要根據(jù) feature map 上滑動(dòng)窗口中的數(shù)據(jù)來預(yù)測。

  2. 以 1×1×512 feature map 作為輸入, 一方面用 2k 個(gè) 1×1 的 filter 做卷積得到 2k 個(gè)輸出锣险,預(yù)測這 k 個(gè) anchor 中每個(gè) anchor 包含物體和不包含物體的概率蹄皱,很顯然兩個(gè)概率的和為1;另一方面用 4k 個(gè) 1×1 的 filter 做卷積得到 4k 個(gè)輸出芯肤,預(yù)測每個(gè) anchor 位置和大小的調(diào)整巷折。

有了 region proposals,后邊的操作與 Fast R-CNN 是相同的崖咨。

Faster R-CNN 訓(xùn)練

原文中采用 alternating training 的方式:

  1. 先基于 VGG16 fine tuning RPN
  2. 然后將 RPN 輸出的 region proposal 加上原始 image 一起訓(xùn)練 Fast R-CNN锻拘,在此過程中 RPN 和 Fast R-CNN 中前部生成 feature map 的 CNN 是獨(dú)立的,也就說 RPN 和 Fast R-CNN 現(xiàn)在還沒有共享的網(wǎng)絡(luò)結(jié)構(gòu)击蹲,兩者都是基于 pre-trained VGG-16 fine tuning 的
  3. 將 Fast R-CNN 訓(xùn)練好的前部 CNN 網(wǎng)絡(luò)共享給 RPN 并固定逊拍,只 fine tuning RPN 后部特有的網(wǎng)絡(luò)部分
  4. 固定 RPN 和 Fast R-CNN 共享的前部 CNN 不變,只 fine tuning Fast R-CNN 后部特有的部分
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末际邻,一起剝皮案震驚了整個(gè)濱河市芯丧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌世曾,老刑警劉巖缨恒,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轮听,居然都是意外死亡骗露,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門血巍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧锉,“玉大人,你說我怎么就攤上這事述寡∈料叮” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鲫凶,是天一觀的道長禀崖。 經(jīng)常有香客問我,道長螟炫,這世上最難降的妖魔是什么波附? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上掸屡,老公的妹妹穿的比我還像新娘封寞。我一直安慰自己,他們只是感情好仅财,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布钥星。 她就那樣靜靜地躺著,像睡著了一般满着。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贯莺,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天风喇,我揣著相機(jī)與錄音,去河邊找鬼缕探。 笑死魂莫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的爹耗。 我是一名探鬼主播耙考,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼潭兽!你這毒婦竟也來了倦始?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤山卦,失蹤者是張志新(化名)和其女友劉穎鞋邑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體账蓉,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枚碗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铸本。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肮雨。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖箱玷,靈堂內(nèi)的尸體忽然破棺而出怨规,到底是詐尸還是另有隱情,我是刑警寧澤锡足,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布椅亚,位于F島的核電站,受9級(jí)特大地震影響舱污,放射性物質(zhì)發(fā)生泄漏呀舔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媚赖。 院中可真熱鬧霜瘪,春花似錦、人聲如沸惧磺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磨隘。三九已至缤底,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間番捂,已是汗流浹背个唧。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留设预,地道東北人徙歼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像鳖枕,于是被迫代替她去往敵國和親魄梯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容