1. 程式人生 > >RCNN系列之Faster RCNN詳解

RCNN系列之Faster RCNN詳解

RCNN系列:RCNN,SPPNet,Fast RCNN,Faster RCNN,R-FCN。這一系列是個遞進關係,也是目標檢測使用two-stage方法的一個發展過程。想要更好的理解Faster RCNN和R-FCN,只能把這些演算法都梳理清楚了,才能明白演算法的整個優化過程。 本篇講解的是Faster RCNN。2016年,發表在CVPR。 理解了SPPNet之後,我們知道了RCNN已經進化到了SPPNet階段,那麼,Fast RCNN又更進一步提高了速度。那麼耗時最多的幾乎都來自selective search了。 為了解決這個問題,Faster RCNN終於來了。 多說幾句,起初我看論文的時候是從Faster RCNN開始看的,但是怎麼都看不太明白,為什麼要這樣?為什麼要那樣?都不太清楚,將RCNN的一系列梳理了一遍之後, 才有些恍然大悟的一點感覺。 但是,基礎還是不夠紮實,有些理解還是會出現問題,之後隨著理解的加深,慢慢再更新。 希望看到部落格的讀者,也能這樣從頭開始學RCNN,並不會浪費時間,反而會理解的更加深刻。 再看Fast RCNN過程:
  1. 使用selective search演算法為每一張待檢測的圖片提取出2000左右的候選框,這一點和RCNN相同;
  2. 特徵提取階段,同樣是提取出整張圖片的feature map,然後將原圖上的候選框對映到feature map上。然後對各個候選框對應的feature map上的塊做ROI pooling,提取出固定長度的特徵向量;
  3. 對於上一步的每一個ROI,網路輸出每個類的概率和每個bounding box;
  4. 最後,使用NMS演算法。
經過兩次迭代優化,原始RCNN演算法訓練過程的三步走,現在只有兩步,但是最終還是要使用selective search來做region proposal(候選框的生成)。 那麼能不能使用CNN來做候選框的生成吶? 答案是可以! 由此,RPN(Region Proposal Network)被設計出來了。中文名就是區域生成網路。 Faster RCNN 可以看作是RPN 和 Fast RCNN的結合。 意味著我們把RPN理解透徹就能夠很好的理解Faster RCNN了。 題外話:
這一段算是我的個人總結吧,在起初學習RPN的時候,很不明白,為什麼RPN就能提取物體的候選框了,為什麼要使用Anchor? 這些問題即使看了別人講解RPN的部落格也是一頭霧水,根本不明白。 要理解這些問題,我們要學會用CNN做兩件事情。 第一件:分類,這個問題是隻要接觸了CNN,我們就能基本知道怎麼做,LeNet就是一個10分類,到了後來的AlexNet,VGG是1000分類。 如果這塊還是不明白的話,只能好好推推CNN了。 第二件:迴歸,使用CNN做迴歸,我是開始沒有搞明白。也就是怎麼才能用CNN提取出來物體的bounding box吶? bounding box 不就是學到目標的(x,y,h,w)四個引數嗎?其中(x,y)是目標的在圖片上面的中心座標或者是左上角的座標,h和w是目標框的長寬。 由於這四個引數都是連續的,所以是個迴歸問題。 為了弄明白這個道理,我們從最簡單的開始,比如一張圖中只有一個目標,且這一個目標只有三個種類比如是貓,狗,鼠。 我們只需要利用CNN計算出這一個目標的四個座標引數
類別即可。 那麼我們利用CNN需要得到什麼資訊吶? 首先需要一個引數p來確定這張圖片是否含有目標,p=1代表有目標,p=0代表不含有目標。 如果圖中存在目標,那麼我們還要指定這個目標是三類中哪一個? 這時用SoftMax的方法一般是給出三個種類的概率即用c,d,m分別代表貓狗鼠在圖中出現的概率。 然後存在目標後,我們還要標出目標的位置,也是上文所說的(x,y,h,w)。 那麼我們需要CNN最後輸出的結果即是:(p,c,d,m,x,y,h,w)維的向量即可。 更準確點就是讓CNN的全連線層的最後輸出是8維的向量,其中每一個輸出單元代表了以上含義。 以上過程可以看作是CNN的前向傳播過程,從輸入一張圖片,到輸出這8維向量。 後向傳播最主要的就是設計合理的loss函式,一般常用的loss函式可以按照以下: loss=SoftMax(p,c,d,m)+s*L2((x,y,h,w)-GT) 以上,SoftMax就不用講了,L2範數其實就是歐氏距離(兩點距離),其中s是兩者的權重。 這樣有了loss函式,我們就可以使用後向傳播來反覆迭代了,直到收斂。 這樣單目標的提取目標檢測框的過程就完成了。 理解了CNN做這兩件事的過程,我們再來理解RPN網路,就會變得輕鬆一些了。 在正式開始RPN之前,還是先熟悉一下RPN的基礎網路VGG16: 我們可以看到,VGG16擁有13個conv,3個FC層。RPN用到的是conv3最後一層輸出的feature map。 RPN網路: 有了以上基礎後,我們再看Faster論文中的上圖就很清晰了。 從下到上來看, conv feature map是VGG16最後一層conv3的輸出。 然後RPN在這個feature map上使用3*3的卷積核來進行卷積。 詳細理解一下這個過程,在這裡我們先不考慮 anchor的存在假設feature map的大小的是40*60,那麼使用3*3,pading=1,stride=1進行卷積後,輸出依然是40*60。 那麼針對這40*60個點,每一個點都輸出一個6維的向量,如我們剛才理解的用CNN做迴歸的過程一樣。那麼最後輸出的特徵圖應該是 40*60*6的feature map。 再換個思路理解就是,RPN將輸入圖片分成了40*60格子(要理解的是,這些格子的感受野在原圖上是重疊的),每個格子都會輸出一個用來分類和做迴歸的6維向量。 這樣我們每個格子就會提出一個bounding box,一張圖就可以提出2400個bounding box。這就代替了selective search 來做候選框的生成了。 那還為什麼會有anchor吶? 其實這是由於一些問題出現了。 先考慮一種情況, 如果一個格子中出現了不止一個物體,而我們的RPN在格子中卻只提出了一個bounding box, 那麼帶來的結果必定是漏檢了,這個格子裡面的目標只能找到一個或者都找不到。 再考慮另外一種情況,
比如上面這張圖中,我們假設一個格子中既有人也有馬,人是豎長的格子,馬是橫向比較長的格子,我們的框又該怎麼找吶? 針對這些情況,作者提出了Anchor 的概念,就是在一個格子中,我們不僅僅提取一個box,我們提取出9個尺度,橫縱比不同的box, 這樣會在一個格子中存在9種不同的box,然後我們利用CNN來回歸這些box。 怎麼做迴歸吶? RPN的前向傳播過程: 在一個格子中,RPN會提取出來一個9*(2+4)的向量,其中2代表是否存在目標,4即是bounding box的四個座標。 在前向過程中,RPN在一個格子中提取了9個框,以及每個框的置信度。 Anchor在這裡起的作用,按照我的理解就是初始化上面提取的9個框。 這樣每個格子的9個框就會有了初始的大小。 起初在這裡我也有疑問,為什麼要用Anchor初始化啊,不加上Anchor也是可以提取出來9個框的啊? 但是,CNN的訓練過程我們是不可控的,雖然在一個格子中是可以提取到9個框,但是我們不能確定這9個框可能是迴歸到了同一個吶? 那就還是會出現馬和人在一個格子中,我們可能只能找到一個目標。當然也可能可以找到兩個。這些是不確定的。 但是,我們要增大我們能同時找到所有目標的概率。 這就是Anchor了。 其中按照一定的規則來拋棄一些box。規則可以參考以下: 再囉嗦一句,起初RPN提取的9個框和置信度的偏差肯定很大,所以需要後向傳播的迭代優化。 RPN的後向傳播過程: CNN的後向傳播最關鍵的就是要找到合適的loss,在有了合適的loss函式後,CNN就能迭代優化了。 RPN的loss函式: 其中具體字母代表的含義可以參考論文,只要明白了是分類和迴歸座標的結合就可以了。 這樣在每一張圖片中就可以得到了40*60*9個bounding box,經過以上的分析,這些框是可以基本覆蓋所有的ground truth。 以上,所有的分析基本回答了Anchor 是什麼以及為什麼使用Anchor。 再看RPN,這次就是橫向對比了,去掉Anchor的RPN其實就是Fast RCNN的變形, Fast RCNN: RPN: 唯一不同的就是使用的loss函式不同,網路結構基本可以看作是一樣的。 有了以上對比,Faster RCNN使用的共享權值那就是水到渠成了。 訓練方法參考下圖:
實驗結果並不是我太關注的事情,肯定是當時最好。 個人見解:大家都知道Faster RCNN很厲害,速度相當快了,RPN是Faster的核心,而Anchor又是RPN的核心。那麼Anchor的思想是來源哪裡吶? 還是作者獨到見解? 我的猜測,這個思想來源是另一篇2014年的CVPR:

Scalable Object Detection using Deep Neural Networks

論文名字並不出名,但是提出的loss函式可是被Fast RCNN,Faster RCNN,yolo,SSD所使用。結構名字也叫DeepMultibox。 這篇文章是這系列的目標檢測的思想來源(我認為的)。很多內容被擴充套件後就成為了很牛的演算法。 參考: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks