Yolo:實時目標檢測實戰(上)
YOLO:Real-Time Object
Detection
你只看一次(YOLO)是一個最先進的實時物體檢測系統。在帕斯卡泰坦X上,它以每秒30幀的速度處理圖像,在COCO test-dev上有57.9%的mAP。
與其他探測器的比較,YOLOv3非常快速和準確。在0.5 IOU處測得的mAP中,YOLOv3與焦距損失相當,但速度快了約4倍。此外,可以輕鬆地權衡速度和準確性之間的簡單改變模型的大小,無需再訓練!
COCO數據集的性能
How it works
先前的檢測系統重新利用分類器或定位器來執行檢測。他們將模型應用於多個位置和比例的圖像。圖像的高分區域被認爲是檢測。
我們使用完全不同的方法。我們將單一的神經網絡應用於完整的圖像。該網絡將圖像分爲多個區域,並預測每個區域的包圍盒和概率。這些邊界框由預測的概率加權。
與基於分類器的系統相比,我們的模型有幾個優點。它在測試時查看整個圖像,因此它的預測由圖像中的全局上下文通知。與R-CNN這樣的系統不同,R-CNN需要數千張圖片才能得到一張圖片。這使得它非常快,比R-CNN快1000倍,比R-CNN快100倍。有關完整系統的更多詳細信息,請參閱我們的論文。
What is New in Version 3?
YOLOv3使用了一些技巧來改進訓練和提高性能,包括:多尺度預測、更好的主幹分類器等等。
Detection Using A Pre-Trained Model
這篇文章將指導你通過使用一個預先訓練好的模型用YOLO系統檢測物體。如果你還沒有安裝Darknet,你應該先安裝。或者不去閱讀所有的東西:
git clone
https://github.com/pjreddie/darknet
cd darknet
make
容易的!
在cfg/子目錄中已經有YOLO的配置文件。你必須在這裏下載預先訓練的權重文件(237MB)。或者運行這個:
wget https://pjreddie.com/media/files/yolov3.weights
Then run the detector!
可以看到下面的輸出信息:
layer
filters size input output
0
conv 32 3 x 3 / 1
416 x 416 x 3 ->
416 x 416 x 32 0.299 BFLOPs
1
conv 64 3 x 3 / 2
416 x 416 x 32 ->
208 x 208 x 64 1.595 BFLOPs
…
105
conv 255 1 x 1 / 1
52 x 52 x 256 ->
52 x 52 x 255 0.353 BFLOPs
106
detection
truth_thresh: Using default ‘1.000000’
Loading weights from yolov3.weights…Done!
data/dog.jpg: Predicted in 0.029329
seconds.
dog: 99%
truck: 93%
bicycle: 99%
Darknet打印出它檢測到的物體,它的可信度,以及找到它們所花的時間。我們沒有用OpenCV編譯Darknet,因此它不能直接顯示檢測結果。相反,它將它們保存在predictions.png中。您可以打開它來查看檢測到的對象。因爲我們在CPU上使用Darknet,所以每張圖像大約需要6-12秒。如果我們使用GPU版本,速度會快得多。
我已經包括了一些例子圖片,以防你遇到困難。嘗試
data/eagle.jpg, data/dog.jpg,
data/person.jpg, or data/horses.jpg!
detect命令是命令的更通用版本的簡寫。它相當於命令:
./darknet detector test cfg/coco.data
cfg/yolov3.cfg yolov3.weights data/dog.jpg
如果您只想在一個圖像上運行檢測,則不需要知道這一點,但知道是否要執行其他操作(如在網絡攝像頭上運行)(稍後將看到)會很有用。
Multiple Images
不要在命令行上提供圖像,您可以將其留空以嘗試一行中的多幀圖像。相反,當配置和權重完成加載時,您將看到一個提示:
./darknet detect cfg/yolov3.cfg
yolov3.weights
layer
filters size input output
0
conv 32 3 x 3 / 1
416 x 416 x 3 ->
416 x 416 x 32 0.299 BFLOPs
1
conv 64 3 x 3 / 2
416 x 416 x 32 ->
208 x 208 x 64 1.595 BFLOPs
…
104
conv 256 3 x 3 / 1
52 x 52 x 128 ->
52 x 52 x 256 1.595 BFLOPs
105
conv 255 1 x 1 / 1
52 x 52 x 256 ->
52 x 52 x 255 0.353 BFLOPs
106
detection
Loading weights from yolov3.weights…Done!
Enter Image Path:
輸入像data/horses.jpg這樣的圖像路徑,讓它爲該圖像預測框。
完成後,它將提示您輸入更多路徑以嘗試不同的圖像。完成後,使用Ctrl-C退出程序。 更改檢測閾值。
默認情況下,YOLO只顯示置信度爲.25或更高的對象。可以通過將-thresh標誌傳遞給yolo命令來更改此值。例如,要顯示所有檢測,可以將閾值設置爲0:
./darknet detect cfg/yolov3.cfg
yolov3.weights data/dog.jpg -thresh 0
產生:
![][all]
所以這顯然不是非常有用,但是可以將其設置爲不同的值來控制模型設置的閾值。 yolov3 tiny
我們有一個非常小的模型,也適用於約束環境,yolov3 tiny。要使用此模型,請首先下載權重:
wget https://pjreddie.com/media/files/yolov3-tiny.weights
然後使用微型配置文件和權重運行檢測:
./darknet detect cfg/yolov3-tiny.cfg
yolov3-tiny.weights data/dog.jpg
網絡攝像頭的實時檢測
如果看不到結果,在測試數據上運行YOLO就不是很有趣了。與其在一堆圖片上運行,不如在網絡攝像頭的輸入上運行!
要運行這個演示,您需要使用CUDA和OpenCV編譯Darknet。然後運行命令:
./darknet detector demo cfg/coco.data
cfg/yolov3.cfg yolov3.weights
YOLO將顯示當前FPS和預測類,以及在其上繪製邊界框的圖像。
你需要一個網絡攝像頭連接到OpenCV可以連接到的計算機,否則它將無法工作。如果您連接了多個網絡攝像頭,並且希望選擇要使用的攝像頭,則可以通過-c標誌進行選擇(OpenCV默認使用網絡攝像頭0)。
如果OpenCV可以讀取視頻,也可以在視頻文件上運行它:
./darknet detector demo cfg/coco.data
cfg/yolov3.cfg yolov3.weights
這就是我們製作上述YouTube視頻的方式。
訓練YOLO學習VOC
如果你想使用不同的訓練模式、超參數或數據集,你可以從頭開始訓練YOLO。下面是如何讓它在Pascal VOC數據集上工作。
獲取Pascal VOC數據
要訓練YOLO,您需要2007年至2012年的所有VOC數據。你可以在這裏找到數據的鏈接。要獲取所有數據,請創建一個目錄來存儲所有數據,然後從該目錄運行:
wget
https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget
https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget
https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
現在將有一個VOCdevkit/子目錄,其中包含所有VOC訓練數據。
爲VOC生成標籤
現在我們需要生成Darknet使用的標籤文件。Darknet希望爲每個圖像創建一個.txt文件,併爲圖像中的每個地面真實對象創建一條線,如下所示:
其中x、y、寬度和高度與圖像的寬度和高度相關。要生成這些文件,我們將在Darknet的script s/目錄中運行voc_label.py腳本。我們再下載一次吧,因爲我們很懶。
wget
https://pjreddie.com/media/files/voc_label.py
python voc_label.py