目標檢測算法綜述
目前目標檢測領域的深度學習方法主要分為兩類:two stage的目標檢測算法;one stage的目標檢測算法。前者是先由算法生成一系列作為樣本的候選框,再通過卷積神經網絡進行樣本分類;后者則不用產生候選框,直接將目標邊框定位的問題轉化為回歸問題處理。正是由於兩種方法的差異,在性能上也有不同,前者在檢測准確率和定位精度上占優,后者在算法速度上占優。
相對於R-CNN系列的"看兩眼"(候選框提取與分類),YOLO只需要Look Once.
·
· YOLO統一為一個回歸問題,而R-CNN將檢測結果分為兩部分求解:物體類別(分類問題),物體位置即bounding box(回歸問題)。
傳統的目標檢測一般使用滑動窗口的框架,主要包括三個步驟:
1.利用不同尺寸的滑動窗口框住圖中的某一部分作為候選區域;
2.提取候選區域相關的視覺特征。比如人臉檢測常用的Harr特征;行人檢測和普通目標檢測常用的HOG特征等;
3.利用分類器進行識別,比如常用的SVM模型。
基於深度學習的目標檢測分為兩派:
基於區域提名的,如R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN;
端到端(End-to-End),無需區域提名的,如YOLO、SSD。
目前來說,基於區域提名的方法依然占據上風,但端到端的方法速度上優勢明顯,后續的發展拭目以待。
接下來是對相關研究的詳細介紹。
1、首先介紹的是區域提名--選擇性搜索,以及用深度學習做目標檢測的早期工作--Overfeat。
選擇性搜索:不斷迭代合並候選區域,已被棄用。
OverFeat: 用CNN做分類、定位和檢測的經典之作(馬克一記)。
2、基於區域提名的方法:主要介紹R-CNN系列
R-CNN:之前的工作都是用滑動窗口的方式,速度很慢,R-CNN采用的是selective search。
它和OverFeat類似,但缺點是速度慢。
SPP-net:針對剪裁技術可能出現的問題,SPP不管是對整副圖像還是裁剪后的圖像,都提取相同維度的特征,這樣可以統一送至全連接層。
FAST R-CNN:主要解決2000個候選框帶來的重復計算問題。
FASTER R-CNN:拋棄了selective search,引入了RPN網格。
R-FCN:將最后的全連接層換為了卷積層。
3、端到端(end-to-end):無需區域提名
YOLO:將448*448的圖像分成S*S的網絡,簡化目標檢測流程;
SSD: YOLO的改進,分為兩部分:圖像分類的網絡和多尺度特征映射網絡。
YOLO v1
這是繼RCNN,fast-RCNN和faster-RCNN之后,rbg(RossGirshick)針對DL目標檢測速度問題提出的另外一種框架。YOLO V1其增強版本GPU中能跑45fps,簡化版本155fps。
1. YOLO的核心思想
- YOLO的核心思想就是利用整張圖作為網絡的輸入,直接在輸出層回歸bounding box的位置和bounding box所屬的類別。
- faster RCNN中也直接用整張圖作為輸入,但是faster-RCNN整體還是采用了RCNN那種 proposal+classifier的思想,只不過是將提取proposal的步驟放在CNN中實現了,而YOLO則采用直接回歸的思路。
2.YOLO的實現方法
- 將一幅圖像分成SxS個網格(grid cell),如果某個object的中心 落在這個網格中,則這個網格就負責預測這個object。
- 每個網格要預測B個bounding box,每個bounding box除了要回歸自身的位置之外,還要附帶預測一個confidence值。
這個confidence代表了所預測的box中含有object的置信度和這個box預測的有多准兩重信息,其值是這樣計算的:
其中如果有object落在一個grid cell里,第一項取1,否則取0。 第二項是預測的bounding box和實際的groundtruth之間的IoU值。 - 每個bounding box要預測(x, y, w, h)和confidence共5個值,每個網格還要預測一個類別信息,記為C類。則SxS個網格,每個網格要預測B個bounding box還要預測C個categories。輸出就是S x S x (5*B+C)的一個tensor。
注意:class信息是針對每個網格的,confidence信息是針對每個bounding box的。 - 舉例說明: 在PASCAL VOC中,圖像輸入為448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x30的一個tensor。
整個網絡結構如下圖所示: - 在test的時候,每個網格預測的class信息和bounding box預測的confidence信息相乘,就得到每個bounding box的class-specific confidence scor
等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個bounding box預測的confidence。這個乘積即encode了預測的box屬於某一類的概率,也有該box准確度的信息。 - 得到每個box的class-specific confidence score以后,設置閾值,濾掉得分低的boxes,對保留的boxes進行NMS處理,就得到最終的檢測結果。
- 注:
*由於輸出層為全連接層,因此在檢測時,YOLO訓練模型只支持與訓練圖像相同的輸入分辨率。
*雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多只預測出一個物體。當物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷。
3.YOLO的實現細節
- 每個grid有30維,這30維中,8維是回歸box的坐標,2維是box的confidence,還有20維是類別。
其中坐標的x,y用對應網格的offset歸一化到0-1之間,w,h用圖像的width和height歸一化到0-1之間。 - 在實現中,最主要的就是怎么設計損失函數,讓這個三個方面得到很好的平衡。作者簡單粗暴的全部采用了sum-squared error loss來做這件事。
- 這種做法存在以下幾個問題:
第一,8維的localization error和20維的classification error同等重要顯然是不合理的;
第二,如果一個網格中沒有object(一幅圖中這種網格很多),那么就會將這些網格中的box的confidence push到0,相比於較少的有object的網格,這種做法是overpowering的,這會導致網絡不穩定甚至發散。
解決辦法:- 更重視8維的坐標預測,給這些損失前面賦予更大的loss weight, 記為
在pascal VOC訓練中取5。
- 對沒有object的box的confidence loss,賦予小的loss weight,記為
在pascal VOC訓練中取0.5。
- 有object的box的confidence loss和類別的loss的loss weight正常取1。
- 更重視8維的坐標預測,給這些損失前面賦予更大的loss weight, 記為
- 對不同大小的box預測中,相比於大box預測偏一點,小box預測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。
為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。這個參考下面的圖很容易理解,小box的橫軸值較小,發生偏移時,反應到y軸上相比大box要大。(也是個近似逼近方式) - 一個網格預測多個box,希望的是每個box predictor專門負責預測某個object。具體做法就是看當前預測的box與ground truth box中哪個IoU大,就負責哪個。這種做法稱作box predictor的specialization。
- 最后整個的損失函數如下所示:
這個損失函數中:- 只有當某個網格中有object的時候才對classification error進行懲罰。
- 只有當某個box predictor對某個ground truth box負責的時候,才會對box的coordinate error進行懲罰,而對哪個ground truth box負責就看其預測值和ground truth box的IoU是不是在那個cell的所有box中最大。
- 其他細節,例如使用激活函數使用leak RELU,模型用ImageNet預訓練等等,在這里就不一一贅述了。
- 注:
*YOLO方法模型訓練依賴於物體識別標注數據,因此,對於非常規的物體形狀或比例,YOLO的檢測效果並不理想。
*YOLO采用了多個下采樣層,網絡學到的物體特征並不精細,因此也會影響檢測效果。
* YOLO loss函數中,大物體IOU誤差和小物體IOU誤差對網絡訓練中loss貢獻值接近(雖然采用求平方根方式,但沒有根本解決問題)。因此,對於小物體,小的IOU誤差也會對網絡優化過程造成很大的影響,從而降低了物體檢測的定位准確性。
4.YOLO的缺點
- YOLO對相互靠的很近的物體,還有很小的群體 檢測效果不好,這是因為一個網格中只預測了兩個框,並且只屬於一類。
- 同一類物體出現的新的不常見的長寬比和其他情況時,泛化能力偏弱。
- 由於損失函數的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。
簡單回顧YOLOv1的檢測步驟:
(1) 給個一個輸入圖像,首先將圖像划分成7 * 7的網格。
(2) 對於每個網格,每個網格預測2個bouding box(每個box包含5個預測量)以及20個類別概率,總共輸出7×7×(2*5+20)=1470個tensor
(3) 根據上一步可以預測出7 * 7 * 2 = 98個目標窗口,然后根據閾值去除可能性比較低的目標窗口,再由NMS去除冗余窗口即可。
YOLOv1使用了end-to-end的回歸方法,沒有region proposal步驟,直接回歸便完成了位置和類別的判定。種種原因使得YOLOv1在目標定位上不那么精准,直接導致YOLO的檢測精度並不是很高。
YOLOV2
新的YOLO版本論文全名叫“YOLO9000: Better, Faster, Stronger”,主要有兩個大方面的改進:
第一,作者使用了一系列的方法對原來的YOLO多目標檢測框架進行了改進,在保持原有速度的優勢之下,精度上得以提升。VOC 2007數據集測試,67FPS下mAP達到76.8%,40FPS下mAP達到78.6%,基本上可以與Faster R-CNN和SSD一戰。
第二,作者提出了一種目標分類與檢測的聯合訓練方法,通過這種方法,YOLO9000可以同時在COCO和ImageNet數據集中進行訓練,訓練后的模型可以實現多達9000種物體的實時檢測。
YOLOv2精度的改進(Better)
YOLO一代有很多缺點,作者希望改進的方向是:改善recall,提升定位的准確度,同時保持分類的准確度。
batch Normalization:在卷基層后面增加了batch Normalization,去掉了dropout層,mAP提升2%。
High ResolutionClassifier:x訓練網絡的時候將網絡從224*224變為448*448,當然后續為了保證特征圖中只有基數個定位位置,從而保證只有一個中心細胞,網絡最終設置為416*416。最終實現了4%的mAP提升。
Convoutional with AnchorBoxes:作者吸收了faster RCNN中RPN的思想,去掉了yolov1中的全連接層,加入了anchor boxes,這樣做的目的就是得到更高的召回率,當然召回率高了,mAP就會相應的下降,這也是人之常情。最終,yolov1只有98個邊界框,yolov2達到了1000多個。mAP由69.5下降到69.2,下降了0.3,召回率由81%提升到88%,提升7%。
Dimension Clusters:這里作者提出了kmeans聚類,這里的K作者取值為5,這樣會在模型復雜度和召回率之間達到一個好的折中。並且使用聚類的中心代替Anchor,最后使用歐式距離進行邊界框優先權的衡量,歐式距離公式如下所示,距離越小說明優先權越高。在k為5 的條件下,Avg IOU從60.9提升到了61.0。在k為9的的條件下Avg IOU提升為67.2
Direction locationprediction:
引入了anchor boxes就會產生模型不穩定的問題,該問題產生於邊界框位置的預測。簡單的解釋,如果訓練的圖片中的物體一張是在左面,下一張又在右面,就會產生這樣的波動,顯然的這個過程是不受控制的,畢竟圖片中的物體位置他在哪里就在哪里。這里作者,變換了個思路,把最終預測的相對於anchor的邊界框的相關系數變為預測相對於grid cell(yolo v1的機制)的相關系數,使得輸出的系數在0-1直接波動,如此就解決了波動的問題。最終,使用維度聚類和直接預測邊界框中心比使用anchor boxes提升了5%的mAP。
首先,yolov2邊框的表示方式通過框的中心坐標bx,by,和框的寬bw,高bh這4個變量來表示。實際預測的值為tx,ty,tw,th。
由tx,ty,tw,th得到bx,by,bw,bh的詳細公式如上圖,其中,
cx,cy為框的中心坐標所在的grid cell 距離左上角第一個grid cell的cell個數。
tx,ty為預測的邊框的中心點坐標。
σ()函數為logistic函數,將坐標歸一化到0-1之間。最終得到的bx,by為歸一化后的相對於grid cell的值
tw,th為預測的邊框的寬,高。
pw,ph為anchor的寬,高。實際在使用中,作者為了將bw,bh也歸一化到0-1,實際程序中的 pw,ph為anchor的寬,高和featuremap的寬,高的比值。最終得到的bw,bh為歸一化后相對於anchor的值
σ(t0)表示預測的邊框的置信度,為預測的邊框的概率和預測的邊框與ground truth的IOU值的乘積。
Fine-Grained Features:有別於faster rcnn和SSD采用多尺度的特征圖進行預測,yolov2提出了一個全新的思路,作者引入了passthrough layer,這個層的作用就是將上一層特征圖的相鄰像素都切除一部分組成了另外一個通道。例如,將26*26*512的特征圖變為13*13*2048的特征圖(這里具體的實現過程需要看作者的源碼,但是,為了解釋這個變化過程,可以做這樣的解釋,就是將一個26*26的圖的像素放到4個13*13的圖中,水平每2個像素取1個,垂直也是每2個像素取一個,一共就可以得到2*2=4個,512*4=2048),使得特征圖的數目提高了4倍,同時,相比於26*26的特征圖,13*13的特征圖更有利用小目標物的檢測,
該改進使得mAP提升1%。
Multi-Scale Training:這里作者提出的訓練方法也很獨特,在訓練過程中就每隔10batches,隨機的選擇另外一種尺度進行訓練,這里,作者給出的訓練尺度為{320,352,……,608},這個訓練的方法,使得最終得到的模型可以對不同分辨率的圖像都能達到好的檢測效果。
Faster:
這里,vgg16雖然精度足夠好,但是模型比較大,網絡傳輸起來比較費時間,因此,作者提出了一個自己的模型,Darknet-19。而darknetv2也正式已Darknet-19作為pretrained model訓練起來的。
- Draknet19
YOLO v2基於一個新的分類model,有點類似與VGG。YOLO v2使用3*3filter,每次Pooling之后都增加一倍Channels的數量。YOLO v2使用全局平均Pooling,使用Batch Normilazation來讓訓練更穩定,加速收斂,使model規范化。
最終的model–Darknet19,有19個卷積層和5個maxpooling層,處理一張圖片只需要5.58 billion次運算,在ImageNet上達到72.9%top-1精確度,91.2%top-5精確度。
- Training for classification
網絡訓練在 ImageNet 1000類分類數據集,訓練了160epochs,使用隨機梯度下降,初始學習率為0.1, polynomial
rate decay with a power of 4, weight decay of 0.0005 and momentum of 0.9 。訓練期間使用標准的數據擴大方法:隨機裁剪、旋轉、變換顏色(hue)、變換飽和度(saturation), 變換曝光度(exposure shifts)。
在訓練時,把整個網絡在更大的448*448分辨率上Fine Turnning 10個 epoches,初始學習率設置為0.001,這種網絡達到達到76.5%top-1精確度,93.3%top-5精確度。
- Training for detection
網絡去掉了最后一個卷積層,而加上了三個3*3卷積層,每個卷積層有1024個Filters,每個卷積層緊接着一個1*1卷積層, with
the number of outputs we need for detection。
對於VOC數據,網絡預測出每個網格單元預測五個Bounding Boxes,每個Bounding Boxes預測5個坐標和20類,所以一共125個Filters,增加了Passthough層來獲取前面層的細粒度信息,網絡訓練了160epoches,初始學習率0.001,dividing it by 10 at 60 and 90 epochs,a weight decay of 0.0005 and momentum of 0.9,數據擴大方法相同,對COCO與VOC數據集的訓練對策相同。
Stronger:
這里作者的想法也很新穎,解決了2個不同數據集相互排斥(mutualy exclusive)的問題。作者提出了WordTree,使用該樹形結構成功的解決了不同數據集中的排斥問題。使用該樹形結構進行分層的預測分類,在某個閾值處結束或者最終達到葉子節點處結束。下面這副圖將有助於WordTree這個概念的理解。
在訓練的過程中,當網絡遇到一個來自檢測數據集的圖片與標記信息,那么就把這些數據用完整的YOLO v2 loss功能反向傳播這個圖片。當網絡遇到一個來自分類數據集的圖片和分類標記信息,只用整個結構中分類部分的loss功能反向傳播這個圖片。
但是檢測數據集只有粗粒度的標記信息,像“貓“、“ 狗”之類,而分類數據集的標簽信息則更細粒度,更豐富。比如狗這一類就包括”哈士奇“”牛頭梗“”金毛狗“等等。所以如果想同時在監測數據集與分類數據集上進行訓練,那么就要用一種一致性的方法融合這些標簽信息。
再者,用於分類的方法,大多是用softmax layer方法,softmax意味着分類的類別之間要互相獨立的。而盲目地混合數據集訓練,就會出現比如:檢測數據集的分類信息中”狗“這一分類,在分類數據集合中,就會有的不同種類的狗”哈士奇“”牛頭梗“”金毛“這些分類,這兩種數據集之間的分類信息不相互獨立。所以使用一種多標簽的model來混合數據集,假設一個圖片可以有多個分類信息,並假定分類信息必須是相互獨立的規則可以被忽略。
- Hierarchical classification
WordNet的結構是一個直接圖表(directed graph),而不是樹型結構。因為語言是復雜的,狗這個詞既屬於‘犬科’又屬於‘家畜’兩類,而‘犬科’和‘家畜’兩類在wordnet中則是同義詞,所以不能用樹形結構。
作者希望根據ImageNet中包含的概念來建立一個分層樹,為了建立這個分層樹,首先檢查ImagenNet中出現的名詞,再在WordNet中找到這些名詞,再找到這些名詞到達他們根節點的路徑(在這里設為所有的根節點為實體對象(physical object))。在WordNet中,大多數同義詞只有一個路徑,所以首先把這條路徑中的詞全部都加到分層樹中。接着迭代地檢查剩下的名詞,並盡可能少的把他們添加到分層樹上,添加的原則是取最短路徑加入到樹中。
為了計算某一結點的絕對概率,只需要對這一結點到根節點的整條路徑的所有概率進行相乘。所以比如你想知道一個圖片是否是Norfolk terrier的概率,則進行如下計算:
為了驗證這一個方法,在WordTree上訓練Darknet19的model,使用1000類的ImageNet進行訓練,為了建立WordtTree 1K,把所有中間詞匯加入到WordTree上,把標簽空間從1000擴大到了1369。在訓練過程中,如果有一個圖片的標簽是”Norfolk terrier“,那么這個圖片還會獲得”狗“(dog)以及“哺乳動物”(mammal)等標簽。總之現在一張圖片是多標記的,標記之間不需要相互獨立。
如Figure5所示,之前的ImageNet分類是使用一個大softmax進行分類。而現在,WordTree只需要對同一概念下的同義詞進行softmax分類。
使用相同的訓練參數,這種分層結構的Darknet19達到71.9%top-1精度和90.4%top-5精確度,精度只有微小的下降。
這種方法的好處:在對未知或者新的物體進行分類時,性能降低的很優雅(gracefully)。比如看到一個狗的照片,但不知道是哪種種類的狗,那么就高置信度(confidence)預測是”狗“,而其他狗的種類的同義詞如”哈士奇“”牛頭梗“”金毛“等這些則低置信度。
- Datasets combination with wordtree
用WordTree 把數據集合中的類別映射到分層樹中的同義詞上,例如上圖Figure 6,WordTree混合ImageNet與COCO。
- Joint classification and detection
作者的目的是:訓練一個Extremely Large Scale檢測器。所以訓練的時候使用WordTree混合了COCO檢測數據集與ImageNet中的Top9000類,混合后的數據集對應的WordTree有9418個類。另一方面,由於ImageNet數據集太大了,作者為了平衡一下兩個數據集之間的數據量,通過過采樣(oversampling)COCO數據集中的數據,使COCO數據集與ImageNet數據集之間的數據量比例達到1:4。
YOLO9000的訓練基於YOLO v2的構架,但是使用3priors而不是5來限制輸出的大小。當網絡遇到檢測數據集中的圖片時則正常地反方向傳播,當遇到分類數據集圖片的時候,只使用分類的loss功能進行反向傳播。同時作者假設IOU最少為 .3。最后根據這些假設進行反向傳播。
使用聯合訓練法,YOLO9000使用COCO檢測數據集學習檢測圖片中的物體的位置,使用ImageNet分類數據集學習如何從大量的類別中進行分類。
為了評估這一方法,使用ImageNet Detection Task對訓練結果進行評估。
評估結果:
YOLO9000取得19.7mAP。
在未學習過的156個分類數據上進行測試,mAP達到16.0。
YOLO9000的mAP比DPM高,而且YOLO有更多先進的特征,YOLO9000是用部分監督的方式在不同訓練集上進行訓練,同時還能檢測9000個物體類別,並保證實時運行。
雖然YOLO9000對動物的識別性能很好,但是對類別為”sungalsses“或者”swimming trunks“這些衣服或者裝備的類別,它的識別性能不是很好,見table 7。這跟數據集的數據組成有很大關系。
總結
YOLO v2 代表着目前最先進物體檢測的水平,在多種監測數據集中都要快過其他檢測系統,並可以在速度與精確度上進行權衡。
YOLO 9000 的網絡結構允許實時地檢測超過9000種物體分類,這歸功於它能同時優化檢測與分類功能。使用WordTree來混合來自不同的資源的訓練數據,並使用聯合優化技術同時在ImageNet和COCO數據集上進行訓練,YOLO9000進一步縮小了監測數據集與識別數據集之間的大小代溝。
文章還提出了WordTree,數據集混合訓練,多尺寸訓練等全新的訓練方法。
YOLO v3
YOLOv3在Pascal Titan X上處理608x608圖像速度達到20FPS,在 COCO test-dev 上 mAP@0.5 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網絡)的結果相近,並且速度快4倍.
YOLO v3的模型比之前的模型復雜了不少,可以通過改變模型結構的大小來權衡速度與精度。
速度對比如下:
‘
YOLOv3 在實現相同准確度下要顯著地比其它檢測方法快。時間都是在采用 M40 或 Titan X 等相同 GPU 下測量的。
簡而言之,YOLOv3 的先驗檢測(Prior detection)系統將分類器或定位器重新用於執行檢測任務。他們將模型應用於圖像的多個位置和尺度。而那些評分較高的區域就可以視為檢測結果。此外,相對於其它目標檢測方法,我們使用了完全不同的方法。我們將一個單神經網絡應用於整張圖像,該網絡將圖像划分為不同的區域,因而預測每一塊區域的邊界框和概率,這些邊界框會通過預測的概率加權。我們的模型相比於基於分類器的系統有一些優勢。它在測試時會查看整個圖像,所以它的預測利用了圖像中的全局信息。與需要數千張單一目標圖像的 R-CNN 不同,它通過單一網絡評估進行預測。這令 YOLOv3 非常快,一般它比 R-CNN 快 1000 倍、比 Fast R-CNN 快 100 倍。
改進之處:
- 1.多尺度預測 (類FPN)
- 2.更好的基礎分類網絡(類ResNet)和分類器 darknet-53,見下圖。
3.分類器-類別預測:
YOLOv3不使用Softmax對每個框進行分類,主要考慮因素有兩個:
- a.Softmax使得每個框分配一個類別(score最大的一個),而對於
Open Images
這種數據集,目標可能有重疊的類別標簽,因此Softmax不適用於多標簽分類。 - b.Softmax可被獨立的多個logistic分類器替代,且准確率不會下降。
分類損失采用binary cross-entropy loss.
多尺度預測
每種尺度預測3個box, anchor的設計方式仍然使用聚類,得到9個聚類中心,將其按照大小均分給3中尺度.
- 尺度1: 在基礎網絡之后添加一些卷積層再輸出box信息.
- 尺度2: 從尺度1中的倒數第二層的卷積層上采樣(x2)再與最后一個16x16大小的特征圖相加,再次通過多個卷積后輸出box信息.相比尺度1變大兩倍.
- 尺度3: 與尺度2類似,使用了32x32大小的特征圖.