- 作者:韓信子@ShowMeAI
- 教程地址:https://www.showmeai.tech/tutorials/35
- 本文地址:https://www.showmeai.tech/article-detail/223
- 聲明:版權所有,轉載請聯系平台與作者並注明出處
收藏ShowMeAI查看更多精彩內容
本系列為吳恩達老師《深度學習專項課程(Deep Learning Specialization)》學習與總結整理所得,對應的課程視頻可以在這里查看。
引言
在ShowMeAI前一篇文章 經典CNN網絡實例詳解 中我們對以下內容進行了介紹:
- 經典CNN結構
- LeNet-5
- AlexNet
- VGG
- ResNet(Residual Network,殘差網絡)
- Inception Neural Network
- 1x1卷積
- 遷移學習
- 數據擴增
- 手工工程與計算機現狀
本篇主要介紹計算機視覺中最典型的應用之一目標檢測,目標檢測任務是對輸入圖像進行分類的同時,檢測圖像中是否包含某些目標,並對他們准確定位並標識。
1.目標定位
我們在前面的內容中,主要給大家介紹圖像識別(分類)相關的知識,除了圖像識別,我們還有「目標定位」和「目標檢測」任務,如下圖所示。
定位分類問題不僅要求判斷出圖片中物體的種類,還要在圖片中標記出它的具體位置,用邊框(Bounding Box,或者稱包圍盒)把物體圈起來。如圖中間所示。
我們稍微說明一下定位分類和目標檢測任務的差別:通常在定位分類問題中,只有一個較大的對象位於圖片中間位置;而在目標檢測問題中,圖片可以含有多個對象,甚至單張圖片中會有多個不同分類的對象。
定位分類任務中的「分類」部分大家已經非常熟悉了,使用如下的卷積神經網絡即可完成。
原始圖片經過若干卷積神經網絡層次后,Softmax層輸出分類(上圖維度是\(4 \times 1\))向量,分別是pedestrain,car,motorcycle和background四類。
對於目標定位問題,其模型如下所示:
為了定位圖片中汽車的位置,可以讓神經網絡多輸出 4 個數字,標記為 \(b_x\)、\(b_y\)、\(b_h\)、\(b_w\)(注意上圖中\(P_c\)是一個表示目標物是否存在的01取值標簽)。將圖片左上角標記為 \((0, 0)\),右下角標記為 \((1, 1)\),則有:
- 橙色方框的中心點:\((b_x, b_y)\)
- 邊界框的高度:\(b_h\)
- 邊界框的寬度:\(b_w\)
因此,訓練集不僅包含對象分類標簽,還包含表示邊界框的四個數字。定義目標標簽 \(Y\) 如下:
則有:
其中,\(c_n\)表示存在第 \(n\)個種類的概率;如果 \(P_c=0\),表示沒有檢測到目標,則輸出標簽后面的 7 個參數都是無效的,可以忽略(用 ? 來表示)。
`
損失函數可以表示為 \(L(\hat{y}, y)\),如果使用平方誤差形式,對於不同的 \(P_c\)有不同的損失函數(注意下標 \(i\) 指標簽的第 \(i\)個值):
-
\(P_c=1\),即\(y_1=1\):\(L(\hat{y},y)=(\hat{y}_1-y_1)^2+(\hat{y}_2-y_2)^2+\cdots+(\hat{y}_8-y_8)^2\)
-
\(P_c=0\),即\(y_1=0\):\(L(\hat{y},y)=(\hat{y}_1-y_1)^2\)
除了使用平方誤差,也可以使用邏輯回歸損失函數,類標簽 \(c_1\),\(c_2\),\(c_3\) 也可以通過 Softmax 輸出。相比較而言,平方誤差已經能夠取得比較好的效果。
2.特征點檢測
神經網絡可以像標識目標的中心點位置那樣,通過輸出圖片上的特征點,來實現對目標特征的識別。在標簽中,這些特征點以多個二維坐標的形式表示。
通過檢測人臉特征點可以進行情緒分類與判斷,或者應用於 AR 領域等等。也可以透過檢測姿態特征點來進行人體姿態檢測。例如人臉識別,可以對人臉部分特征點坐標進行定位檢測,並標記出來,如下圖所示:
上圖中的網絡模型共檢測人臉上\(64\)處特征點,加上是否為人臉的標志位,輸出標簽共有\(64x2+1=129\)個值。檢測人臉特征點有一些典型的場景應用,比如可以進行情緒分類與判斷,或者應用於AR領域等。
除了人臉特征點檢測之外,可以對其進行拓展,基於特征點連接檢測人體姿勢動作,如下圖所示:
3.目標檢測
目標檢測問題中,我們要對圖片中的多個對象進行識別和位置檢測,一種直觀能想到的實現方法是基於滑動窗口的目標檢測(Sliding Windows Detection)算法。該算法的步驟如下:
- ① 訓練集上搜集相應的各種目標圖片和非目標圖片,樣本圖片要求尺寸較小,相應目標居於圖片中心位置並基本占據整張圖片。
- ② 使用訓練集構建 CNN 模型,使得模型有較高的識別率。
- ③ 選擇大小適宜的窗口與合適的固定步幅,對測試圖片進行從左到右、從上倒下的滑動遍歷。每個窗口區域使用已經訓練好的 CNN 模型進行識別判斷。若判斷有目標,則此窗口即為目標區域;若判斷沒有目標,則此窗口為非目標區域。
- ④ 可以選擇更大的窗口,然后重復第三步的操作。
滑動窗口目標檢測的優點:
- 原理簡單,且不需要人為選定目標區域。
滑動窗口目標檢測的缺點
- 需要人為直觀設定滑動窗口的大小和步幅。滑動窗口過小或過大,步幅過大均會降低目標檢測的正確率。
- 每次滑動都要進行一次 CNN 網絡計算,如果滑動窗口和步幅較小,計算成本往往很大。
綜上,滑動窗口目標檢測算法雖然簡單,但是性能不佳,效率較低。
4.基於卷積的滑動窗口實現
滑動窗口目標檢測算法可以借助卷積方式實現,以提高運行速度,節約重復運算成本。
我們需要先對CNN網絡結構做一些調整,以便對進入網絡的「單個滑動窗口區域」更快捷計算,具體做法是把全連接層轉變成為卷積層,如下圖所示:
我們可以看到,使用與上層尺寸一致的濾波算子進行卷積運算,構建的卷積層就可以替代掉原來的全連接層。最終得到的輸出層維度是\(1 \times 1 \times 4\),代表4類輸出值。
對於待檢測圖片,可使用該網絡參數和結構進行運算。例如\(16 \times 16 \times 3\)的圖片,步進長度為2,CNN網絡得到的輸出層為\(2 \times 2 \times 4\)。其中,\(2 \times 2\)表示共有4個窗口結果。
對於更復雜的\(28 \times 28 \times 3\)的圖片,CNN網絡得到的輸出層為\(8 \times 8 \times 4\),共64個窗口結果。
前面提到的滑動窗口目標檢測算法需要反復進行CNN正向計算。例如\(16 \times 16 \times 3\)的圖片需進行4次,\(28 \times 28 \times 3\)的圖片需進行\(64\)次。
利用卷積操作替代后,不管原始圖片有多大,只需要進行一次CNN正向計算,因為其中共享了很多重復計算部分,這大大節約了運算成本。
注意,窗口步進長度與選擇的MAX POOL大小有關。如果需要步進長度為4,只需設置MAX POOL為\(4 \times 4\)即可。
5.邊框預測
滑動窗口目標檢測算法中,邊框的位置可能無法完美覆蓋目標(如下圖藍框),或者大小不合適,或者最准確的邊框並非正方形,而是長方形。
YOLO(You Only Look Once)算法可以用於得到更精確的邊框。YOLO 算法將原始圖片划分為 \(n \times n\) 網格,並將目標定位一節中提到的圖像分類和目標定位算法,逐一應用在每個網格中,每個網格都有標簽如:
若某個目標的中點落在某個網格,則該網格負責檢測該對象。如果目標中心坐標不在當前網格內,則當前網格\(P_c=0\);相反,則當前網格\(P_c=1\)(即只看中心坐標是否在當前網格內)。判斷有目標的網格中,限定了目標區域。
如上面的示例中,如果將輸入的圖片划分為 \(3 \times 3\) 的網格、需要檢測的目標有 3 類,則每一網格部分圖片的標簽會是一個 8 維的列矩陣,最終輸出的就是大小為 \(3 \times 3 \times 8\) 的結果。要得到這個結果,就要訓練一個輸入大小為 \(100 \times 100 \times 3\),輸出大小為 \(3 \times 3 \times 8\) 的 CNN。在實踐中,可能使用更為精細的 \(19 \times 19\) 網格,則兩個目標的中點在同一個網格的概率更小。
YOLO 算法的優點:
- 和圖像分類和目標定位算法類似,顯式輸出邊框坐標和大小,不會受到滑窗分類器的步長大小限制。
- 仍然只進行一次 CNN 正向計算,效率很高,甚至可以達到實時識別。
如何編碼邊框 \(b_x\)、\(b_y\)、\(b_h\)、\(b_w\)?YOLO 算法設 \(b_x\)、\(b_y\)、\(b_h\)、\(b_w\) 的值是相對於網格長的比例。則 \(b_x\)、\(b_y\) 在 0 到 1 之間,而 \(b_h\)、\(b_w\) 可以大於 1。當然,也有其他參數化的形式,且效果可能更好。這里只是給出一個通用的表示方法。
相關論文:Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection。Ng 認為該論文較難理解。
6.交互比
交互比(IoU, Intersection Over Union)函數用於評價對象檢測算法,它計算預測邊框和實際邊框交集(\(I\))與並集(\(U\))之比。
如上圖右側所示,橙色方框為真實目標區域,藍色方框為檢測目標區域。兩塊區域的交集為綠色部分,並集為紫色部分。藍色方框與橙色方框的接近程度可以用IoU比值來定義:
\(IoU\)的值在 0~1 之間,且越接近 1 表示目標的定位越准確。\(IoU \ge 0.5\) 時,一般可以認為預測邊框是正確的,當然也可以更加嚴格地要求一個更高的閾值。
7.非極大值抑制
YOLO 算法中,可能有很多網格檢測到同一目標。如下圖所示
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZRO3ZyqS-1649926014941)(http://image.showmeai.tech/deep_learning_tutorial/213.png)]
非極大值抑制(Non-max Suppression)可以解決上述問題。它的做法很簡單:
- 上圖中每個網格的\(P_c\)值可以求出,\(P_c\)值反映了該網格包含目標中心坐標的可信度。
- 首先選取\(P_c\)最大值對應的網格和區域,然后計算該區域與所有其它區域的IoU,剔除掉IoU大於閾值(例如0.5)的所有網格及區域。這樣就能保證同一目標只有一個網格與之對應,且該網格\(P_c\)最大,最可信。
- 接着,再從剩下的網格中選取\(P_c\)最大的網格,重復上一步的操作。
- 最后,就能使得每個目標都僅由一個網格和區域對應。如下圖所示:
總結非極大值抑制NMS的步驟如下:
- ① 將包含目標中心坐標的可信度 \(P_c\) 小於閾值(例如 0.6)的網格丟棄;
- ② 選取擁有最大 \(P_c\) 的網格;
- ③ 分別計算該網格和其他所有網格的 IoU,將 IoU 超過預設閾值的網格丟棄;
- ④ 重復第 2~3 步,直到不存在未處理的網格。
當然,上面提到的步驟適用於單類別目標檢測。如果要進行多個類別目標檢測,對於每個類別,應該單獨做一次非極大值抑制。
8.Anchor Boxes
到目前為止,我們討論的情況都是一個網格只檢測一個對象。如果要將算法運用在多目標檢測上(如下圖一個人站在一輛車前面),怎么做呢?這里需要用到 Anchor Boxes。
以下圖為例,同一網格出現了兩個目標:人和車。為了同時檢測兩個目標,我們可以設置兩個Anchor Boxes:Anchor box 1檢測人,Anchor box 2檢測車。
對應到網絡中,則每個網格多加了一層輸出:原來的輸出維度是$ 3 \times 3 \times 8$,現在是\(3 \times 3 \times 2 \times 8\)(也可以寫成\(3 \times 3 \times 16\)的形式)。這里的2表示有兩個Anchor Boxes,用來在一個網格中同時檢測多個目標。每個Anchor box都有一個\(P_c\)值,若兩個\(P_c\)值均大於某閾值,則檢測到了兩個目標。
標簽\(y\)形態為
在使用YOLO算法時,只需對每個Anchor box使用上一節的非最大值抑制即可。Anchor Boxes之間並行實現。當然,Anchor Boxes 也有局限性,對於同一網格有三個及以上目標,或者兩個目標的 Anchor Box 高度重合的情況處理不好。
怎么選擇Anchor Boxes:
- 一般手工指定Anchor Boxes形狀,可以選擇5到10個Anchor Box形狀,覆蓋到想要檢測的對象的各種形狀
- 更高級的是使用k均值算法(更詳細算法介紹可以閱讀ShowMeAI文章 圖解機器學習 | 聚類算法詳解),將兩類對象形狀聚類,選擇最具有代表性的一組Anchor Box
9.YOLO 算法
匯總上面學習到的知識,就得到YOLO算法的流程,算是對前幾節內容的回顧。網絡結構如下圖所示,包含了兩個Anchor Boxes。
- ① 對每個網格,預測得到2個bounding box
- ② 剔除掉概率低的預測結果
- ③ 對每個類別應用非極大值抑制NMS得到最終結果
10.R-CNN
前面介紹的滑動窗口目標檢測算法對一些明顯沒有目標的區域也進行了掃描(如下圖最左下角位置),這降低了算法的運行效率。
為了解決這個問題,R-CNN(Region CNN,帶區域的 CNN)被提出。通過對輸入圖片運行圖像分割算法,在不同的色塊上找出候選區域(Region Proposal),然后只在這些區域上運行分類器。
R-CNN 的缺點是運行速度很慢,所以有一系列后續研究工作改進。例如 Fast R-CNN(與基於卷積的滑動窗口實現相似,但得到候選區域的聚類步驟依然很慢)、Faster R-CNN(使用卷積對圖片進行分割)。不過大多數時候還是比 YOLO 算法慢。RCNN系列的算法也叫做2-stage目標檢測算法(因為會先產出后候選框,再預測和調整),YOLO系列的算法叫做1-stage目標檢測方法。
相關論文:
Fast R-CNN:Girshik, 2015. Fast R-CNN
Faster R-CNN:Ren et al., 2016. Faster R-CNN: Towards real-time object detection with region proposal networks
參考資料
- Sermanet et al., 2014. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks
- Redmon et al., 2015. You Only Look Once: Unified, Real-Time Object Detection
- Girshik et al., 2013. Rich feature hierarchies for accurate object detection and semantic segmentation
- Girshik, 2015. Fast R-CNN
- Ren et al., 2016. Faster R-CNN: Towards real-time object detection with region proposal networks
ShowMeAI系列教程推薦
- 大廠技術實現方案系列
- 圖解Python編程:從入門到精通系列教程
- 圖解數據分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大數據技術:從入門到精通系列教程
- 圖解機器學習算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程:吳恩達專項課程 · 全套筆記解讀
- 自然語言處理教程:斯坦福CS224n課程 · 課程帶學與全套筆記解讀
- 深度學習與計算機視覺教程:斯坦福CS231n · 全套筆記解讀
推薦文章
- 深度學習教程 | 深度學習概論
- 深度學習教程 | 神經網絡基礎
- 深度學習教程 | 淺層神經網絡
- 深度學習教程 | 深層神經網絡
- 深度學習教程 | 深度學習的實用層面
- 深度學習教程 | 神經網絡優化算法
- 深度學習教程 | 網絡優化:超參數調優、正則化、批歸一化和程序框架
- 深度學習教程 | AI應用實踐策略(上)
- 深度學習教程 | AI應用實踐策略(下)
- 深度學習教程 | 卷積神經網絡解讀
- 深度學習教程 | 經典CNN網絡實例詳解
- 深度學習教程 | CNN應用:目標檢測
- 深度學習教程 | CNN應用:人臉識別和神經風格轉換
- 深度學習教程 | 序列模型與RNN網絡
- 深度學習教程 | 自然語言處理與詞嵌入
- 深度學習教程 | Seq2seq序列模型和注意力機制