天天看點

OpenCV DNN之YOLO實時對象檢測

OpenCV在3.3.1的版本中開始正式支援Darknet網絡架構并且支援YOLO1與YOLO2以及YOLO Tiny網絡模型的導入與使用。YOLO是一種比SSD還要快的對象檢測網絡模型,算法作者在其論文中說FPS是Fast R-CNN的100倍,基于COCO資料集跟SSD網絡的各項名額對比

OpenCV DNN之YOLO實時對象檢測

在最新的OpenCV3.4上我也測試了YOLO3,發現不支援,因為YOLO3有個新層類型shortcut,OpenCV3.4的Darknet暫時還不支援。這裡首先簡單的介紹一下YOLO網絡基本結構,然後在通過代碼示範Darknet支援的YOLO在OpenCV使用。

對象檢測網絡基本上可以分為兩種,一種稱為兩步法、另外一種稱為一步法,很顯然基于圖像分類加上滑動視窗的方式最早的R-CNN就是兩步法的代表之一,兩步法的前面基本上是一個卷積神經網絡,可以是VGGNet或者Inception之類的,然後再加上一個滑動視窗,但是這種方法太慢,是以就有了區域推薦(RP),預先推薦一些感興趣的區域,進行預言,這些方法普遍有一個缺點,計算量比較大,導緻性能低下無法實時,而YOLO采樣了一種完全不同的方法,達到對圖像每個區域隻計算一次(You Look at Once - YOLO),YOLO把圖像分為13x13的Cell(網格):

OpenCV DNN之YOLO實時對象檢測

每個Cell預測5個BOX,同時YOLO也會生成一個置信分數,告訴每個BOX包含某個對象的可能性是多少,注意置信分數不會直接說明BOX内是檢測到何種對象,最終那些得分高的BOX被加粗顯示如下:

OpenCV DNN之YOLO實時對象檢測

對于每個BOX來說,Cell會預測檢測對象類别,這部分的工作就像是一個分類器一樣,基于VOC資料集20中對象檢測,YOLO結合分數與分類資訊對每個BOX給出一個最終可能對象類型的可能性值,如下圖,×××區域85%可能性是狗:

因為總數是13x13的網格,每個網格預言5個BOX,是以最終有854個BOX,證據表明絕大多數的BOX得分會很低,我們隻要保留30%BOX即可(取決于你自己的門檻值設定),最終輸出:

OpenCV DNN之YOLO實時對象檢測

從上面可以看出整個圖像隻是被計算了一次,真正做到了降低計算量,提高了檢測實時性。上述檢測使用的YOLO的網絡結構如下:

OpenCV DNN之YOLO實時對象檢測

發現隻有CNN層,沒有FC層,是不是簡單到爆,最後說一下為什麼最後一層卷積層深度是125,

因為每個Cell檢測5個BOX,對每個BOX來說,包含如下資料

BOX本身資訊,x、y、w、h

置信分數

基于VOC資料集的20個對象類别

是以對每個BOX來說有25個參數,5個BOX= 5x25=125個參數。

上面是得到的網絡模型就是tiny-YOLO網絡模型,可以在移動端實時對象檢測。這個跟作者在論文中提到的稍微有點差異,論文中作者是輸入圖像為448x448,分為7x7的網格(Cell),結構如下:

OpenCV DNN之YOLO實時對象檢測

最終輸出是每個Cell預測兩個BOX,做20個分類,它得到最終是

深度 = SS(B5+20), 其中20個表示分類數目,S表示網絡分割,B表示BOX個數。S=7、B=2,最終輸出是77*30

OpenCV在3.3.1版本中開始支援Darknet,可能有人會問,Darknet是什麼鬼,它是YOLO的作者自己搞出來的深度學習架構,支援C/C++/Python語言,支援YOLOv1、YOLOv2、YOLOv3等網絡模型訓練與使用。但是在OpenCV隻是前饋網絡,隻支援預測,不能訓練。OpenCV中基于YOLO模型我使用的是tiny-YOLO網絡模型,支援20中對象檢測。代碼實作步驟如下:

1. 加載網絡模型

2. 加載分類資訊

3. 加載測試圖像

4. 檢測與顯示

5. 運作效果

OpenCV DNN之YOLO實時對象檢測

我的課程:

學習OpenCV3.3深度神經網絡(DNN)子產品-應用視訊教程