文章目錄
0 目標檢測的任務概述
如何從圖像中解析出可供計算機理解的信息,是機器視覺的中心問題。理解圖像,有三個主要的層次:
- 一是分類(Classification),即是將圖像結構化爲某一類別的信息,用事先確定好的類別(string)來描述圖片。這一任務是最簡單、最基礎的圖像理解任務,也是深度學習模型最先取得突破和實現大規模應用的任務。
- 二是檢測(Detection)。檢測則關注特定的物體目標,要求同時獲得這一目標的類別信息和位置信息。相比分類,檢測需要從背景中分離出感興趣的目標,並確定這一目標的類別和位置。
- 三是分割(Segmentation)。分割包括語義分割(semantic segmentation)和實例分割(instance segmentation),前者要求分離開具有不同語義的圖像部分,而後者是檢測任務的拓展,要求描述出目標的輪廓(相比檢測框更爲精細)。分割是對圖像的像素級描述,它賦予每個像素類別意義,適用於理解要求較高的場景,如無人駕駛中對道路和非道路的分割。
1 基於深度學習的「目標檢測」算法
深度學習時代來臨後,「目標檢測」算法大家族主要劃分爲兩大派系,一個是 R-CNN 系兩刀流派
,另一個則是以 YOLO 爲代表的一刀流派
。下面分別解釋一下 兩刀流
和 一刀流
:
兩刀流
顧名思義,兩刀解決問題。其實兩刀流
更符合人們解決圖像問題的思路:
- 生成候選區域(Region Proposal)
- 放入分類器分類並微調邊框位置
這種流派的算法都離不開 Region Proposal(候選區域生成) ,即是優點也是缺點,主要代表人物就是 R-CNN 系。
一刀流
顧名思義,一刀解決問題,直接對預測的目標物體進行迴歸。
迴歸解決問題簡單快速,主要代表人物是 YOLO
和 SSD
。
兩種流派的不同:
- 兩刀流主要傾向準,
- 一刀流主要傾向快。
無論 兩刀流
還是 一刀流
,他們都是在同一個天平下選取一個平衡點、或者選取一個極端—— 要麼準,要麼快。
1.1 兩刀流 R-CNN
R-CNN 其實是一個很大的家族,桃李滿天下。在此,我們只探討 R-CNN 直系親屬,他們的發展順序如下:
R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN`
下面對其分別簡單介紹:
1.1.1 R-CNN / 2013
論文:Rich feature hierarchies for accurate object detection and semantic segmentation
羅斯的這篇論文,這個模型,是利用卷積神經網絡來做「目標檢測」的開山之作,其意義深遠不言而喻。
解決問題一、速度
傳統的區域選擇使用滑窗,每滑一個窗口檢測一次,相鄰窗口信息重疊高,檢測速度慢。R-CNN 使用一個啓發式方法(Selective search),先生成候選區域再檢測,降低信息冗餘程度,從而提高檢測速度。
解決問題二、特徵提取
傳統的手工提取特徵魯棒性差,限於如顏色、紋理等 低層次(Low level)的特徵。使用CNN 提取高維特徵,免去手工提取特徵工作。
1.1.2 SPP Net / 2014
論文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
儘管 之前提出的 R-CNN 效果不錯,但是他還有兩個硬傷:
硬傷一、算力冗餘
先生成候選區域,再對區域進行卷積,這裏有兩個問題:其一是候選區域會有一定程度的重疊,對相同區域進行重複卷積;其二是每個區域進行新的卷積需要新的存儲空間。
何愷明等人意識到這個可以優化,於是把先生成候選區域再卷積,變成了先卷積後生成區域。“簡單地”改變順序,化腐朽爲神奇,不僅減少存儲量而且加快了訓練速度。
硬傷二、圖片縮放
由於FC Layer(全連接層)需要確定輸入維度。
無論是剪裁(Crop)還是縮放(Warp)等預處理,在很大程度上會丟失圖片原有的信息導致訓練效果不好,如上圖所示。把一座高塔縮放成一個胖胖的塔,人看到也沒很大把握直接下結論。
何愷明等人發現了這個問題,他們在輸入全連接層前定義一個特殊的池化層,將輸入的任意尺度 feature maps 組合成特定維度的輸出,這個組合可以是不同大小的拼湊,如同拼湊七巧板般。
SPP Net 的出現,不僅減少了計算冗餘,更重要的是打破了固定尺寸輸入這一束縛。
1.1.3 Fast R-CNN / 2015
論文:Fast R-CNN
此時,R-CNN的原作者自己 也按耐不住了——自己家的孩子,自己養大——於是。憋出了一個大招 Fast R-CNN
。
取這個名字的意思就是“一代更比一代強”,相對於原來的 Slow R-CNN,做了速度上的優化——就是快。
在這篇論文中,引用了 SPP Net
的工作,並且致謝其第一作者何愷明。
縱觀全文,最大的建樹就是將原來的串行結構改成並行結構。
原來的 R-CNN 是先對候選框區域進行分類,判斷有沒有物體,如果有則對 Bounding Box 進行精修 迴歸 。
這是一個串聯式的任務,那麼勢必沒有並聯的快,所以 rbg 就將原有結構改成並行——在分類的同時,對 Bbox 進行迴歸。
這一改變將 Bbox 和 Clf 的 loss 結合起來變成一個 Loss 一起訓練,並吸納了 SPP Net 的優點,最終不僅加快了預測的速度,而且提高了精度。
1.1.4 Faster R-CNN / 2015
論文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
在 Faster R-CNN 前,我們生產候選區域都是用的一系列啓發式算法,基於 Low Level 特徵生成區域。這樣就有兩個問題:
第一個問題 是生成區域的靠譜程度隨緣,而 兩刀流 算法正是依靠生成區域的靠譜程度——生成大量無效區域則會造成算力的浪費、少生成區域則會漏檢;
第二個問題 是生成候選區域的算法是在 CPU 上運行的,而我們的訓練在 GPU 上面,跨結構交互必定會有損效率。
於是乎,任少卿等人提出了一個 Region Proposal Networks
的概念,利用神經網絡自己學習去生成候選區域。
這種生成方法同時解決了上述的兩個問題,神經網絡可以學到更加高層、語義、抽象的特徵,生成的候選區域的可靠程度大大提高;可以從上圖看出 RPNs 和 RoI Pooling 共用前面的卷積神經網絡——將 RPNs 嵌入原有網絡,原有網絡和 RPNs 一起預測,大大地減少了參數量和預測時間。
將 兩刀流
的兩刀併入同一個網絡,這一操作足夠載入史冊了。
1.1.5 Mask R-CNN / 2017
論文:Mask R-CNN
時隔一年,何愷明團隊再次更新了 R-CNN
家族,改進 Faster R-CNN
並使用新的 backbone 和 FPN 創造出了 Mask R-CNN
。
我們縱觀發展歷史,發現 SPP Net 升級爲 Fast R-CNN 時結合了兩個 loss ,也就是說網絡輸入了兩種信息去訓練,結果精度大大提高了。何愷明他們就思考着再加一個信息輸入,即圖像的 Mask ,信息變多之後會不會有提升呢?
加一條通道
於是乎 Mask R-CNN 就這樣出來了,不僅可以做「目標檢測」還可以同時做「語義分割」,將兩個計算機視覺基本任務融入一個框架。沒有使用什麼 trick ,性能卻有了較爲明顯的提升,這個升級的版本讓人們不無嘖嘖驚歎。
1.1.6 二刀流小結
從結構上講
一開始的串行到並行,從單一信息流到三條信息流。
從最開始 50s 一張圖片的到最後 200ms 一張圖片,甚至可以達到 6 FPS 的高精度識別,無不彰顯着人類的智慧。
1.2 一刀流 YOLO
一刀流最核心的還是利用了分類器優秀的分類效果,首先給出一個大致的範圍(最開始就是全圖)進行分類,然後不斷迭代這個範圍直到一個精細的位置,這樣做的優點就是快,但是會有許多漏檢。
1.2.1 YOLO / 2015
論文:YOLO
YOLO 就是使用迴歸這種做法的典型算法。
首先將圖片 Resize 到固定尺寸,然後通過一套卷積神經網絡,最後接上 FC 直接輸出結果,這就他們整個網絡的基本結構。
更具體地做法,是將輸入圖片劃分成一個 SxS 的網格,每個網格負責檢測網格里面的物體是啥,並輸出 Bbox Info 和 置信度。這裏的置信度指的是 該網格內含有什麼物體 和 預測這個物體的準確度。
這個想法其實就是一個簡單的分而治之想法,將圖片卷積後提取的特徵圖分爲 SxS 塊,然後利用優秀的分類模型對每一塊進行分類,將每個網格處理完使用 NMS (非極大值抑制)的算法去除重疊的框,最後得到我們的結果。
1.2.2 SSD / 2015
YOLO 這樣做的確非常快,但是問題就在於這個框有點大,就會變得粗糙——小物體就容易從這個大網中漏出去,因此對小物體的檢測效果不好。
所以 SSD 就在 YOLO 的主意上添加了 Faster R-CNN 的 Anchor 概念,並融合不同卷積層的特徵做出預測。
我們從上圖就可以很明顯的看出這是 YOLO 分治網絡 和 Faster R-CNN Anchor 的融合,這就大大提高了對小物體的檢測。這裏作者做實驗也提到和 Faster R-CNN 一樣的結果,這個 Anchor 的數量和形狀會對性能造成較大的影響。
除此之外,和 YOLO 最大的區別是,SSD 沒有接 FC 減少了大量的參數量、提高了速度。
1.2.3 YOLO9000 / 2016
論文:YOLO9000: Better, Faster, Stronger
到了 SSD
,迴歸方法的目標檢測應該獨步武林了,但是 YOLO
的作者不服氣,升級做了一個 YOLO9000
——號稱可以同時識別 9000 類物體的實時監測算法。
YOLO9000
更像是 SSD 加了一些 Trick :
- Batch Normalization
- High resolution classifier 448*448 pretrain
- Convolution with anchor boxes
- Dimension clusters
- Multi-Scale Training every 10 batch {320,……608}
- Direct location prediction
- Fine-Grained Features
- 加了 BN 層,擴大輸入維度,使用了 Anchor,訓練的時候數據增強…
所以YOLO9000 和 SSD 可以歸爲一類。
2 總結
在「目標檢測」中有兩個指標:快(Fast) 和 準(Accurate)。
一刀流代表的是快,但是最後在快和準中找到了平衡,第一是快,第二是準。
兩刀流代表的是準,雖然沒有那麼快但是也有 6 FPS 可接受的程度,第一是準,第二是快。
兩類算法都有其適用的範圍,比如說實時快速動作捕捉,一刀流更勝一籌;複雜、多物體重疊,兩刀流當仁不讓。沒有不好的算法,只有合適的使用場景。
此外,後面的論文中可以看到,兩種類型的模型也在互相吸收彼此的優點,這也使得兩者的界限更爲模糊。
參考:
- 《基於深度學習的「目標檢測」算法綜述》https://zhuanlan.zhihu.com/p/33981103
- 《乾貨 | 目標檢測入門,看這篇就夠了》https://zhuanlan.zhihu.com/p/34142321