目標檢測之RCNN、Yolo、SSD、RetinaNet與Anchor-Free

1、RCNN系列

1.1 從RCNN到Fast RCNN、Faster RCNN

(1)RCNN(2014)
Object Detection任務主要包含兩個內容:識別物體,確定位置。在識別物體這一塊,傳統的做法是利用特徵點來表徵物體的類,例如:SIFT,SURF等;在CNN方法出現之後,普遍採用“卷積+池化+全連接”的方式來完成。而對於確定物體的位置,最流行的就是莫過於Region Proposal Regression,在圖像中產生一系列的候選框,然後利用迴歸/分類的方式找到最合適的那個box。基於目標檢測中的“識別+定位”任務,RCNN提出了下圖所示的方法。在這裏插入圖片描述
總體而言,RCNN的流程分爲三步:

  1. 提取候選區域:這裏相當於找到可能存在目標物體的位置,但是隻是候選位置,後面會通過一些手段去掉那些不正確的;
  2. 利用CNN計算特徵:它的輸入就是前一步中找到的候選區域圖像,輸出的是區域圖像的特徵向量;
  3. 區域分類與迴歸:根據區域圖像特徵向量來判斷該候選區域屬於哪一類,也有可能是屬於背景。

詳細來說,在第一步會產生大約2000個左右的 Region Proposal,所使用的方法是 Selective Search(SS,選擇性搜索)。在第二步中對 proposal 進行 crop/warp 操作將其處理到固定大小 227*227,以此作爲 CNN 的輸入;CNN 模型包括5個卷積、2個全連接,由此得到每一個 proposal 的特徵,其大小爲 4096 維。第三步中分類採取 SVM 方法,將 proposal feature 送入每一類的 SVM 判斷它是否屬於該類別,它會對該區域所屬類別進行打分,利用 NMS 找到那些最有可能的 proposal;起初 proposal 的位置跟 Groundtruth 會有區別,在每一次迭代學習過程中使用 Bounding Box Regression 的方法對其進行修正:構建一個線性迴歸器,將 region feature 作爲輸入,計算得到 proposal 在當前位置上的縮放和偏移尺寸,然後進行更新。

Selective Search 是產生Region Proposal的一種方法,和它相同地位的還有:窮舉搜索、sliding window等。
SS方法先是通過圖像分割的方法得到一個區域集R,該集合中的每一個元素都是原圖像在像素級別上的一個segmentation,看起來就跟油畫一樣是不能夠作爲Regina Proposal的(有部位上的重疊、包含、遮擋等)。
SS給R的每一個元素套上一個Box,然後計算相鄰區域的相似度(基於顏色、紋理、尺寸、形狀)得到一個相似度集S,根據S挑選出相似度最高的兩個區域 rirjr_i、r_j;二者合併得到 rtr_t 後,將 rtr_t 加入集合R,然後把S中與 rirjr_i、r_j 相關聯的部分全部去掉,重新計算 rtr_t 與相鄰區域的相似度、並加入S;反覆迭代,直到S爲空。

RCNN的問題在於:

  • Region Proposal 的選取太耗時;
  • 候選區域之間的重疊部分特徵相同,但是依然會被作爲不同的 proposal 送入CNN進行計算,導致特徵提取存在冗餘;
  • CNN中的全連接層要求輸入特徵尺寸相同,因此送入CNN的區域需要通過 crop/warp 操作來固定大小,而這種操作又會讓圖像變形,降低識別的準確性
  • SS、SVM、邊框迴歸三個部分相互獨立,每一步都需要單獨訓練,耗時且無法實現end-2-end。

之後的SPP-Net(Spatial Pyramid Pooling,作者:何凱明)針對RCNN的第二、三點問題進行改進,它把提取到的 Region Proposal 的位置信息放在CNN卷積之後,讓CNN先針對整體圖像計算特徵,然後將位置信息通過比例映射到整張圖的 feature map上提取出候選區域的特徵圖,這樣就不用針對每一個候選區域計算特徵圖了;其次,取消對 proposal 的 crop/warp 操作,這樣 proposal 的大小就各不相同,所以要在全連接之前加入 SPP 層,保證全連接層接收到的特徵尺寸不變。

(1)一般我們要求輸入CNN的圖像尺寸保持一致,實際上這種硬性需求與卷積層無關,而是全連接層的需求。因爲卷積層只要指定卷積核大小、步長後,圖像多大都無所謂,但是全連接層它要把特徵拼接成一個特定維度的向量,如果輸入特徵尺寸不同那麼所需要的參數量也不相同。
(2)SPP全稱是Spatial Pyramid Pooling(空間金字塔池化),它加在全連接層之前。具體來說,對於任意一個維度的特徵,它將對其做三種分割:4*4、2*2、1*1,依次可以得到16、4、1個網格,然後在這21(在RCNN中,有20個目標類別,外加一個背景類)個網格中分別進行最大池化得到一個一維的值,將這21個值拼接成一個21維向量最爲最終輸入全連接層的特徵。

(2)Fast RCNN(2015)
Fast RCNN借鑑了SPP的思想,在 RCNN 的基礎上做出以下改進:

  1. 不再對每個 proposal 做單獨的特徵提取,而是在整張圖像上提取特徵,然後按照對應的位置、大小映射到不同的候選區域,避免 Region Proposal 特徵的重複計算。
  2. ROI池化:ROI 在這裏指的是網格,它借鑑了 SPP 的思想,取消對 proposal 的 crop/warp,直接將區域特徵圖劃分成 HWH*W 個網格(例如 37=213*7=21),然後對每一個網格使用最大池化,這樣池化後的特徵尺寸就只取決網格劃分的方式,而對輸入圖像尺寸保持不變性。同時它可以進行反向傳播,爲end-2-end打下基礎。
  3. softmax 替代 SVM 做 proposal 的分類,在損失函數中加入 softmax loss,將分類、迴歸放在一起完成。
  4. 全連接層的計算針對於所有 proposal feature,這是整個 CNN 網絡中主要的計算量,爲了降低計算複雜度,將全連接層中的權重矩陣進行 SVD(奇異值分解)。

Fast RCNN的整體框架如下圖所示,相比較於RCNN而言它彌補了RCNN的很多缺陷,但是仍然採用 selective search 的方法來提取 Region Proposal,這也成爲它在速度方面的最大限制。在這裏插入圖片描述
(3)Faster RCNN(2015)
相比於 Fast RCNN,Faster RCNN 的改變主要在以下兩點:

  1. RPN:Region Proposal Network,區域生成網絡,以此替代之前一直使用的 selective search 方法,使得候選框的選取速度、精度大大提升。Faster RCNN 可以看做是 RPN+Fast RCNN 的系統,它將訓練好的 RPN 模型嵌入到Faster RCNN 中,實現了 RPN 與 Faster RCNN 的權值共享。
  2. Anchor:這個是 RPN 產生 proposal 時所使用的一種策略,CNN 卷積層之後會輸出一個 feature map,它的大小隨輸入圖像大小而變化,Faster RCNN 在 feature map 的每個特徵點上產生9個固定大小的錨框 anchor,錨框的初始尺寸通過聚類算法從數據集中統計得到,然後讓 RPN 對這些錨框進行邊框迴歸,由此得到大量 proposal。

下圖給出了 Faster RCNN 的整體框架,其主要改進點落在 RPN,而 RPN 中最富新意的就是錨框Anchor。
在這裏插入圖片描述
Faster RCNN 網絡接受任意尺寸的圖像作爲輸入,通過卷積操作計算得到該圖像的feature map,隨後將 feature map 輸送給 RoI 的同時共享給 RPN。RPN 會先在 feature map 的每一個像素點上產生 9 個固定尺寸大小的錨框 anchor,如上圖右上角所示;對於每一個錨框,RPN 會進行兩個操作:(1) 利用 softmax 判斷錨框所選區域是前景還是背景;(2) 對錨框所選區域內的特徵進行邊框迴歸。softmax 給出二分類概率值,邊框迴歸對錨框進行位置偏移得到預測框 xywhxywh。接着對預測框進行篩選:先利用前景分類概率 foreground score 進行排序,根據 top-k 輸出一定數量的預測框;然後將預測框對應的 anchor 在特徵圖中的位置映射回原始圖像,剔除掉那些嚴重越界的預測框;最後用非極大值抑制 NMS 再次篩選,輸出最終的Region Proposal。得到 proposal 以後,後續操作就跟 Fast RCNN 一樣了。

RPN 在 Faster RCNN 中獨立完成訓練,它的訓練方法、訓練數據、訓練過程都是獨立的,訓練好了之後直接把它嵌入在Faster RCNN中。
在這裏插入圖片描述

1.2 Mask RCNN(2017)理論基礎——論文

Mask RCNN 是何凱明基於 Faster RCNN 模型提出來的一種 Instance Segmentation(實例分割)方法。

Object Detection:目標檢測,輸出圖像中個體的bounding box。
Semantic Segmentation:語義分割,輸出像素級別的類歸屬。
Instance Segmentation:實例分割,輸出像素級別的類歸屬以及類的實體ID,就是給出每一個實例的輪廓。

在這裏插入圖片描述
上圖左邊給出了 Mask RCNN 的模型結構,大體上沿襲了 Faster RCNN 的框架思路,不同之處在於:
(1)RoI Align 代替 ROI Pooling
之前 Fast/Faster RCNN 在全連接層之前都採用 RoI Pooling,這可以使得模型能夠接受任意尺寸大小的圖像作爲輸入。但是,該方法有兩個量化問題:(1) RPN 方法得到的錨框 anchor 需要進行邊框迴歸,迴歸結果是一個浮點數,在映射到 feature map 上時需要做舍入;(2) 網格的劃分直接採用 w/Wh/Hw/W、h/H,也需要進行舍入。
這兩次量化會直接影響 proposal 的準確性。RoI Align的做法是:迴歸和網格劃分還是照做,但是不再進行舍入,而是在網格(位置大小均是浮點數)內找四個位置固定的虛擬座標點,這四個點的特徵值由網格內的真實特徵點根據雙線性插值計算得到,然後對這四個虛擬特徵點做 max pooling 操作。當然了,不一定非要是4個虛擬特徵點,實際上只用網格中心點的雙線性插值也可以達到相類似的效果。
在這裏插入圖片描述
(2)加入 mask 分支
Faster RCNN 在全連接之後通過兩個分支分別輸出 proposal 的類別和預測位置,Mask RCNN 在此基礎上增加一個 mask 分支,該分支利用 FCN 對 proposal 特徵圖中的每一個像素進行分類。原始的 FCN 中用的是 softmax 和交叉熵,Mask RCNN 爲了避免同類間的競爭,採用了 sigmoid,並對每個 proposal 區域輸出 kmmk*m*m 維度的mask,kk 是類別數量,mm 就是 proposal 經過 RoI Align 得到的特徵圖的尺寸,將特徵圖的點映射回原始圖像,就能得到原始圖每個像素點的類別。因爲該分支輸出了針對每一類的 mask,這樣就不涉及像素之間的類別競爭。要注意的是,LmaskL_{mask} 在計算時只針對 proposal 所屬的第 kk 類,其他類 mask 不參與損失函數計算。

關於FCN:
(1)FCN是Semantic Segmentation的里程碑之作,它對圖像進行像素級的分類,解決了語義級別的圖像分割。
(2)FCN不包含全連接層,只有卷積層,在最後一個卷積層的後面接一個反捲積層,將feature map還原到原始圖像尺寸大小,對每一個像素進行預測,最後逐像素求softmax損失,這就相當於每一個像素就是一個樣本。

Mask RCNN 的特徵提取網絡使用的是 ResNet101,同時文章也給出 FPN 的同等對比方案,因爲 FPN 能融合不同尺度上的特徵,所以它能提煉更加豐富的上下文信息。

關於FPN:
一般的特徵預測可以有三種形式:(1)採用網絡最後一層的特徵預測,典型的有SPP、Fast/er RCNN;(2)圖像金字塔,每一種圖像尺寸進行一次特徵預測;(3)多尺度融合,每一層特徵進行一次預測,不同層之間沒有聯繫,典型的有SSD。
FPN(Feature Pyramid Network),特徵金字塔網絡,頂層特徵通過上採樣和底層特徵進行融合,層與層之間有相互聯繫。

1.3 Mask RCNN的實現與效果

Mask RCNN的Tensorflow版本開源下載地址
代碼寫的很清晰、很整潔,不管能不能理解原理,先讓它跑起來再說,看一下結果。在這裏插入圖片描述
此項目依賴於COCO,其配置方式爲:

  1. 下載COCO項目:git clone https://github.com/pdollar/coco
  2. 編譯Python API:cd coco/PythonAPI >>> make -j8
  3. 複製coco/PythonAPI/pycocotools文件夾到samples/coco中(和coco.py同級目錄)

Mask RCNN的官方源碼在Detectron,Detectron是Facebook的開源物體檢測平臺,它基於Caffe2、用Python寫成。除了Mask RCNN的實現之外,Detectron還包含了ICCV 2017最佳學生論文RetinaNet,Ross Girshick 此前的研究Faster R-CNN和RPN、Fast R-CNN、以及R-FCN的實現。

1.4 Mask RCNN的後續進展

Mask RCNN的出世時間是2017年,到目前爲止它依然是相當強悍的目標檢測方法之一,當然也不乏超越它的作品。

  1. 2017年,曠視提出Light-head RCNN,它在性能上超越了Mask RCNN,在模型使用更小的網絡時其效率更是超過Yolo和SSD。它這裏的“head”指的是Fast RCNN進行RoI Pooling之後的分類/迴歸網絡部分,文章旨在對這一部分進行優化,針對該部分提出了性能更好的RCNN-subnet,優化了計算、降低了複雜度。
  2. Reasoning-RCNN:Faster RCNN是一種常用的物體檢測模型,然而,當檢測類的數量小於100時,物體檢測是最成功的。Reasoning-RCNN 針對具有數千個類別的大規模物體檢測問題,提出了一種基於長尾數據分佈、重遮擋和類模糊的目標檢測方法。該模型在3個主要數據集上進行訓練和評估——Visual Gnome(3000個類別)、ADE(445個類別)和COCO(80個類別)。該模型能夠在Visual Gnome上獲得16%的提升,在ADE上獲得37%的提升,在COCO上獲得15%的提升。

2、Yolo系列

RCNN 系列屬於目標檢測中 2-stage 方法的代表作品,之所以稱爲 2-stage 是因爲它們需要先通過一類算法找到圖像中的候選區域 Region Proposal,然後再利用另外一類算法對這些區域進行分類、迴歸,完成目標檢測問題中的識別與定位。該方法的 pipeline 需要多個獨立的部分,每一部分需要單獨數據集、單獨訓練,過程較爲繁瑣且無法實現端到端的訓練。
針對 2-stage 的問題,YOLO 提出 1-stage 的目標檢測方法:Fast RCNN 主要的改進不是將 proposal 進行網格劃分嘛,YOLO 將這種思想直接應用到原始圖像上,那就不需要做生成 proposal 的工作了呀!所以,YOLO 將 proposal生成、分類、迴歸放到一個模型中統一完成,在速度上有相當的優勢,雖然精度有所降低,但是隨着版本的進化也相應的有所改善。

2.1 從Yolo v1到Yolo v2

(1)Yolo(2015)
Yolo使用最直觀的求解思路,對於輸入的完整圖像,經過一個網絡直接給出每一個目標物體的位置bbox、所屬類別,它的思路設計可以概括爲以下幾步:

  1. 將圖像分割成一個 SSS*S 的網格:;
  2. 每一個網格給出 BB 個 bbox,每個 bbox 包含五個輸出值:中心點座標+尺寸 (x,y,w,h)(x,y,w,h) ,置信度 confidenceconfidence
  3. 每一個網格還給出它屬於每一類的概率 Pr(ClassiObject)Pr(Class_i|Object)
  4. 對 2、3 的輸出結果進行 NMS 處理,依此給出整張圖的目標物體的位置、類別。

下圖是Yolo的流程圖:在這裏插入圖片描述
爲什麼可以直接在原始圖像上劃分網格?Faster RCNN 在特徵圖的每個特徵點上生成 anchor,如果把這些特徵點映射回原始圖像其實也就是一個個的網格,YOLO 相當於直接把特徵點映射回去了,希望通過原始圖像上的網格直接產生對目標物體的預測。
在開始訓練之前,要爲圖像的每個網格打上標籤,生成標籤的做法是:根據真實的目標框所在位置,判斷它落在哪個網格內,包含目標框中心點的網格會被賦予有效的 label(真實類別,真實邊框)。 對於需要網絡預測的 bbox,它的表達形式爲 (x,y,w,h)(x,y,w,h),前兩個參數給出 bbox 的中心相對於該網格左上角的所在位置,後兩個參數給出了 bbox 相對於全圖的大小尺寸,它們的值都被歸一化到 0~1。網絡最終的輸出形式是 (7,7,30)(7,7,30),因爲原始圖像被劃分成 SS=77S*S=7*7 個網格,每一個網格有 B=2B=2 個 bbox 預測,每個預測框有5個位置參數 、C=20C=20 個類別參數,所以最終特徵正尺寸是 7*7,通道數量是 5*2+20=30。根據此輸出值,計算 bbox 的所屬類概率 confidencePr(ClassiObject)confidence * Pr(Class_i|Object) 也就是 bbox 的置信度乘以它所在網格類概率。雖然每個網格都能計算這樣一個值,但是隻有在前面的 label 標籤中包含目標框中心點的網格纔有資格作爲預測值,參與到後續loss計算。具體來看看損失函數:λ coord i=0S2j=0BIij obj [(xix^i)2+(yiy^i)2]+λ coord i=0S2j=0BIijobj[(wiw^i)2+(hih^i)2]+i=0S2j=0BIijobj(CiC^i)2+λnoobji=0S2j=0BIijnoobj(CiC^i)2+i=0S2Iiobjcclasses(pi(c)p^i(c))2\begin{array}{l} {\lambda_{\text { coord }} \displaystyle\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{I}_{i j}^{\text { obj }}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right]} \\ +\lambda_{\text { coord }} \displaystyle\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{I}_{i j}^{\text {obj}} \left[\left(\sqrt{w_i}-\sqrt{\hat{w}_{i}}\right)^{2}+ \left(\sqrt{h_i}-\sqrt{\hat{h}_{i}}\right)^{2} \right]\\ +\displaystyle\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{I}_{i j}^{\mathrm{obj}}\left(C_{i}-\hat{C}_{i}\right)^{2} \\ +\lambda_{\mathrm{noob} j} \displaystyle \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{I}_{i j}^{\mathrm{noobj}}\left(C_{i}-\hat{C}_{i}\right)^{2} \\ +\displaystyle\sum_{i=0}^{S^{2}} \mathbb{I}_{i}^{\mathrm{obj}} \sum_{c\in\text {classes}}\left({p_{i}(c)-\hat{p}_{i}(c)}\right)^{2} \end{array}第一部分計算的是包含物體中心的網格的 bbox 中心位置損失,這裏只會計算與 GroundTruth 交併比最大的那個 bbox,雖然給的 jj 值是0~B,但是後面的計算只與 ii 有關,說明只有一個bbox參與計算。具體是哪一個 bbox,由 Iijobj\mathbb{I}_{i j}^{\text {obj}} 計算得到,它給出了根據 IOUIOU 選擇 bbox 的數學表示。
第二部分計算的是尺寸損失,大物體與小物體同時偏離一個尺寸帶來的誤差是不同的,這裏爲了減小這種尺度大小帶來的影響,將 w/hw/h 進行開方然後計算損失。
第三部分計算的是置信度損失,與前兩部分相比這一部分沒有係數 λcoord\lambda_{\text {coord}},原因是 bbox 位置信息與置信度信息維度不同、重要性不同,如果將它們同等對待處理顯然不合理,爲了突出 bbox 損失故在其前面加入係數 λcoord=5{\lambda_{\text{coord}}}=5
第四部分計算的是不包含物體中心的網格置信度損失Iijnoobj\mathbb{I}_{i j}^{\text {noobj}} 負責教會模型判斷哪些網格不包含物體中心,係數 λnoobj=0.5{\lambda_{\text{noobj}}}=0.5 弱化這類網格的影響。
第五部分計算的是分類損失,它與bbox是無關的,所以判別參數是 Iiobj\mathbb{I}_{i}^{\text {obj}},且與置信度同等重要。

(1)包含物體中心的網格:需要計算分類loss,兩個predictor都要計算置信度loss(係數不同),預測的bbox與ground truth IOU比較大的那個predictor需要計算位置、尺寸loss。
(2)不包含物體中心的網格:只需要計算置信度loss。

在這裏插入圖片描述
上圖是Yolo的網絡結構,對於卷積層的參數先用 ImageNet 做分類預訓練,預訓練輸入圖像尺寸爲 224*224,之後進行檢測訓練時將輸入圖像尺寸改爲 448*448(爲什麼要這樣做?)。
RCNN 系列的邊框迴歸是在 proposal/anchor 上進行的,而 YOLO 沒有做邊框迴歸,它直接輸出 bbox 的中心位置、尺寸大小,中心點針對網格左上角,尺寸大小是相對於全圖而言,如果要類比的話可以認爲這裏的網格就相當於 RCNN 系列中 的 anchor,不準確哈!YOLO 的不足在於:一個網格最終只有一個目標物體的輸出,這導致它對那些尺寸較小或者比較擁擠的目標的檢測不是很準確。

(2)Yolo v2(2017)
Yolo-v2對Yolo進行了多方面的改進。

  1. BatchNormal的使用:BN 首次出現是在2015年的Inception v2,但是在2016年的 Yolo 中並未使用,Yolo-v2 加入此部分,使得mAP獲得了2%的提升,同時去掉了 dropout 也不會產生過擬合;
  2. 高分辨率分類器:Yolo 在預訓練分類器時使用 224*224 圖像,在檢測時使用448*448圖像,這使得網絡需要重新適應新的輸入圖像尺寸,Yolo-v2 則直接採用448*448 分辨率圖像(還是ImageNet數據庫)來做預訓練,將mAP提高4%;
  3. 卷積聯合Anchor:Yolo-v2 借鑑Faster-RCNN 的 Anchor 方法,在 Yolo 中是通過兩個全連接層得到 7*7*30 的輸出,這裏直接將全連接層去掉,然後調整卷積網絡的池化層,將輸入圖像改爲 416*416,確保卷積網絡的最終輸出是一個13*13 的 feature map,然後在每一個特徵點上產生 Anchors;Yolo 一個網格只會預測一個物體,而 Yolo-v2 每一個 Anchor 都可能檢測到一個物體。這樣的操作會稍微降低mAP(69.5%→69.2%),但是 Recall 從81%上升到88%,說明可檢測到的內容大大提升了(漏檢率降低)。
  4. 維度聚類:這裏指的是調整對 Anchor 尺寸的選擇,Faster-RCNN 中Anchor 是人爲指定的(具體爲什麼是這個尺寸全來自於經驗),Yolo-v2 採用K-means 聚類的方法對訓練集進行分析,爲的就是找到最優的 kk 值以及最適合的Anchors。最終確定下來 k=5k=5 是比較合適的,這樣 bbox 的數量由 Yolo 的 7*7*2=98 上升到 13*13*5=845。
    對於兩個數據集,5個先驗框的width和height如下:
    COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
    VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)
    
  5. 直接位置預測:Yolo 中模型直接給出 bbox 的中心座標位置、尺寸,這在一定程度上會導致模型的不穩定(具體原因可以對比一下RCNN的邊框迴歸,爲什麼RCNN邊框迴歸的時候不是直接輸出座標值而要進行轉換?)。Yolo-v2 效仿 RPN 網絡中對 bbox 迴歸的形式,從網絡輸出到最終真實bbox的映射定義爲bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=phethPr( Object )IOU(b, Object )=σ(to)\begin{aligned}b_{x}&=\sigma\left(t_{x}\right)+c_{x} \\ b_{y}&=\sigma\left(t_{y}\right)+c_{y}\\b_{w}&=p_{w}e^{t_{w}} \\b_{h}&=p_{h} e^{t_{h}} \\ \operatorname{Pr}(\text { Object }) * I O U(b, \text { Object }) &=\sigma\left(t_{o}\right) \end{aligned}這裏,txtyt_x、t_y 是相對於 cxcyc_x、c_y 的offset,cxcyc_x、c_y 是anchor所在網格相對於圖像左上角的位置;twtht_w、t_h 是相對於 pwphp_w、p_h 的offset,pwphp_w、p_h 是先驗 anchor 的尺寸(這就體現了先驗 anchor 的作用);σ\sigma 指的就是激活函數,模型通過學習得到 txtytwthtot_x、t_y、t_w、t_h、t_o。也就是說,在人工標記 label 的時候需要按照 13*13 網格的方式把 GroundTruth 轉化成這種形式。激活函數將位置和置信度參數限定在0~1之間,也就是隻在網格附近做預測。維度聚類和直接位置預測使得 Yolo-v2 的mAP值上升了5%。
  6. 細粒度特徵:Faster-RCNN 和 SSD 中將不同層次上的特徵圖進行融合,使得模型可以適應對小物體的檢測;Yolo-v2 照此添加一個“透層”,類似於 ResNet 的操作,將 26*26*516 的上層特徵變爲 13*13*2048(特徵大小變爲1/4,通道數變爲4倍),然後與最後的卷積輸出 13*13*1024 特徵連接,得到 13*13*3072 特徵圖。如此一來,大尺度特徵圖連接到小尺度,在進行池化操作的時候,一些細節特徵、小目標物體就不會被輕易丟掉,這對於小目標物體的檢測是有積極效果的,最終該操作可以使mAP提升1%。
  7. 多尺度訓練:Yolo-v2 可以適應不同分辨率的輸入圖像,其做法是:在訓練的時候每迭代一定次數(10個epoch),就換不同的輸入尺寸(320~608,以32爲等差)。網絡進行了5次 max pooling,當輸入圖片大小爲320*320時,最終特徵圖大小就是10*10;當輸入圖片大小爲608*608時,最終特徵圖大小就是19*19。

Yolo 使用 GoogLeNet 作爲basebone,Yolo-v2 則提出自己的網絡結構Darknet-19:
在這裏插入圖片描述
爲什麼第一層卷積的輸出是224*224?實際上,這並不是最終的檢測模型的輸入尺寸,整個Yolo-v2的訓練分三個階段:

  1. 預訓練階段:在 ImageNet 分類數據集上從頭訓練 Darknet-19,圖像大小是224*224,總共160個 epoch。
  2. fine-tuning 階段:在第一階段的基礎上將輸入圖像調整爲448*448,訓練10個epoch,這裏除了 epoch 和學習率進行調整以外其他參數均不變。
  3. 檢測訓練階段:將 Darknet-19 分類模型修改爲檢測模型(去掉最後一個1000通道的1*1卷積層以及 Avgpool、Softmax層,添加3個 1024 通道的 3*3 卷積層,每個卷積後面接上一個1*1卷積),檢測數據集用的是VOC和COCO。

前兩個階段其實都是分類預訓練,爲的是讓 Darknet-19 擁有較好的分辨能力;第三階段纔是目標檢測,使用的數據集也改成了COCO、VOC-2007。
Yolo-v2 中每個網格有5個 bbox,每個 bbox 有4個座標值、1個置信度值、20個類別概率值,因此一個網格需要5*(4+1+20)=125個 filters。Yolo中一個網格有2個bbox,這兩個bbox共享一個類別概率,Yolo-v2中則是每一個bbox都有一個屬於自己的類別概率。
Yolo-v2的細節很多,論文中只給了最爲突出的部分,要了解所有的細節還是需要對源碼進行剖析。Yolo-v2的損失函數可以參考這裏

這裏所說的網格其實是最後特徵圖上的一個點,但是映射回原圖可以看做是一個網格

(Yolo9000的部分有待補充!)

2.2 Yolo v3(2018)

Yolo-v3 論文比 Yolo-v2 還要隨意,具體優化內容主要有:

  1. bbox的預測:基本上還是沿用 Yolo-v2 那一套(對 anchor 的offset),但是 Yolo-v3 使用邏輯迴歸對每一個框打分,該分數用於選取與 GroundTruth 最爲契合的 bbox(之前使用 IOU 最大的bbox),被捨棄掉的 bbox 將只會參與置信度損失的計算。
  2. 分類預測:Yolo-v2 對於分類使用的是softmax,得到一個20維的向量;Yolo-v3 改變這一做法,它使用多個邏輯分類器,每一個分類器用來判斷 bbox 是否屬於一個類,然後用二元交叉熵計算損失。這樣做的好處是,可以應對 Open Images Dataset 這樣的一個物體同時屬於多個類的情況。
  3. 多尺度預測:Yolo-v3 效仿 FPN 的多級特徵金字塔,通過上採樣和 concat 大尺度特徵,可以生成除 13*13 以外的 26*26、52*52 特徵圖,特徵圖的每一個特徵點擁有3個 anchor,每一個 anchor 擁有4個 offset 數據、1個置信度、80個類別信息。這些 anchor 同樣通過 K-means 來獲得,只是 k=9k=9,然後均分給多尺度的每一層。文章給出 416*416 尺度下圖像的 anchor 尺寸:
    (10×13)、(16×30)、(33×23)、(30×61)、(62×45)、(59×119)、(116 × 90)、(156 × 198)、(373 × 326)
    
  4. 特徵提取:Yolo-v2 中使用了一個“透層”將 26*26 的特徵圖連接到 13*13 的特徵圖上,這有點類似於ResNet的殘差思想;Yolo-v3 直接加入殘差塊,去掉池化的同時增加捲積的步長,保證輸入圖像經過5次下采樣,由此誕生了Darknet-53。在這裏插入圖片描述
2.3 Yolo v3的實現與效果

作爲工程項目來說,Yolo-v3的檢測效果應該是相當不錯的,這裏我們不去討論mAP、COCO數據集上的表現等刷分用的參數,就僅僅看它在實際應用中的performance,速度、精度都很令人滿意。重要的是,Yolo-v3開源代碼的使用極其簡單,即便是看源碼、根據自己的需求修改源碼都很方便(主要是代碼寫得很清晰)。參考Tensorflow版本的項目,得到下圖結果。在這裏插入圖片描述

2.4 Yolo v3的後續進展

Tiny Yolo
Yolo Nano
Gaussian YOLOv3
YOLO-v4

3、SSD

3.1 SSD的理論基礎——論文

SSD(Single Shot MultiBox Detector)發表於2015年,Faster RCNN 和 Yolo 之後的作品,它也屬於目標檢測的 1-stage 範疇,同時借鑑了OverFeat、SPP、Fast RCNN、Yolo、Faster RCNN 的一些思想。SSD 由一個 base network 和6個卷積特徵層構成,base network 是自VGG-16改造來的,6個卷積特徵層分別輸出不同尺寸的特徵。
在這裏插入圖片描述
SSD 的網絡結構圖還是很清晰的,它和 YOLO 的區別就在於:YOLO 只利用到最後一層特徵層的信息,而 SSD 則利用了不同尺度上的特徵信息,其精度可想而知比 YOLO 要好。在卷積神經網絡中,低層卷積更關心特徵在哪裏,它更多的是提取一些具體的細節信息,其分類準確性並不高;而高層卷積則更關心特徵是什麼,它提取的是與整體相關的抽象信息,可能丟失了類似物體在哪裏的位置信息。SSD 將二者結合,在不同尺度的特徵圖上設置初始框,對於那些和真實目標交併比較大的初始框,網絡對它做分類預測和位置偏移,並從中產生預測值。
SSD 的三個創新點:

  1. 用於檢測的多尺度特徵圖:相比於 Yolo 而言,SSD 添加了多個卷積特徵層用於最終的目標檢測(不再是最後一層預測結果),它使得 SSD 可以適應不同尺寸目標物體的檢測。(當時 Yolo 的缺陷就是對小目標物體檢測不準)
  2. 用於檢測的卷積預測器:SSD的每一個卷積特徵層,可以通過一系列的過濾器(1*1、3*3)輸出大量預測結果(維度爲(Classes+4)的向量),在不同尺度特徵圖上輸出的預測 bbox 數量不同,具體如下表所示,最終得到的檢測數量是8732。在這裏插入圖片描述
  3. Default Box和長寬比:default box 是SSD中一個很重要的內容,它指代的就是上面生成的8732個預測框,這就類似於 RCNN 系列中的 anchor,它也是在特徵圖的每一個特徵點上產生一系列邊框,只不過 default box 在不同尺度上的尺寸大小是不一樣的,同真實框之間的轉換關係與 Faster RCNN、Yolo-v2 中類似,也就是 offset。還有一個概念就是 prior box,這個是從 default box 中篩選出來的,選取標準是與真實框的 IOU 超過一定閾值,它的數量遠小於 default box 數量,最後 prior box 作爲正樣本,其它 default box 作爲負樣本。
3.2 SSD的實現與效果

TODO

3.3 SSD的後續進展

TODO

4、RetinaNet

參考

5、Anchor-Free目標檢測

anchor的前世今生(上)
anchor的前世今生(下)
知乎1:物體檢測的輪迴: anchor-based 與 anchor-free
知乎2:目標檢測:Anchor-Free時代
anchor based與anchor free對比
anchor free相關論文解析
Anchor-free之SAPD

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章