目標檢測問題
分為兩個子問題:
- 找到圖片中哪些位置、哪些區域含有目標對象
- 識別這些區域中的目標對象是什么
基于CNN的目標檢測算法能夠很好的解決第二個問題,在一張圖片僅含一個對象,且該對象占據了整張圖片絕大部分面積時,基于CNN的對象識別算法具有很高的準確率。
一種定位目標對象的樸素思路是首先對圖片進行地毯式搜索,遍歷圖片中所有可能出現目標對象的區域,并對每個區域進行目標對象的檢測操作;然后從所有區域的目標檢測結果中挑選一個概率最大的作為最終結果并輸出。顯然,這種方法效率很低。
為了提高解決目標檢測問題的效率,R-CNN(Region-CNN)開創性地提出了基于候選區(Region Proposals)進行目標檢測的選擇性搜索(Selective Search)方法——先從圖片中搜索出約1000至2000個可能存在目標對象的候選區,然后對每個候選區進行目標對象識別操作。這種方法大幅提升了目標檢測的效率。
不過R-CNN的效率依然不高——處理一張圖片大概需要49秒。開發者針對神經網絡結構和候選區算法進行不斷改進,推出了速度更快的Fast R-CNN和Faster R-CNN。Faster R-CNN可以達到約0.2秒/張圖片的速度。
但是!!!因為該類檢測算法始終需要分為兩個階段,先選出候選去,再識別候選區中的對象。這在根本上限制了R-CNN算法性能的進一步提升。
YOLO算法簡介
YOLO(You Only Look Once)是一種基于深度神經網絡的目標對象識別和定位算法,其特點是運行速度快、實時性高。在本實驗中,我們將使用Tiny YOLOv2版本的YOLO算法。
YOLO算法創造性地將R-CNN目標檢測中的選擇候選區和識別候選區對象兩個階段合二為一,這也是YOLO名字的來由(只需看一眼就知道圖片的哪些位置有什么對象)。
在檢測目標時,YOLO首先將圖片劃分為7×7=49的網格,并允許在每個網格中預測出2個可能包含目標對象的候選邊框(Bounding Box)。可將YOLO算法產生的98個Bounding Box理解成98個候選區,它們粗糙地覆蓋了整張輸入圖片。
不管是R-CNN還是YOLO,都需要對選出的候選區進行目標對象的識別操作。識別出某個候選區中的對象后,往往需要對該候選區進行微調,使之包含整個對象,這個微調的過程稱為候選區的邊框回歸。邊框回歸行之有效的原理是對象識別結果的分類信息中已經包含了對象的位置信息。比如當我們看到貓的臉和身體,我們就能推測出貓耳朵和屁股所在的位置。
2.1 YOLOv1算法和網絡模型
R-CNN系列算法的基本思路是候選+識別/分類,因此被稱作是兩級級聯(Two-Stage Cascade)的算法。而YOLOv1算法則更為直接——直接在輸出層對Bounding Box的位置和其中的對象所屬的類別進行回歸,從而將目標檢測問題轉換為回歸問題(Regression)。
YOLOv1的主要流程包括圖片分割、CNN和非極大值抑制。
Step 1: 圖片分割
講輸入圖片的大小縮放到448x448,并進行分割,得到一個7x7的網格。每個網格允許預測出兩個可能包含目標對象的Bounding Box,因此共有98個Bounding Box。
每個Bounding Box可以定義為5元組 B B o x = ( X c , Y c , W , H . C o n f ) BBox=(X_c,Y_c,W,H.Conf) BBox=