YOLOv2檢測過程的Tensorflow實現
訓練好的模型請在yolo2檢測模型下載
https://pan.baidu.com/s/1ZeT5HerjQxyUZ_L9d3X52w
一、全部程式碼解讀如下:
1、model_darknet19.py:yolo2網路模型——darknet19。
YOLOv2採用了一個新的基礎模型(特徵提取器),稱為Darknet-19,包括19個卷積層和5個maxpooling層,如下圖。Darknet-19與VGG16模型設計原則是一致的,主要採用3*3卷積,採用2*2的maxpooling層之後,特徵圖維度降低2倍,而同時將特徵圖的channles增加兩倍。
主要特點有:
(1)去掉了全連線層fc
·這樣大大減少了網路的引數,個人理解這是yolo2可以增加每個cell產生邊界框以及每個邊界框能夠單獨的對應一組類別概率的原因。
·並且,網路下采樣是32倍,這樣也使得網路可以接收任意尺寸的圖片,所以yolo2有了 Multi-Scale Training多尺度訓練 的改進:輸入圖片resize到不同的尺寸(論文中選用320,352...,608十個尺寸,下采樣32倍對應10*10~19*19的特徵圖)。每訓練10個epoch,將圖片resize到另一個不同的尺寸再訓練。這樣一個模型可以適應不同的輸入圖片尺寸,輸入影象大(608*608)精度高速度稍慢、輸入圖片小(320*320)精度稍低速度快,增加了模型對不同尺寸圖片輸入的魯棒性。
(2)在每個卷積層後面都加入一個BN層並不再使用droput
·這樣提升模型收斂速度,而且可以起到一定正則化效果,降低模型的過擬合。
(3)採用跨層連線 Fine-Grained Features
·YOLOv2的輸入圖片大小為416*416,經過5次maxpooling(下采樣32倍)之後得到13*13大小的特徵圖,並以此特徵圖採用卷積做預測。這樣會導致小的目標物體經過5層maxpooling之後特徵基本沒有了。所以yolo2引入passthrough層:前面的特徵圖維度是後面的特徵圖的2倍,passthrough層抽取前面層的每個2*2的區域性區域,然後將其轉化為channel維度,對於26*26*512的特徵圖,經passthrough層處理之後就變成了13*13*2048的新特徵圖,這樣就可以與後面的13*13*1024特徵圖連線在一起形成13*13*3072大小的特徵圖,然後在此特徵圖基礎上卷積做預測。作者在後期的實現中借鑑了ResNet網路,不是直接對高分辨特徵圖處理,而是增加了一箇中間卷積層,先採用64個1*1卷積核進行卷積,然後再進行passthrough處理,這樣26*26*512的特徵圖得到13*13*256的特徵圖。這算是實現上的一個小細節。
2、decode.py:解碼darknet19網路得到的引數.
3、utils.py:功能函式,包含:預處理輸入圖片、篩選邊界框NMS、繪製篩選後的邊界框。
這裡著重介紹NMS中IOU計算方式:yolo2中計算IOU只考慮形狀,先將anchor與ground truth的中心點都偏移到同一位置(cell左上角),然後計算出對應的IOU值。
IOU計算難點在於計算交集大小:首先要判斷是否有交集,然後再計算IOU。計算時候有一個trick,只計算交集部分的左上角和右下角座標即可,通過取max和min計算:
4、Main.py:YOLO_v2主函式
對應程式有三個步驟:
(1)輸入圖片進入darknet19網路得到特徵圖,並進行解碼得到:xmin xmax表示的邊界框、置信度、類別概率
(2)篩選解碼後的迴歸邊界框——NMS
(3)繪製篩選後的邊界框
執行環境:
Python3 + Tensorflow1.5 + OpenCV-python3.3.1 + Numpy1.13
windows和ubuntu環境都可以
準備工作:
請在yolo2檢測模型下載模型,並放到yolo2_model資料夾下
https://pan.baidu.com/s/1ZeT5HerjQxyUZ_L9d3X52w
檔案說明:
1、model_darknet19.py:yolo2網路模型——darknet19
2、decode.py:解碼darknet19網路得到的引數
3、utils.py:功能函式,包含:預處理輸入圖片、篩選邊界框NMS、繪製篩選後的邊界框
4、config.py:配置檔案,包含anchor尺寸、coco資料集的80個classes類別名稱
5、Main.py:YOLO_v2主函式,對應程式有三個步驟:
(1)輸入圖片進入darknet19網路得到特徵圖,並進行解碼得到:xmin xmax表示的邊界框、置信度、類別概率
(2)篩選解碼後的迴歸邊界框——NMS
(3)繪製篩選後的邊界框
6、Loss.py:Yolo_v2 Loss損失函式(train時候用,預測時候沒有呼叫此程式)
(1)IOU值最大的那個anchor與ground truth匹配,對應的預測框用來預測這個ground truth:計算xywh、置信度c(目標值為1)、類別概率p誤差。
(2)IOU小於某閾值的anchor對應的預測框:只計算置信度c(目標值為0)誤差。
(3)剩下IOU大於某閾值但不是max的anchor對應的預測框:丟棄,不計算任何誤差。
7、yolo2_data資料夾:包含待檢測輸入圖片car.jpg、檢測後的輸出圖片detection.jpg、coco資料集80個類別名稱coco_classes.txt
執行Main.py即可得到效果圖:
1、car.jpg:輸入的待檢測圖片
2、detected.jpg:檢測結果視覺化
可以看到,跟yolo1對比,yolo2引入anchor後檢測精度有了提升(car和person的類別置信度高了許多),並且每個邊界框對應一組類別概率解決了yolo1中多個目標中心點落在同一個cell只能檢測一個物體的問題(左側兩個person都檢測出來了)。相比yolo1還是有一定提升的。
原文釋出時間為:2018-10-16
本文來自雲棲社群合作伙伴“ OA==&mid=2650341589&idx=1&sn=8e3f8f1f320aa99a7d2eb9968ce75674&chksm=87811626b0f69f30502e01426073b2d4b43b0abd1fbde3190fb4d59e307db208bfdcfca14ae3&scene=0#rd" target="_blank" rel="nofollow,noindex">大資料探勘DT機器學習 ”,瞭解相關資訊可以關注“ 大資料探勘DT機器學習 ”。