『壹』 目標檢測演算法---faster rcnn 知識簡要回顧(測試篇)
Faster RCNN檢測部分主要可以分為四個模塊:
1.特徵抽取:用於抽取圖像特徵,一般可以使用vgg、resnet和mobilenet等backbone;
2.RPN(Region Proposal Network):用於產生候選框,主要做一些粗糙的分類和回歸操作;
3.RoI Pooling:主要是為了解決全連接層需要固定尺寸輸入,而實際輸入大小不一的問題;
4.Classification and Regression:精細化分類和回歸。
faster rcnn演算法大致流程如下:
彩色圖像通過backbone進行特徵提取,輸出最後一層的feature map。接著將這些feature map進一步做基於3x3卷積核的特徵提取,該目的是增強模型的魯棒性。將輸出送入兩個分支,第一個分支跟類別有關,這里主要是用於簡單分類,區分是背景還是物體,這是針對anchor而言的;第二個分支則是用於初步預測候選框的偏移量,這個也是基於anchor而言的;再將前兩個分支的結果送入圖中的proposal中,首先會根據positive類的score篩選前6000個候選框,再將anchor的坐標和得到的偏移進行整合,得到初步候選框坐標,接著在做NMS,除去重疊嚴重的框,再經過了NMS後的框中,根據類別score取前300個框。然後將結果送入roi pooing層,用於生成固定尺寸的特徵區域,以方便後邊的全連接層接受信息;全連接層用於最後提取特徵,得到精細的類別和框的偏移量。
『貳』 R-CNN, Fast R-CNN, Faster R-CNN, YOLO:目標檢測演算法總結
參考鏈接
以下是文中涉及的演算法的最原始的文章:
一個最直接的解決辦法是從圖中取不同的感興趣區域,然後對這些區域用CNN進行分類,檢測這些區域中是否有物體的存在。
但是待檢測物體可能存在於圖片的不同位置而且有不同的長寬比例。所以以上方法需要選取量非常大的區域並需要非常大的計算量。
因此,R-CNN, Fast R-CNN, Faster R-CNN, YOLO被開發去又快又准地找物體。
為了解決上述提到的有大量區域被選擇的問題, Ross Girshick et al 提出了一種方法:用了選擇性搜索從圖片提取了2000個區域,這些區域被稱為」region proposals「。
用這種辦法,我們不需要去分類巨大數量的區域了,我們只需要去處理2000個區域。這2000個區域是用如下的選擇性搜索演算法(selective search algorithm)來找到的:
這篇文章 介紹了更多關於選擇性搜索演算法(selective search algorithm)的內容。
RCNN步驟:
R-CNN存在的問題:
Fast R-CNN的幾個改進:
The same author of the previous paper(R-CNN) solved some of the drawbacks of R-CNN to build a faster object detection algorithm and it was called Fast R-CNN. The approach is similar to the R-CNN algorithm.
Fast R-CNN更快的原因是:
Fast R-CNN更快:
From the above graphs, you can infer that Fast R-CNN is significantly faster in training and testing sessions over R-CNN. When you look at the performance of Fast R-CNN ring testing time, including region proposals slows down the algorithm significantly when compared to not using region proposals. Therefore, region proposals become bottlenecks in Fast R-CNN algorithm affecting its performance.
上面兩個演算法的缺點:
selective search耗時
Both of the above algorithms(R-CNN & Fast R-CNN) uses selective search to find out the region proposals . Selective search is a slow and time-consuming process affecting the performance of the network.
Faster R-CNN的改進:
不用selective search去找region proposals;
用network去找region proposals;
Therefore, Shaoqing Ren et al . came up with an object detection algorithm that eliminates the selective search algorithm and lets the network learn the region proposals .
Faster R-CNN的步驟:
時間上的對比:
Faster R-CNN最快並且能用作實時目標檢測
之前幾種演算法的缺點:
產生region的時候沒有縱覽整幅圖。其實圖的某些部分有更高的可能性包含物體。
All of the previous object detection algorithms use regions to localize the object within the image. The network does not look at the complete image. Instead, parts of the image which have high probabilities of containing the object .
YOLO的思想:
用一個單獨的網路去預測bounding boxes和bounding boxes中存在物體的概率
YOLO or You Only Look Once is an object detection algorithm much different from the region based algorithms seen above.
In YOLO, a single convolutional network predicts (1) the bounding boxes and (2)the class probabilities for these boxes.
YOLO的具體步驟:
How YOLO works is that:
YOLO的優缺點:
『叄』 目標檢測演算法的分步介紹(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
對原文的表達有部分改動
在本文中,我們將更深入地研究可用於目標檢測的各種演算法。我們將從 RCNN 家族的演算法開始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即將發布的文章中,我們將介紹更高級的演算法,如 YOLO、SSD 等。
下圖是說明目標檢測演算法如何工作的一個流行示例。圖像中的每個物體,從一個人到一隻風箏,都以一定的精度被定位和識別。
讓我們從最簡單的深度學習方法開始,也是一種廣泛使用的方法,用於檢測圖像中的目標——卷積神經網路( CNN)。CNN 的內部工作原理如下:
我們將圖像傳遞給網路,然後通過各種卷積和池化層處理,發送給全連接層。最後,我們以目標類別的形式獲得輸出。這相當簡單,不是嗎?對於每個輸入圖像,我們得到一個相應的類作為輸出。我們可以使用這種技術來檢測圖像中的各種目標嗎?讓我們看看如何使用 CNN 解決一般的目標檢測問題。
使用這種方法的問題在於圖像中的目標可能具有不同的縱橫比和空間位置。例如,在某些情況下,目標可能覆蓋圖像的大部分,而在某些情況下,目標可能僅覆蓋圖像的一小部分。目標的形狀也可能不同(在現實生活中經常發生)。由於這些因素,我們將需要大量的區域,從而導致大量的計算時間。因此,為了解決這個問題並減少區域數量,我們可以使用基於區域的 CNN,它使用提案法選擇區域。讓我們了解這個基於區域的 CNN 可以為我們做什麼。
與在大量區域上工作不同的是,RCNN 演算法是在圖像中選取一堆框並檢查這些框中是否有任何一個包含任何目標。 RCNN 使用 selective search 從圖像中提取這些框(這些框稱為 regions)。
讓我們首先了解什麼是 selective search 以及它如何識別不同的 regions。基本上四個模式可以構成一個物體:不同的尺度、顏色、紋理和外殼。selective search 識別圖像中的這些模式,並在此基礎上提出各種regions。以下是selective search 工作原理的簡要概述:
舉個例子:
到目前為止,我們已經看到了 RCNN 如何實現目標檢測。但是這種技術有其自身的局限性。由於以下步驟,訓練 RCNN 模型既昂貴又緩慢:
所有這些過程結合起來使 RCNN 非常慢。對每張新圖像進行預測大約需要 40-50 秒,這實質上使得模型在面對龐大的數據集時變得笨重且幾乎無法構建。
好消息是——我們有另一種目標檢測技術,它修復了我們在 RCNN 中看到的大部分問題。
我們還能做些什麼來減少 RCNN 演算法通常需要的計算時間?我們是否可以每張圖像只運行一次並獲取所有感興趣的區域(包含某個目標的區域)。
RCNN 的作者 Ross Girshick 提出了這個想法,即每張圖像只運行一次 CNN,然後找到一種方法在 2,000 個區域之間共享該計算。在 Fast RCNN 中,我們將輸入圖像提供給 CNN,後者反過來生成卷積特徵圖。使用這些地圖,提取提議的區域。然後我們使用 RoI 池化層將所有提議的區域重塑為固定大小,以便可以將其饋入全連接網路。
讓我們將其分解為簡化概念的步驟:
因此,Fast RCNN 不是使用三個不同的模型(如 RCNN),而是使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回識別類的邊界框。
為了進一步分解,我將對每個步驟進行可視化。
這就是 Fast RCNN 如何解決 RCNN 的兩個主要問題,1. 將每個圖像的一個而不是 2,000 個區域傳遞給 ConvNet。2. 使用一個而不是三個不同的模型來提取特徵、分類和生成邊界框。
但即使是 Fast RCNN 也存在某些問題。它還使用 selective search 作為尋找感興趣區域的建議方法,這是一個緩慢且耗時的過程。每張圖像檢測目標大約需要 2 秒,這與 RCNN 相比要好得多。但是當我們考慮大型現實生活數據集時,即使是 Fast RCNN 看起來也不那麼快了。
Faster RCNN 是 Fast RCNN 的修改版本。它們之間的主要區別在於 Fast RCNN 使用 selective search 來生成感興趣的區域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 將圖像特徵圖作為輸入並生成一組目標提議,每個提議的目標以分數作為輸出。
Faster RCNN 方法通常遵循以下步驟:
讓我簡要解釋一下這個區域提議網路(RPN)實際上是如何工作的。
首先,Faster RCNN 從 CNN 獲取特徵圖並將它們傳遞給區域提議網路。 RPN 在這些特徵圖上使用一個滑動窗口,在每個窗口,它生成 k 個不同形狀和大小的 Anchor 框:
Anchor 框是固定大小的邊界框,它們放置在整個圖像中,具有不同的形狀和大小。對於每個 Anchor,RPN 預測兩件事:
我們現在有不同形狀和大小的邊界框,它們被傳遞到 RoI 池化層。在 RPN 步驟之後,有可能存在沒有分配給它們的類別提議。我們可以獲取每個建議並對其進行裁剪,以便每個建議都包含一個目標。這就是 RoI 池化層所做的。它為每個錨點提取固定大小的特徵圖:
然後將這些特徵圖傳遞到具有 softmax 和線性回歸層的全連接層。它最終對目標進行分類並預測已識別目標的邊界框。
到目前為止,我們討論的所有目標檢測演算法都使用區域來識別目標。網路不會一次性查看完整圖像,而是依次關注圖像的各個部分。這會造成兩個並發症:
『肆』 超詳細解讀Faster R-CNN-FPN
2021年了,竟然還有人寫關於Faster R-CNN的文章?我的原因主要有兩點:
我們先從全局上了解Faster R-CNN-FPN,然後再關注其中涉及的細節。下面是Faster R-CNN-FPN的網路框架圖(或稱為tensor流動圖)。
眾所周知,Faster R-CNN-FPN(主要是Faster R-CNN)是個兩階段的對象檢測方法,主要由兩部分網路組成,RPN和Fast R-CNN。
RPN的作用是以bouding box(後簡稱為box)的方式預測出圖片中對象可能的位置,並過濾掉圖片中絕大部分的背景區域,目標是達到盡量召回圖像中感興趣的對象,預測box盡量能夠與實際對象的box貼合,並且保證一定的預測精度(Precision)。另外,RPN並不需要指出預測的box中對象具體的類別,RPN預測的box稱為RoI(Region of Interest),由於是以box的方式輸出,所以後面我們統一將其稱為proposal box。
Fast R-CNN則是在FPN預測的proposal box基礎上進一步預測box中對象具體的類別,並對proposal box進行微調,使得最終預測的box盡量貼合目標對象。大致的做法是根據RPN預測的proposal box,從原圖backbone的feature map上通過RoIPooling或RoIAlign(Faster R-CNN-FPN使用RoIAlign)提取每個proposal box對應區域的feature map,在這些區域feature map上進一步預測box的類別和相對proposal box的偏移量(微調)。另外,RPN和Fast R-CNN共用同一個backbone網路提取圖像的feature map,大大減少了推理耗時。
從上面的介紹可以看出,RPN和Fast R-CNN的配合作用其實可以理解為一種注意力機制,先大致確定目標在視野中的位置,然後再鎖定目標仔細觀察,確定目標的類別和更加精確的位置,簡單來說就是look twice,相比單階段的look once,當然是比較耗時的,但也換來了更好的效果(雖然很多單階段方法號稱已經獲得相當或好於兩階段的效果)。
下面以Faster R-CNN-FPN發展順序的匯總介紹每個改進的核心思想。
在R-CNN中,CNN只被用來作為特徵抽取,後接SVM和線性回歸模型分別用於分類和box修正回歸。在此基礎上,Fast R-CNN直接對原輸入圖進行特徵抽取,然後在整張圖片的特徵圖上分別對每個RoI使用RoIPooling提取(後面會介紹RoIPooling的原理)特定長度的特徵向量(論文中空降尺寸為7*7),去掉SVM和線性回歸模型,在特徵向量上直接使用若干FC層進行回歸,然後分別使用兩個FC分支預測RoI相關的類別和box,從而顯著提升速度和預測效果。 整體框架圖如下:
在Fast RCNN的基礎上進一步優化,用CNN網路代替Fast R-CNN中的region proposal模塊(使用傳統Selective Search方法),從而實現了全神經網路的檢測方法,在召回和速度上都超過了傳統的Selective Search。作者將提供proposal region的網路稱為RPN(Region Proposal Network),與檢測網路Fast RCNN共享同一backbone,大大縮減了推理速度。
RPN在backbone產生的feature map(圖中的conv feature map)之上執行 的滑窗操作,每個滑窗范圍內的feature map會被映射為多個proposal box(圖中的reg layer分支)以及每個box對應是否存在對象的類別信息(圖中的cls layer分支)。由於CNN天然就是滑窗操作,所以RPN使用CNN作為窗口內特徵的提取器(對應圖中的intermediate layer,後面簡稱為「新增CNN層」),窗口大小 ,將feature map映射為較低維的feature map以節省計算量(論文中為256)。雖然只使用了 的卷積,但是在原圖上的有效的感受野還是很大的,感受野大小不等於網路的降采樣率,對於VGG網路,降采樣率為16,但是感受野為228像素。類似於Fast-RCNN,為了分別得到box和box對應的類別(此處類別只是表示有沒有目標,不識別具體類別),CNN操作之後會分為兩個子網路,它們的輸入都是新增CNN層輸出的feature map,一個子網路負責box回歸,一個負責類別回歸。由於新增CNN層產生的feature map的每個空間位置的特徵(包括通道方向,shape為 )都被用來預測映射前窗口對應位置是否存在對象(類別)和對象的box,那麼使用 的CNN進行計算正合適(等效於FC層),這便是RPN的做法。綜上所述,所有滑窗位置共享一個新增CNN層和後續的分類和box回歸分支網路。下圖是RPN在一個窗口位置上執行計算的原理示意。
由於滑窗操作是通過正方形的CNN卷積實現的,為了訓練網路適應不同長寬比和尺寸的對象,RPN引入了anchor box的概念。每個滑窗位置會預置k個anchor box,每個anchor box的位置便是滑窗的中心點,k個anchor box的長寬比和尺寸不同,作者使用了9種,分別是長寬比為 、 和 ,尺寸為 , 和 的9種不同組合。分類分支和box回歸分支會將新增CNN層輸出的feature map的每個空間位置的tensor(shape為 )映射為k個box和與之對應的類別,假設每個位置的anchor box數量為k(如前所述, ),則分類分支輸出的特徵向量為2k(兩個類別),box回歸分支輸出為4k(4為box信息,box中心點x坐標、box中心點y坐標、box寬w和box高h)。box分支預測的位置(x,y,w,h)都是相對anchor box的偏移量。從功能上來看,anchor box的作用有點類似於提供給Fast RCNN的propsal box的作用,也表示目標可能出現的位置box,但是anchor box是均勻采樣的,而proposal box是通過特徵抽取(或包含訓練)回歸得到的。由此可以看出,anchor box與預測的box是一一對應的。從後文將會了解到,通過anchor box與gt box的IoU的關系,可以確定每個預測box的正負樣本類別。通過監督的方式讓特定的box負責特定位置、特定尺寸和特定長寬比的對象,模型就學會了擬合不同尺寸和大小的對象。另外,由於預測的box是相對anchor box的偏移量,而anchor box是均勻分布在feature map上的,只有距離和尺寸與gt box接近(IoU較大)的anchor box對應的預測box才會與gt box計算損失,這大大簡化了訓練,不然會有大量的預測box與gt box計算損失,尤其是在訓練初始階段,當一切都是瞎猜的時候。
在Faster RCNN基礎上,將backbone替換為ResNet50或ResNet101,涉及部分細節的改動,我們放在本文的細節部分進行描述。
在Faster RCNN-ResNet基礎上,引入FPN(特徵金字塔網路)模塊,利用CNN網路天然的特徵金字塔特點,模擬圖像金字塔功能,使得RPN和Fast RCNN可以在多個尺度級別(scale level)的feature map上分別預測不同尺寸的對象,大大提高了Faster RCNN的檢測能力。相比圖像金字塔大大節省了推理時間。原理如下圖所示:
從上圖中可以看出,FPN並不是簡單地使用backbone的多個CNN層輸出的feature map進行box回歸和分類,而是將不同層的feature map進行了top-down和lateral connection形式的融合後使用。這樣便將CNN網路前向傳播(bottom-up)產生的深層語義低解析度特徵與淺層的淺語義高解析度的特徵進行融合,從而彌補低層特徵語義抽象不足的問題,類似增加上下文信息。其中,top-down過程只是簡單地使用最近鄰插值將低解析度的feature map上采樣到即將與之融合的下層feature map相同的尺寸(尺寸上采樣到2倍),lateral connection則是先將低層的feature map使用 的卷積縮放為即將與之融合的上層feature map相同的通道數(減少計算量),然後執行像素級相加。融合後的feature map不僅會用於預測,還會繼續沿著top-down方向向下傳播用於下層的特徵融合,直到最後一層。
mask R-CNN提出的RoI Align緩解了RoIPooling的缺陷,能夠顯著提升小目標物體的檢測能力。網上介紹RoIPooling和RoIAlign的文章很多,此處不再贅述,推薦閱讀個人覺得比較好的兩篇博客: RoIPooling 和 RoIAlign 。
此處稍微啰嗦下個人對RoIPooling的思考: 為什麼RoIPooling不使用自適應的池化操作,即根據輸入的feature map的尺寸和希望輸出的feature map尺寸,自動調整池化窗口的大小和步長以計算想要尺寸的feature map,類似於自適應池化操作,而不是將輸入的feature map劃分成均勻的小區域(bins,論文中劃分為 個bins),然後每個小區域中分別計算MaxPooling。不管計算上是否高效,至少這種做法在輸入的feature map尺寸(比如 )小於期望的輸出feature map尺寸(比如 )時會失效,因為在3*3的feature map上如果不使用padding的話是無法得到 的特徵的,而使用padding又是很低效的操作,因為要擴展局部feature map的尺寸,而使用劃分bins的方法,即使輸出的feature map尺寸遠小於要輸出的feature map尺寸,也僅僅是在同一位置采樣多次而已。
本人之前介紹YOLOv3的 文章 也介紹過anchor box的作用,再加上本文1.1.2節中的介紹應該比較全面了,不再贅述。
此處的絕大部分細節來自論文,論文中未提及的部分,主要參考了mmdetection中的 實現 。
整個模型的網路結構可以劃分為四個部分,分別為backbone、FPN、RPN head和Fast RCNN head。
1.backbone: 原圖短邊被resize到800像素,這里值得注意的是,如此resize後一個batch內的每張圖片的大小很有可能並不一致,所以還無法合並為一個輸入矩陣,普遍的做法是將batch內的每張圖片的左上角對齊,然後計算resize後batch內所有圖片的最大寬和高,最後按照最大寬或高分別對每張圖片的寬或高進行0值padding;輸出為4個不同尺寸的feature map(C2、C3、C4、C5)。
2.FPN: ResNet backbone產生的4個不同尺寸的feature map(C2、C3、C4、C5)作為輸入,輸出5個不同尺寸的feature map(P2、P3、P4、P5、P6),P6是對P5進行2倍降采樣得到,每個feature map的通道數為固定的256;使用P6的原因是為了預測更大尺寸的對象。
3.RPN:輸入為FPN產生的feature map(P2、P3、P4、P5、P6);由於RPN是在5個輸入feature map上進行獨立的預測,則每個feature map都會輸出 proposal box,因此不可能將所有的proposal box都提供給Fast R-CNN,這里的做法是對每個feature map上產生的proposal box按類別概率進行排序(每個feature map上的proposal box獨立進行),然後選擇前k個proposal box, 5個feature map一共會 產生 個proposal box,訓練時 ,推理時 。最後,將所有的 個proposal box合並後統一進行NMS(IoU threshold=0.7)去掉冗餘的box,最後選擇前m個輸出給Fast R-CNN,訓練和測試時m都取1000。
訓練時將gt box通過下面的公式轉換為相對anchor box的偏移值,與網路的預測計算loss,至於將每個gt與具體的哪個anchor box計算偏移,則需要根據2.3.1節中的正負樣本方法來確定。測試時將預測的box通過該公式中的逆運算計算出當前box相對原圖的位置和大小, , , , 指相對全圖的box中心點坐標以及寬和高, , , , 指每個anchor相對全圖的box中心點坐標以及寬和高。由此可以看出,box回歸分支直接預測的便是相對anchor的偏移值,即公式中的 、 、 和 。
以上提到的2000和1000是作為Fast R-CNN的輸入proposal box,在訓練時參與RPN loss計算的anchor boxs數量為256個,正負樣本數量為 ,正樣本不足128的用負樣本補足。這里的256是從所有feature map中的anchor box中選擇的,並非每個feature map都獨立取得256個正負樣本。這也是合理的,因為每個gt box由於尺寸的原因,幾乎不可能與所有feature map上的anchor box的IoU都大於一定的閾值(原因參考2.3.1節)。注意選擇前並未進行NMS處理,而是直接根據2.3.1節中確定正負樣本的方式確定每個預測box正負類別,然後分別在正樣本中隨機選擇128個正樣本,在負樣本中隨機選擇128個負樣本。
4.Fast R-CNN:輸入為FPN產生的前4個feature map和RPN輸出的proposal box,4個feature map為P2、P3、P4、P5,與backbone對應,不使用P6。那麼,如何確定在哪個feature map上執行每個proposal box對應的RoIAlign操作並得到 大大小的feature map呢?論文中的做法是通過下面的公式將特定尺寸的proposal box與FPN產生的4個feature map中尺寸最適合的對應起來,即讓感受野更接近對象尺寸的feature map預測該對象 ,其中224為backbone在ImageNet上預訓練的尺寸,w和h為proposal box的長和寬,k表示適合尺寸為w和h的propsal box的feature map的位置,即4個feature map為P2、P3、P4、P5的下標,k_0為proposal box大致為224*224時對應feature map位置值( ),表示proposal box大致為 時在P4上執行RoIAlign,小於 時,在P2或P3上執行,大於則在P5上。
網路都會針對每個RoI會輸出一個類別概率分布(包括背景類別)和一個相對RoI box的長度為4的box偏移向量。概率分支由softmax激活函數得到。與RPN的類似,訓練時,如2.4.2節loss計算中所述,會將gt box通過下面的公式轉換為相對proposal box(前提是該RoI是正樣本)的偏移量,然後使用loss計算公式直接與預測的相對偏移量進行loss計算;測試時,會通過下列公式的逆運算將偏移值換算回相對原圖的位置box,然後使用NMS去掉冗餘的box,最終輸出。
訓練時,通過2.3.2中的方式確定每個proposal box屬於正樣本或負樣本後,隨機選擇512個樣本,其中正負比例為1:3進行loss計算,正樣本不足的由負樣本補足。
在RPN中,由於每個feature map的每個滑窗位置上的張量( 維張量,C為feature map的通道數)會被用來預測k個box和每個box對應的類別概率,那麼具體哪個box才能參與gt box的損失計算(包括類別和box回歸損失)?這便需要在所有預測的box中確定正負樣本,因為一個anchor對應一個預測的box和類別,那麼確定預測的box是正例還是負例等價於確定anchor box的是正例還是反例。為了便於訓練,RPN中使用雙IoU閾值的方式確定正負樣本,與gt box的IoU為最大或者大於0.7的anchor box被設置為正樣本,這會導致一個gt box與多個預測box計算損失,即允許多個box預測同一對象,與gt box的IoU小於0.3的anchor box被設置為負樣本,其餘的忽略掉,即不參與loss計算。在此基礎上,如2.2節中所述,會對正負樣本進行隨機采樣,總數為256,其他不參與損失函數計算。
與gt box的IoU大於0.5的proposal box作為正樣本,注意,是將proposal box與gt box計算IoU,Fast-RCNN中的proposal box的作用與anchor box有些類似,即確定正負樣本和預測的box 都是針對它們的偏移值 ,其餘IoU在 之間的作為負樣本,低於0.1的作為難例挖掘時的啟發式樣本(mmdetection中的做法是單閾值方式,與gt box的IoU大於0.5的proposal box作為正樣本,小於的都是負樣本)。
Faster R-CNN中是以分步的方式聯合訓練RPN和Fast R-CNN,大致的過程為:
但在mmdetection中,已經將RPN和Fast R-CNN的loss進行權重加和,從而進行聯合訓練,訓練流程簡化很多,且能夠達到相同的效果。
確定了每個預測box或anchor box的正負類別後,便可以計算損失函數了,類似於Fast RCNN的做法,只有正樣本的box才會參與box損失計算,損失函數如下:
為類別損失為類別損失函數,使用交叉熵損失, 為box回歸損失,使用smooth L1損失,論文中平衡因子lambda為10。 表示第i個anchor box對應的gt 類別(背景為0,對象為1), 為gt box相對anchor box的偏移量(如果該anchor box被確定為正樣本),通過下面的公式計算得到, 即表示只有 ,即為正樣本時才會計算box的損失。
Fast R-CNN的loss類似於RPN,只有proposal box為非背景類別(正樣本)時才計算box損失, 為類別損失, 為box損失, 表示proposal box的 , 時表示背景(通過2.3.2的方式確定proposal box的類別)。 為平衡因子,作者所有實驗中 。為了防止box回歸的L2 loss放大雜訊(異常loss)從而影響訓練,作者將L2 loss修改為 loss,當box尺寸的差異較大時使用L1 loss,抑制異常值對梯度的貢獻。
其中v是通過下面的公式將gt box( , , , )轉換得到,其中,( , , , )為proposal box的在原圖中的中心點坐標和寬與高。
在Faster R-CNN和Faster R-CNN-ResNet中,由於RPN只是在單尺寸的feature map上進行滑窗,為了緩解多尺寸的問題,每個滑窗位置會設計多個尺寸的anchor,但是在Faster R-CNN-FPN中使用了FPN,則天然就具有了適應對象多尺寸的問題,因此不用再為每個滑窗設計多個尺寸的anchor。即在Faster RCNN-FPN中,為每種尺寸feature map上的滑窗只設計了單一尺寸多種長寬比的anchor,長寬比有 、 和 ,不同feature map上anchor的尺寸為: , , , 和 ,依次對應P2、P3、P4、P5和P6。
COCO上的訓練細節:RPN的weight decay為0.0001,SGD的 ,初始學習率為0.002,學習率調整使用step decay方式。
『伍』 SPP-net文章詳細解讀
文章 《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》 是在RCNN之後,是對RCNN的改進(關於RCNN可以查看 R-CNN文章詳細解讀 ),先給出SPP-net總的框架圖如下
該文章主要改進兩點:
1. CNN需要固定輸入圖像的尺寸,導致不必要的精度損失
2. R-CNN對候選區域進行重復卷積計算,造成計算冗餘
1.為什麼CNNs要固定輸入圖像的尺寸?
CNN主要有兩部分組成:卷積層和全連接層。卷積層以滑動窗口方式操作並輸出表示各個響應激活空間分布的特徵圖。實際上,卷積層不需要輸入的圖像尺寸固定,並且可以產生任意尺寸的特徵圖。但另一方面,完全連接層需要具有固定大小/長度的輸入。 因此,固定輸入大小的約束只是來自存在於網路更深層階段的全連接層。
解決辦法(對比R-CNN, SPP-net):
如下圖所示
第一行中的圖像即為要求固定尺寸輸入的CNN對圖像的處理方式
第二行為要求固定尺寸輸入的CNN (如R-CNN)的處理流程,先將圖片按照類似第一行中的方式進行處理,然後輸入卷積以及全連接層,最後輸出結果
第三行為SPP-net的處理方式,不固定圖像的大小,直接輸入給卷積層處理,卷積出來的特徵並不是直接輸入給全連接層,而是先給SPP層處理,然後得到一個固定長度的輸出傳給全連接層,最後輸出結果。
2.R-CNN為什麼會有計算冗餘?
如下圖所示
R-CNN對於一張圖片,先使用segment seletive方法提取出約2000個候選區域,然後將這兩千個候選區域分別送入網路中,即一張圖片要經歷2000次前向傳播,這樣會造成大量冗餘。
SPP-net則提出了一種從候選區域到全圖的特徵(feature map)之間的對應映射關系,通過此種映射關系可以直接獲取到候選區域的特徵向量,不需要重復使用CNN提取特徵,從而大幅度縮短訓練時間。每張圖片只需進行一次前向傳播即可。
下面來詳細講解一下改進的方法:
1.SPP層(spatial pyramid pooling)
首先要明確的是這一層的位置,這一層加在最後一個卷積層與全連接層之間,目的就是為了輸出固定長度的特徵傳給要求固定輸入的全連接層
SPP層的結構如下圖所示
SPP層的輸入:
如下圖灰色框所示
最後一層卷積輸出的特徵(我們稱為feature map),feature map為下圖的黑色部分表示,SPP層的輸入為與候選區域對應的在feature map上的一塊區域
上面這句話可能有點繞,我們可以理解為一張圖有約2000個候選區域,而對一張圖做完卷積後得到feature map,在這個feature map上也有約2000個與候選區域對應的區域(這里的對應關系下面會詳細講解)
SPP層的輸出:
SPP layer分成1x1,2x2,4x4三個pooling結構(這部分結構如下圖所示),對每個輸入(這里每個輸入大小是不一樣的)都作max pooling(論文使用的),出來的特徵再連接到一起,就是(16+4+1)x256的特徵向量。
無論輸入圖像大小如何,出來的特徵固定是(16+4+1)x256維度。這樣就實現了不管圖像中候選區域尺寸如何,SPP層的輸出永遠是(16+4+1)x256特徵向量。
2.候選區域在原圖與feature map之間的映射關系
這部分的計算其實就是感受野大小的計算。
在CNN中感受野(receptive fields)是指某一層輸出結果中一個元素所對應的上一層的區域大小,如下圖所示。
先定義幾個參數,參數的定義參考吳恩達在cousera講解中對符號的定義,然後再講解怎麼計算
輸入的尺寸大小與輸出的尺寸大小有如下關系:
上面是區域尺寸大小的對應關系,下面看一下坐標點之間的對應關系
SPP-net對上面的坐標對應關系作了一定的簡化,簡化過程如下:
而 是坐標值,不可能取小數 所以基本上可以認為 。公式得到了化簡:感受野中心點的坐標 只跟前一層 有關。
那麼對於下圖的做法,就是SPP-net的映射方法,SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的兩個對應點。 有了feature map上的兩隊角點就確定了 對應的 feature map 區域(下圖中橙色)。
從原圖坐標 到特徵圖中坐標 的映射關系為
到這里就把SPPNet的核心思想講完了,SPPNet網路後面和R-CNN類似,詳細參考 R-CNN文章詳細解讀 。該文章還用這些思想做了圖像分類的實驗,感興趣可以細讀原文的分類部分。
參考:
『陸』 目標檢測演算法圖解:一文看懂RCNN系列演算法
姓名:王咫毅
學號:19021211150
【嵌牛導讀】CNN如此風靡,其衍生演算法也是層出不窮,各種衍生演算法也可以應用於各種應用場景,各類場合。本文則是了解每個衍生演算法的各個使用場景、原理及方法。
【嵌牛鼻子】RCNN 目標檢測
【嵌牛提問】RCNN系列演算法有何區別和聯系?
【嵌牛正文】
在生活中,經常會遇到這樣的一種情況,上班要出門的時候,突然找不到一件東西了,比如鑰匙、手機或者手錶等。這個時候一般在房間翻一遍各個角落來尋找不見的物品,最後突然一拍大腦,想到在某一個地方,在整個過程中有時候是很著急的,並且越著急越找不到,真是令人沮喪。但是,如果一個簡單的計算機演算法可以在幾毫秒內就找到你要找的物品,你的感受如何?是不是很驚奇!這就是對象檢測演算法(object detection)的力量。雖然上述舉的生活例子只是一個很簡單的例子,但對象檢測的應用范圍很廣,跨越多個不同的行業,從全天候監控到智能城市的實時車輛檢qian測等。簡而言之,物體檢測是強大的深度學習演算法中的一個分支。
在本文中,我們將深入探討可以用於對象檢測的各種演算法。首先從屬於RCNN系列演算法開始,即RCNN、 Fast RCNN和 Faster RCNN。在之後的文章中,將介紹更多高級演算法,如YOLO、SSD等。
1.解決對象檢測任務的簡單方法(使用深度學習)
下圖說明了對象檢測演算法是如何工作。圖像中的每個對象,從人到風箏都以一定的精度進行了定位和識別。
下面從最簡單的深度學習方法開始,一種廣泛用於檢測圖像中的方法——卷積神經網路(CNN)。如果讀者對CNN演算法有點生疏,建議 閱讀此文 。
這里僅簡要總結一下CNN的內部運作方式:
首先將圖像作為輸入傳遞到網路,然後通過各種卷積和池化層處理,最後以對象類別的形式獲得輸出。
對於每個輸入圖像,會得到一個相應的類別作為輸出。因此可以使用這種技術來檢測圖像中的各種對象。
1.首先,將圖像作為輸入;
2.然後,將圖像分成不同的區域;
3.然後,將每個區域視為單獨的圖像;
4.將所有這些區域傳遞給CNN並將它們分類為各種類別;
5.一旦將每個區域劃分為相應的類後,就可以組合所有這些區域來獲取具有檢測到的對象的原始圖像:
使用這種方法會面臨的問題在於,圖像中的對象可以具有不同的寬高比和空間位置。例如,在某些情況下,對象可能覆蓋了大部分圖像,而在其他情況下,對象可能只覆蓋圖像的一小部分,並且對象的形狀也可能不同。
基於此,需要劃分大量的區域,這會花費大量的計算時間。因此,為了解決這個問題並減少區域數量,可以使用基於區域的CNN,它使用提議方法選擇區域。
2.基於區域的卷積神經網路
2.1 RCNN的思想
RCNN演算法不是在大量區域上工作,而是在圖像中提出了一堆方框,並檢查這些方框中是否包含任何對象。RCNN 使用選擇性搜索從圖像中提取這些框。
下面介紹選擇性搜索以及它如何識別不同的區域。基本上四個區域形成一個對象:不同的比例、顏色、紋理和形狀。選擇性搜索在圖像中識別這些模式,並基於此提出各種區域。以下是選擇性搜索如何工作的簡要概述:
首先, 將圖像作為輸入:
然後,它生成初始子分段,以便獲得多個區域:
之後,該技術組合相似區域以形成更大的區域(基於顏色相似性、紋理相似性、尺寸相似性和形狀兼容性):
最後,這些區域產生最終的對象位置(感興趣的區域);
下面是RCNN檢測對象所遵循的步驟的簡要總結:
1.首先採用預先訓練的卷積神經網路;
2.重新訓練該模型模型——根據需要檢測的類別數量來訓練網路的最後一層(遷移學習);
3.第三步是獲取每個圖像的感興趣區域。然後,對這些區域調整尺寸,以便其可以匹配CNN輸入大小;
4.獲取區域後,使用SVM演算法對對象和背景進行分類。對於每個類,都訓練一個二分類SVM;
最後,訓練線性回歸模型,為圖像中每個識別出的對象生成更嚴格的邊界框;
[對上述步驟進行圖解分析]( http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf ):
首先,將圖像作為輸入:
然後,使用一些提議方法獲得感興趣區域(ROI)(例如,選擇性搜索):
之後,對所有這些區域調整尺寸,並將每個區域傳遞給卷積神經網路:
然後,CNN為每個區域提取特徵,SVM用於將這些區域劃分為不同的類別:
最後,邊界框回歸(Bbox reg)用於預測每個已識別區域的邊界框:
以上就是RCNN檢測物體的全部流程。
2.2 RCNN的問題
從上節內容可以了解到RCNN是如何進行對象檢測的,但這種技術有其自身的局限性。以下原因使得訓練RCNN模型既昂貴又緩慢:
基於選擇性搜索演算法為每個圖像提取2,000個候選區域;
使用CNN為每個圖像區域提取特徵;
RCNN整個物體檢測過程用到三種模型:
CNN模型用於特徵提取;
線性svm分類器用於識別對象的的類別;
回歸模型用於收緊邊界框;
這些過程相結合使得RCNN非常慢,對每個新圖像進行預測需要大約40-50秒,這實際上使得模型在面對巨大的數據集時變得復雜且幾乎不可能應用。
好消息是存在另一種物體檢測技術,它解決了RCNN中大部分問題。
3.了解Fast RCNN
3.1Fast RCNN的思想
RCNN的提出者Ross Girshick提出了這樣的想法,即每個圖像只運行一次CNN,然後找到一種在2,000個區域內共享該計算的方法。在Fast RCNN中,將輸入圖像饋送到CNN,CNN生成卷積特徵映射。使用這些特徵圖提取候選區域。然後,使用RoI池化層將所有建議的區域重新整形為固定大小,以便將其饋送到全連接網路中。
下面將其分解為簡化概念的步驟:
1.首先將圖像作為輸入;
2.將圖像傳遞給卷積神經網路,生成感興趣的區域;
3.在所有的感興趣的區域上應用RoI池化層,並調整區域的尺寸。然後,每個區域被傳遞到全連接層的網路中;
4.softmax層用於全連接網以輸出類別。與softmax層一起,也並行使用線性回歸層,以輸出預測類的邊界框坐標。
因此,Fast RCNN演算法中沒有使用三個不同的模型,而使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回所標識類的邊界框。
對上述過程進行可視化講解:
將圖像作為輸入:
將圖像傳遞給卷積神經網路t,後者相應地返回感興趣的區域:
然後,在提取的感興趣區域上應用RoI池層,以確保所有區域具有相同的大小:
最後,這些區域被傳遞到一個全連接網路,對其進行分類,並同時使用softmax和線性回歸層返回邊界框:
上述過程說明了Fast RCNN是如何解決RCNN的兩個主要問題,即將每個圖像中的1個而不是2,000個區域傳遞給卷積神經網路,並使用一個模型來實現提取特徵、分類和生成邊界框。
3.2Fast RCNN的問題
Fast RCNN也存在一定的問題,它仍然使用選擇性搜索作為查找感興趣區域的提議方法,這是一個緩慢且耗時的過程,每個圖像檢測對象大約需要2秒鍾。
因此,又開發了另一種物體檢測演算法——Faster RCNN。
4.了解Faster RCNN
4.1. Faster RCNN的思想
Faster RCNN是Fast RCNN的修改版本,二者之間的主要區別在於,Fast RCNN使用選擇性搜索來生成感興趣區域,而Faster RCNN使用「區域提議網路」,即RPN。RPN將圖像特徵映射作為輸入,並生成一組提議對象,每個對象提議都以對象分數作為輸出。
以下步驟通常採用Faster RCNN方法:
1.將圖像作為輸入並將其傳遞給卷積神經網路,後者返回該圖像的特徵圖;
2.在這些特徵圖上應用RPN,返回提議對象及其分數;
3.在這些提議對象上應用RoI池層,以將所有提案降低到相同的大小;
4.最後,將提議傳遞到全連接層,該層在其頂部具有softmax層和線性回歸層,以對對象的邊界框進行分類和輸出;
這里簡要解釋一下RPN是如何運作的:
首先,Faster RCNN從CNN獲取特徵圖並將它們傳遞到區域提議網路。RPN在這些特徵圖上使用滑動窗口,每個窗口生成不同形狀和大小的k個方框( Anchor boxe):
方框是固定尺寸的邊界箱,具有不同的形狀和尺寸。對於每個方框,RPN預測兩件事:
預測錨是對象的概率;
用於邊界框回歸器調整錨點以更好地適合物體的形狀;
在有了不同形狀和大小的邊界框後,將其傳遞到RoI池層。對每個提案並對其進行裁剪,以便每個提案都包含一個對象。這就是RoI池層所做的事情,它為每個方框提取固定大小的特徵圖:
然後將這些特徵圖傳遞到全連接層,該層具有softmax和線性回歸層,最終對對象進行分類並預測已識別對象的邊界框。
4.2Faster RCNN的問題
上述討論過的所有對象檢測演算法都使用區域來識別對象,且網路不會一次查看完整圖像,而是按順序關注圖像的某些部分,這樣會帶來兩個復雜性的問題:
該演算法需要多次通過單個圖像來提取到所有對象;
由於不是端到端的演算法,不同的系統一個接一個地工作,整體系統的性能進一步取決於先前系統的表現效果。
鏈接: https://www.jianshu.com/p/51fc039ae7a4
『柒』 R-CNN 系列 object detection 演算法
在 object detection 領域,近 5 年的突破性進展似乎都與一個名字有關系:Ross Girshick。梳理從 R-CNN,Fast R-CNN, Faster R-CNN 到 Mask R-CNN 等各種經典模型,Ross Girshick 都是作者之一,甚至連 YOLO 的作者中也出現了 Ross Girshick 的名字。
這位大神簡歷如下:
從演算法到實現框架再到數據集,這位大神實現了一條龍的突破~
本文的目的是整理總結 R-CNN 系列演算法的發展歷程和模型本身的核心思想,不涉及太多技術細節(例如訓練數據預處理,超參數設置等)。
參考文獻主要是上述各演算法的原文以及下列資源:
R-CNN,一般認為全稱是 Region-based CNN 或者作者原文中提到的 Regions with CNN features。
概括地說,R-CNN 的步驟如下圖所示:
下面詳細介紹 R-CNN 中的關鍵環節。
對於輸入的圖片,首先利用 selective search 演算法 生成約 2000 個 region。關於 selective search 演算法可以參考 原文 ,也可以參考 我們之前的博客文章 。原文中提到 R-CNN 對各種 region proposal 演算法沒有偏好,之所以選擇 selective search 演算法僅僅是為了方便與前人工作做對比。
這一部分的目的是對於每一個 region,通過 CNN (原文選用 AlexNet) 進行特徵提取,得到統一長度的 feature vector,以便後續的分類。
由於每個 region 的大小差別比較大,而 AlexNet 默認接收 227×227 pixel 的圖片,這里就需要對 region 做一些預處理,主要是 region 大小的轉化。
要把一個任意大小的圖片轉化成 227×227 像素的圖片方法有很多,原文中介紹了 4 種方式:
分別是:
最終作者選擇了 warp + padding 的方式,一方面 warp 相對來說是最簡單的,直接把任意大小的圖片縮放成 227×227 即可,另外 padding 是在原 region 周圍稍微添加了一些像素點,從實際效果看提高了檢測正確率。
將統一大小的 region 送入 CNN 中,進行特徵提取。 如何得到這個 CNN 也是一個問題。
針對目標檢測的數據集 ILSVRC detection dataset 包含了 200 類物體,PASCAL VOC (Visual Object Classes) 包含了 20 類物體。相對來說帶有標簽的訓練數據比較少,不足以訓練一個大型的 CNN,因此採用了 transfer learning 的技術。原文中並沒有提到 transfer learning 這個名詞,只是說 fine-tuning 。
首先借用在 ImageNet 上已經訓練好的 CNN 模型(最初的文章中用了 AlexNet,後來 arXiv 上新版文章中用了 VGG,效果提升很明顯),然後在 PASCAL 數據集上進行 fine-tuning。這里對 AlexNet 網路結構的改變只是將原本對應 ImageNet 1000 類輸出的 classification layer 替換成了對應 N+1 類輸出的 classification layer,該層權重隨機初始化。對於 PASCAL 數據集 N=20,ILSVRC 數據集 N=200,另外 +1 對應 background 類型。
經過 fine-tuning 之後,CNN softmax layer 之前的 4096 維向量即為該 region 的 feature vector.
得到 region 的 feature vector 之後,送入 SVM 進行最後的分類。
這里 SVM 的訓練是針對不同類型的物體分開進行的,每一類訓練一個 SVM,它只給出針對這一類物體的分類結果。之所以最後用 SVM 分類,而不是直接用 CNN 的 softmax 進行分類,原文作者的解釋是嘗試過 softmax 之後發現效果比 SVM 差一些,但是同時指出如果調整一些訓練策略,softmax 和 SVM 之間的差距有可能縮小。這也為後來基於 R-CNN 的改進埋下了伏筆。
得到所有 region 對應的檢測結果(即包含某種類型物體的概率 score)之後,還有一步操作: Non-Maximum Suppression (NMS) 。如果兩個 region 檢測到同一類物體,比如都檢測到了行人,一個 region score 較高,而另一個 score 較低,當這兩個 region 的 IoU (intersection-over-union) 超過某個閾值時,即它們重合較多時,只保留那個 score 較高的 region.
object detection 的任務除了檢測圖中的物體,還要給出定位,即用 bounding box 盡量准確的圈出該物體。前邊基於 region 的分類過程可能能夠正確辨識出 region 中的物體,但是初始的 region 並不一定是一個合適的 bbox。在 R-CNN 最後又添加了一個線性回歸模型,基於 feature vector 來預測正確的 bbox 相對於 region 的位置變換,即預測 bbox 應該如何調整。這個訓練過程也是 class-specific 的。
在最終使用時,R-CNN 輸出包含兩部分:
理論上來說,更新 bbox 的位置之後,應該在新的 bbox 中重新進行分類,這樣准確度可能更高一些,但是原文作者發現實際上並沒有明顯改進。因此,實際使用中並沒有對新的 bbox 重新分類。
總的來說,上述 R-CNN 的訓練是分多步走的:先是 fine-tuning 一個 CNN 得到 feature vector,然後訓練 SVM 進行分類,最後還要再訓練一個線性回歸環節預測 bounding box 的調整。
Fast R-CNN 的改進是不再使用獨立的 SVM 和線性回歸,而是統一用 CNN 將這三個環節整合起來。Fast R-CNN 在訓練時間和檢測時間方面比當時已有的其他演算法快若干數量級。
Fast R-CNN 整體框架如下:
基本步驟:
在上述各環節中,我認為比較關鍵的有兩個:一是 RoI projection,即將 image 上的 RoI 映射到 feature map 上的 RoI。二是通過 RoI pooling layer 將 feature map 上不同大小的 RoI 轉化成統一大小的 sub feature map。而這兩個環節都借鑒了 SPPnets ,其中 RoI pooling layer 是 SPPnets 中 Spatial Pyramid Pooling layer 的特例。
原本 R-CNN 是在原圖上選取若干RoI,然後經過 CNN 處理,最後提取出 feature vector。對於每個圖片上不同的 RoI 來說,從輸入到輸出沒有任何共享的東西。
RoI projection 的作用是將 R-CNN 中對 image RoI 的處理推遲到了 feature map 上,這樣可以讓一個 image 的所有 RoI 共享從 image 到 feature map 的卷積處理過程。這很顯然會加速訓練和測試過程。至於如何將 image RoI 映射到 feature map RoI,已經有了 非常細致的討論 ,這里不再贅述。
如何將 feature map 上不同大小的 RoI 轉化成統一大小的 sub feature map? 這里 有非常直觀的動畫演示。
概括如下:
假設我們已經得到下面的 feature map (只考慮 2D)
其中 RoI 為黑框部分,大小為 。
我們希望將 RoI 轉化成 2×2 大小,可以選擇一個 2×2 的窗口如下
對每一個格子進行 max pooling 操作,得到如下的 2×2 的 feature map
總的來說,如果 RoI 大小為 ,希望得到的 feature map 大小為 ,則窗口中格子數目為 。可以根據具體情況向上或向下取整。
結合實際應用,如果 CNN 網路選用 VGG16,結構如下:
將最後一個 max pooling layer 替換為 RoI pooling layer。前部的卷積層對輸入圖片的大小沒有嚴格限制,這一限制主要是在 fully connected layer,所以為了配合 VGG16 網路結構,要確保每個 RoI 輸出的 feature map 依然為 。
對於 VGG16 網路結構的修改還包括:
在 Fast R-CNN 中,region proposal 是由 CNN 網路之外的演算法提供的,例如 selective search。相對於後續的 region recognition 過程,region proposal 這一步實際上是整個演算法的速度瓶頸。
Faster R-CNN 之所以 "Faster",就是因為提出了 Region Proposal Network (RPN) ,加速了 region proposal 過程。Faster R-CNN 本質上就是 RPN + Fast R-CNN.
整個 Faster R-CNN 結構如下:
或者更加詳細的結構如下:
RPN 和 Fast R-CNN 共享從 image 到最後一層 CNN 輸出的 feature map 這一段網路結構。 有些文章 也將 Faster R-CNN 看做三個模塊:用於生成 feature map 的 Feature network,用於生成 region proposal 的 RPN,以及用於最終的 object detection 的 Detection network。我們這里還是採用 RPN + Fast R-CNN 的形式。
RPN 的輸入是原始 image,輸出是 region proposals。在具體實現中,RPN 是 fully convolutional network (FCN),只包含 convolutional layer,原本在分類/回歸中常用的全連通層也由卷積操作替代。
有了 region proposals,後邊的操作與 Fast R-CNN 是相同的。
原文中採用 alternating training 的方式: