OpenCV中使用YOLO物件檢測

重磅乾貨,第一時間送達

本文轉自:opencv學堂

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使用。

一:YOLO網路

物件檢測網路基本上可以分為兩種,一種稱為兩步法、另外一種稱為一步法,很顯然基於影象分類加上滑動視窗的方式最早的R-CNN就是兩步法的代表之一,兩步法的前面基本上是一個卷積神經網路,可以是VGGNet或者Inception之類的,然後再加上一個滑動視窗,但是這種方法太慢,所以就有了區域推薦(RP),預先推薦一些感興趣的區域,進行預言,這些方法普遍有一個缺點,計算量比較大,導致效能低下無法實時,而YOLO取樣了一種完全不同的方法,達到對影象每個區域只計算一次(

You Only Look Once - YOLO

),YOLO把影象分為13x13的Cell(網格):

OpenCV中使用YOLO物件檢測

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

OpenCV中使用YOLO物件檢測

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

OpenCV中使用YOLO物件檢測

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

OpenCV中使用YOLO物件檢測

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

OpenCV中使用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中使用YOLO物件檢測

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

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

置信分數

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

二:在OpenCV中使用YOLO

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中使用YOLO物件檢測

文章中提到模型可以到本人的GITHUB上下載即可,地址如下

下載1:OpenCV-Contrib擴充套件模組中文版教程

下載2:Python視覺實戰專案52講

下載3:OpenCV實戰專案20講