OpenCV在3.3.1的版本中開始正式支援Darknet網絡架構并且支援YOLO1與YOLO2以及YOLO Tiny網絡模型的導入與使用。YOLO是一種比SSD還要快的對象檢測網絡模型,算法作者在其論文中說FPS是Fast R-CNN的100倍,基于COCO資料集跟SSD網絡的各項名額對比
在最新的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(網格):
每個Cell預測5個BOX,同時YOLO也會生成一個置信分數,告訴每個BOX包含某個對象的可能性是多少,注意置信分數不會直接說明BOX内是檢測到何種對象,最終那些得分高的BOX被加粗顯示如下:
對于每個BOX來說,Cell會預測檢測對象類别,這部分的工作就像是一個分類器一樣,基于VOC資料集20中對象檢測,YOLO結合分數與分類資訊對每個BOX給出一個最終可能對象類型的可能性值,如下圖,×××區域85%可能性是狗:
因為總數是13x13的網格,每個網格預言5個BOX,是以最終有854個BOX,證據表明絕大多數的BOX得分會很低,我們隻要保留30%BOX即可(取決于你自己的門檻值設定),最終輸出:
從上面可以看出整個圖像隻是被計算了一次,真正做到了降低計算量,提高了檢測實時性。上述檢測使用的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),結構如下:
最終輸出是每個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. 運作效果
我的課程:
學習OpenCV3.3深度神經網絡(DNN)子產品-應用視訊教程