1. 程式人生 > >物體檢測方法 - YOLO 詳解

物體檢測方法 - YOLO 詳解

分享圖片 only 遇到 fse 網絡 edi 代碼 正常 對待

最近遇到一些卡證識別的檢測問題,打算先把理論知識梳理一下,隨後還會梳理一版代碼註釋。

  以前的region+proposal來檢測的框架,這一系列速度和精度不斷提高,但是還是無法達到實時。存在的主要問題為:速度不夠快,主要原因是proposal比較多,特征進行分類的時候,相同區域的特征計算多遍,所以BGR大神有了最新作品,YOLO,故名思議,就是解決Faster-RCNN中proposal重復look的問題。這一些列代表作有YOLO和SSD.首先介紹YOLO.

  1. 作者Joseph Redmon ? , Santosh Divvala ?? , Ross Girshick ? , Ali Farhadi,文獻[1]
  2. 優點,速度快(45fps,小模型快速版本為155fps),缺點,很明顯對位置預測不夠精確,對小物體效果不夠理想。
  3. 做法,簡單粗暴,網格劃分為S*S個網格,對每個網格直接進行回歸預測,最後NMS進行處理。

1. YOLO的核心思想

  • YOLO的核心思想就是利用整張圖作為網絡的輸入,直接在輸出層回歸bounding box的位置和bounding box所屬的類別。
  • 沒記錯的話faster RCNN中也直接用整張圖作為輸入,但是faster-RCNN整體還是采用了RCNN那種 proposal+classifier的思想,只不過是將提取proposal的步驟放在CNN中實現了。

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 score:
  • 技術分享圖片
  • 等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個bounding box預測的confidence。這個乘積即encode了預測的box屬於某一類的概率,也有該box準確度的信息。
  • 得到每個box的class-specific confidence score以後,設置閾值,濾掉得分低的boxes,對保留的boxes進行NMS處理,就得到最終的檢測結果。

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。
  • 對不同大小的box預測中,相比於大box預測偏一點,小box預測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。 為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。這個參考下面的圖很容易理解,小box的橫軸值較小
  • 技術分享圖片
  • [補充,個人覺得還有更好的選擇,W,H歸一化為相對變化,這樣對不同大小的物體,w,同等對待],發生偏移時,反應到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預訓練等等,在這裏就不一一贅述了。

4.YOLO的缺點

  • YOLO對相互靠的很近的物體,還有很小的群體 檢測效果不好,這是因為一個網格中只預測了兩個框,並且只屬於一類。
  • 對測試圖像中,同一類物體出現的新的不常見的長寬比和其他情況是。泛化能力偏弱。
  • 由於損失函數的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。
  • 簡介: 由於YOLO簡單粗暴的將圖像進行網格劃分,然後對每個網格進行處理,這樣導致定位不精確等一些列問題。而基於region proposal卻又定位較精確的優點,那麽SSD就結合了YOLO和anchor進行檢測,結果也是比yolo提高很多【72%mAP】,速度58fps.
  • 和faster的anchor不同之處在於,SSD在多個featureMap上進行處理,因為每一層featureMap的感受野不同。 faster是先提取proposal,然後在分類,而SSD值利用anchor直接進行分類和BBox回歸。由於他是Yolo和anchor的結合,具體不再展開。
  • 下面給出SSD和YOLO網絡比較:
  • 技術分享圖片

5.SSD,文獻【2】

 [1].You Only Look Once:Unified, Real-Time Object Detection
 [2].SSD:Single Shot MultiBox Detector

物體檢測方法 - YOLO 詳解