基於深度學習的「目標檢測」演算法綜述
來自於我的博客:基於深度學習的「目標檢測」演算法綜述
目標檢測一直是計算機視覺的基礎問題,在 2010 年左右就開始停滯不前了。自 2013 年一篇論文的發表,目標檢測從原始的傳統手工提取特徵方法變成了基於卷積神經網路的特徵提取,從此一發不可收拾。
本文將跟著歷史的潮流,簡要地探討「目標檢測」演算法的兩種思想和這些思想引申出的演算法,主要涉及那些主流演算法,no bells and whistles.
概述 Overview
在深度學習正式介入之前,傳統的「目標檢測」方法都是 區域選擇
、提取特徵
、分類回歸
三部曲,這樣就有兩個難以解決的問題;其一是區域選擇的策略效果差、時間複雜度高;其二是手工提取的特徵魯棒性較差。
雲計算時代來臨後,「目標檢測」演算法大家族主要劃分為兩大派系,一個是 R-CNN
系兩刀流,另一個則是以 YOLO
為代表的一刀流派。下面分別解釋一下 兩刀流
和 一刀流
。
兩刀流
顧名思義,兩刀解決問題:
1、生成可能區域(Region Proposal) & CNN 提取特徵
2、放入分類器分類並修正位置這一流派的演算法都離不開 Region Proposal
,即是優點也是缺點,主要代表人物就是 R-CNN
系。
一刀流
顧名思義,一刀解決問題,直接對預測的目標物體進行回歸。
回歸解決問題簡單快速,但是太粗暴了,主要代表人物是YOLO
和 SSD
。
無論 兩刀流
還是 一刀流
,他們都是在同一個天平下選取一個平衡點、或者選取一個極端—— 要麼准,要麼快。
兩刀流的天平主要傾向准,
一刀流的天平主要傾向快。但最後萬劍歸宗,大家也找到了自己的平衡,平衡點的有略微的不同。
接下來我們花開兩朵各表一支,一朵 兩刀流
的前世今生,另一朵 一刀流
的發展歷史。
兩刀流 R-CNN
R-CNN 其實是一個很大的家族,自從 rbg 大神發表那篇論文,子孫無數、桃李滿天下。在此,我們只探討 R-CNN 直系親屬,他們的發展順序如下:
R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
其實說句良心話,最佩服的並不是 rbg 大神,而是提出了 SPP Net 的以何愷明為主的作者們。
他們在整個家族進化的過程中,一致暗埋了一條主線:充分榨乾 feature maps 的價值。R-CNN / 2013
論文:Rich feature hierarchies for accurate object detection and semantic segmentation
這篇論文,這個模型,是利用卷積神經網路來做「目標檢測」的開山之作,其意義深遠不言而喻。
解決問題一、速度
傳統的區域選擇使用滑窗,每滑一個窗口檢測一次,相鄰窗口信息重疊高,檢測速度慢。R-CNN 使用一個啟發式方法(Selective search),先生成候選區域再檢測,降低信息冗餘程度,從而提高檢測速度。解決問題二、特徵提取
傳統的手工提取特徵魯棒性差,限於如顏色、紋理等 低層次
(Low level)的特徵。
該方法將 PASCAL VOC
上的檢測率從 35.1% 提升到 53.7% ,提高了好幾個量級。雖然比傳統方法好很多,但是從現在的眼光看,只能是初窺門徑。
SPP Net / 2014
論文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
R-CNN
提出後的一年,以何愷明、任少卿為首的團隊提出了 SPP Net
,這才是真正摸到了卷積神經網路的脈絡。也不奇怪,畢竟這些人鼓搗出了 ResNet
殘差網路,對神經網路的理解是其他人沒法比的。
儘管 R-CNN 效果不錯,但是他還有兩個硬傷:
硬傷一、算力冗餘
先生成候選區域,再對區域進行卷積,這裡有兩個問題:其一是候選區域會有一定程度的重疊,對相同區域進行重複卷積;其二是每個區域進行新的卷積需要新的存儲空間。何愷明等人意識到這個可以優化,於是把先生成候選區域再卷積,變成了先卷積後生成區域。「簡單地」改變順序,不僅減少存儲量而且加快了訓練速度。
硬傷二、圖片縮放
無論是剪裁(Crop)還是縮放(Warp),在很大程度上會丟失圖片原有的信息導致訓練效果不好,如上圖所示。直觀的理解,把車剪裁成一個門,人看到這個門也不好判斷整體是一輛車;把一座高塔縮放成一個胖胖的塔,人看到也沒很大把握直接下結論。人都做不到,機器的難度就可想而知了。
何愷明等人發現了這個問題,於是思索有什麼辦法能不對圖片進行變形,將圖片原汁原味地輸入進去學習。
最後他們發現問題的根源是 FC Layer
(全連接層)需要確定輸入維度,於是他們在輸入全連接層前定義一個特殊的池化層,將輸入的任意尺度 feature maps
組合成特定維度的輸出,這個組合可以是不同大小的拼湊,如同拼湊七巧板般。
舉個例子,我們要輸入的維度 ,那麼我們可以這樣組合 。
SPP Net
的出現是如同一道驚雷,不僅減少了計算冗餘,更重要的是打破了固定尺寸輸入這一束縛,讓後來者享受到這一縷陽光。
註:這個時候 FCN 還沒有出現,FCN 是同年 11 月發表的,SPP Net 是 4 月發表的。
Fast R-CNN / 2015
論文:Fast R-CNN
此時,我們的 rbg 大哥也按耐不住了——自己家的孩子,自己養大——於是憋出了一個大招 Fast R-CNN
。取這個名字的意思就是「兒子比爸爸強」,相對於原來的 Slow R-CNN
,做了速度上的優化——就是快。
在這篇論文中,引用了 SPP Net
的工作,並且致謝其第一作者何愷明的慷慨解答。
縱觀全文,最大的建樹就是將原來的串列結構改成並行結構。
改進:流水線
原來的 R-CNN
是先對候選框區域進行分類,判斷有沒有物體,如果有則對 Bounding Box
進行精修 回歸
。這是一個串聯式的任務,那麼勢必沒有並聯的快,所以 rbg 就將原有結構改成並行——在分類的同時,對 Bbox
進行回歸。
這一改變將 Bbox
和 Clf
的 loss
結合起來變成一個 Loss
一起訓練,並吸納了 SPP Net
的優點,最終不僅加快了預測的速度,而且提高了精度。
Faster R-CNN / 2015
論文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
眾人拾柴火焰高,原來 SPP Net
的人馬和 rbg 一起研究憋大招,在 rbg
和 何愷明
綻放完光芒後,任少卿
老哥發出了太陽般的光芒——RPN
的概念讓人不得不服。
神經網路一統天下
在 Faster R-CNN
前,我們生產候選區域都是用的一系列啟發式演算法,基於 Low Level
特徵生成區域。這樣就有兩個問題:
第一個問題 是生成區域的靠譜程度隨緣,而 兩刀流
演算法正是依靠生成區域的靠譜程度——生成大量無效區域則會造成算力的浪費、少生成區域則會漏檢;
第二個問題 是生成候選區域的演算法是在 CPU 上運行的,而我們的訓練在 GPU 上面,跨結構交互必定會有損效率。
那麼怎麼解決這兩個問題呢?
於是乎,任少卿等人提出了一個 Region Proposal Networks
的概念,利用神經網路自己學習去生成候選區域。
這種生成方法同時解決了上述的兩個問題,神經網路可以學到更加高層、語義、抽象的特徵,生成的候選區域的可靠程度大大提高;可以從上圖看出 RPNs
和 RoI Pooling
共用前面的卷積神經網路——將 RPNs
嵌入原有網路,原有網路和 RPNs
一起預測,大大地減少了參數量和預測時間。
在 RPNs
中引入了 anchor
的概念,feature map
中每個滑窗位置都會生成 k
個 anchors
,然後判斷 anchor
覆蓋的圖像是前景還是背景,同時回歸 Bbox
的精細位置,預測的 Bbox
更加精確。
將 兩刀流
的兩刀併入同一個網路,這一操作足夠載入史冊了。
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 ,性能卻有了較為明顯的提升,這個升級的版本讓人們不無嘖嘖驚嘆。
作者稱其為 meta algorithm
,即一個基礎的演算法,只要需要「目標檢測」或者「語義分割」都可以使用這個作為 Backbone
。
小結 / 2018
我們再總結一下 R-CNN
的發家史:
從平台上講
一開始的跨平台,到最後的統一到 GPU 內,效率低到效率高。
從結構上講
一開始的串列到並行,從單一信息流到三條信息流。
從最開始 50s 一張圖片的到最後 200ms 一張圖片,甚至可以達到 6 FPS 的高精度識別,無不彰顯著人類的智慧。
一刀流 YOLO & SSD
一刀流的想法就比較暴力,給定一張圖像,使用回歸的方式輸出這個目標的邊框和類別。一刀流最核心的還是利用了分類器優秀的分類效果,首先給出一個大致的範圍(最開始就是全圖)進行分類,然後不斷迭代這個範圍直到一個精細的位置,如上圖從藍色的框框到紅色的框框。
這就是一刀流回歸的思想,這樣做的優點就是快,但是會有許多漏檢。
YOLO / 2015
論文:YOLO
YOLO 就是使用回歸這種做法的典型演算法。
首先將圖片 Resize
到固定尺寸,然後通過一套卷積神經網路,最後接上 FC
直接輸出結果,這就他們整個網路的基本結構。
更具體地做法,是將輸入圖片劃分成一個 SxS
的網格,每個網格負責檢測網格裡面的物體是啥,並輸出 Bbox Info
和 置信度
。這裡的置信度指的是 該網格內含有什麼物體
和 預測這個物體的準確度
。
更具體的是如下定義:
我們可以從這個定義得知,當框中沒有物體的時候,整個置信度都會變為 0 。
這個想法其實就是一個簡單的分而治之想法,將圖片卷積後提取的特徵圖分為 SxS
塊,然後利用優秀的分類模型對每一塊進行分類,將每個網格處理完使用 NMS
(非極大值抑制)的演算法去除重疊的框,最後得到我們的結果。
SSD / 2015
論文:SSD
YOLO 這樣做的確非常快,但是問題就在於這個框有點大,就會變得粗糙——小物體就容易從這個大網中漏出去,因此對小物體的檢測效果不好。
所以 SSD 就在 YOLO 的主意上添加了 Faster R-CNN 的 Anchor 概念,並融合不同卷積層的特徵做出預測。
我們從上圖就可以很明顯的看出這是 YOLO 分治網路
和 Faster R-CNN Anchor
的融合,這就大大提高了對小物體的檢測。這裡作者做實驗也提到和 Faster R-CNN
一樣的結果,這個 Anchor
的數量和形狀會對性能造成較大的影響。
除此之外,由於這個 Anchor
是規整形狀的,但是有些物體的擺放位置是千奇百怪的,所以沒有 數據增強
前的效果比增強後的效果差 7 個百分點。直觀點理解,做輕微地角度扭曲讓 Anchor
背後的神經元「看到」更多的信息。
還有一個重大的進步是結合了不同尺寸大小 Feature Maps 所提取的特徵,然後進行預測。這是 FPN 網路提出前的第一次做 Feature Pyramid 的嘗試,這個特徵圖金字塔結合了不同層的信息,從而結合了不同 尺寸
和 大小
的特徵信息。
這個嘗試就大大地提高了識別的精度,且高解析度(尺寸大)的 Feature Map 中含有更多小物體的信息,也是因為這個原因 SSD 能夠較好的識別小物體。
除此之外,和 YOLO 最大的區別是,SSD 沒有接 FC 減少了大量的參數量、提高了速度。
YOLO9000 / 2016
論文:YOLO9000
到了 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
,訓練的時候數據增強…
所以強是強,但沒啥新意,SSD 和 YOLO9000 可以歸為一類。
小結 / 2018
回顧過去,從 YOLO 到 SSD ,人們兼收並蓄把不同思想融合起來。
YOLO 使用了分治思想,將輸入圖片分為 SxS
的網格,不同網格用性能優良的分類器去分類。
但是 Resize
輸入,必定會損失許多的信息和一定的精度,這也許是一刀流快的原因。
無論如何,YOLO 和 SSD 這兩篇論文都是讓人不得不讚歎他們想法的精巧,讓人受益良多。
總結 Summary
在「目標檢測」中有兩個指標:快(Fast)
和 准(Accurate)
。
一刀流代表的是快,但是最後在快和准中找到了平衡,第一是快,第二是准。
兩刀流代表的是准,雖然沒有那麼快但是也有 6 FPS 可接受的程度,第一是准,第二是快。兩類演算法都有其適用的範圍,比如說實時快速動作捕捉,一刀流更勝一籌;複雜、多物體重疊,兩刀流當仁不讓。沒有不好的演算法,只有合適的使用場景。
我相信 Mask R-CNN
並不是「目標檢測」的最終答案,江山代有才人出,展望未來。
參考資料 Reference
- R-CNN 「Rich feature hierarchies for accurate object detection and semantic segmentation」
- SPP Net 「Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition」
- Fast R-CNN 「Fast R-CNN」
- Faster R-CNN 「Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks」
- Mask R-CNN 「Mask R-CNN」
- YOLO 「You Only Look Once: Unified, Real-Time Object Detection」
- SSD 「SSD: Single Shot MultiBox Detector」
- YOLO9000 「YOLO9000: Better, Faster, Stronger」
推薦閱讀:
※PASCAL VOC數據集的標註格式
※【目標檢測簡史】Mask-RCNN
TAG:目標檢測 | 深度學習DeepLearning |