
一、前言
YOLO是一名叫做Joseph Chet Redmon的大神與他的幾個小伙伴做的一個開源實時物體檢測系統(tǒng)。Joseph的幾個小伙伴來自于華盛頓大學以及伯克利大學等知名院校。
YOLO是基于他們開發(fā)的Darknet(基于c語言的神經(jīng)網(wǎng)絡開源框架)上的一個應用系統(tǒng),不同于前置檢測系統(tǒng)將一副圖像的不同位置以及維度分別進行分類預測,YOLO將整幅圖像輸入進單一的神經(jīng)網(wǎng)絡進行分類預測。這使得YOLO相對于其它的物體檢測網(wǎng)絡更加的快速。
其在 VOC 2007(Visual Object Class Challenge 2007)上的 mAP(Mean Average Precision)為78.6%,在 COCO test-dev 上為 48.1%
二、YOLO的前置組件介紹
YOLO是基于Darknet的應用,而Darknet還有幾個可選的依賴組件:
OpenCV:如果需要更多的圖像類型支持,需引進該組件。我在之前研究人臉識別開源框架OPENFACE時,已經(jīng)在電腦上安裝過OpenCV了。感興趣的同學可以移步Mac上開源人臉識別軟件OPENFACE安裝全流程教程查看
CUDA:如果要使用GPU進行計算,需引進該組件??上屹I不起GPU,所以pass
三、YOLO安裝步驟以及錯誤解決方案
1)Darknet下載與安裝
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
2)Darknet 錯誤與解決
錯誤1: undeclared identifier 'CLOCK_REAKTIME'
./src/utils.c:16:19:fatal error:use of undeclared identifier 'CLOCK_REALTIME'
clock_gettime(CLOCK_REALTIME, &now);
根據(jù)報錯日志信息可以指導,在 src/utils.c 中的 CLOCK_REALTIME 這個標識符并沒有被定義。通過在網(wǎng)絡上搜索得知,clock_gettime這個函數(shù)在MAC電腦的操作系統(tǒng)中并沒有被實現(xiàn),所以我們要使用 MAC 系統(tǒng)上的類似函數(shù)來替代。通過對 src/utils.c 進行改寫,可以解決該問題,具體代碼如下:

3)Darknet 安裝成功驗證
在命令行輸入:
./darknet
當?shù)玫椒答伻缦聲r,說明安裝成功了:
usage: ./darknet
Darknet安裝成功后,其實就代表著yolo安裝好了!下邊我們來繼續(xù)配置一下環(huán)境,然后開始使用yolo吧
四、yolo的配置與使用
yolo是基于darknet的一個具體的實例,說是介紹yolo的使用,實際上是介紹darknet的配置與使用
1)darknet的使用與參數(shù)介紹
通過前邊的介紹,我們知道darknet是一款神經(jīng)網(wǎng)絡開源框架,那么使用darknet,我們需要確定下邊幾個參數(shù):
[1]神經(jīng)網(wǎng)絡模型:darknet使用一個 xx.cfg 的文件來定義神經(jīng)網(wǎng)絡模型,包括神經(jīng)網(wǎng)絡的迭代次數(shù)、層級網(wǎng)絡架構(gòu)等內(nèi)容
[2]神經(jīng)網(wǎng)絡權(quán)重:darknet可以直接使用訓練好的權(quán)重來進行測試/預測,我們也可以通過對訓練樣本進行訓練獲得網(wǎng)絡權(quán)重。比如可通過下邊的命令獲得yolo模型已訓練好的權(quán)重
wget https://pjreddie.com/media/files/yolo.weights
[3]訓練樣本(optional:訓練時需要):當我們需要訓練時,需要生成訓練樣本的標簽文件 label.txt。darknet使用了一個 xx.data 類型的文件來存儲訓練樣本參數(shù)
通過下邊的命令行來實現(xiàn)對訓練樣本的訓練:
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
[4]測試樣本(optional:測試時需要):
測試樣本是圖像,我們可以選擇單張圖片處理形式、多張圖片處理形式,以及攝像頭方式來對圖像進行檢測。需注意的是如果要使用網(wǎng)絡攝像頭接入流來對物體進行圖像檢測,需要接入 OpenCV,而為了提高速度最好也接入 CUDA 來使用 GPU 進行運算。
通過下邊的三種命令行均可對圖像進行物體檢測,其分別代表了一種處理模式:
//單圖片模式
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
//多圖片模式,即不要輸入測試樣本,然后后邊再一張張輸入,這個模式可以避免反復load模型
./darknet detect cfg/yolo.cfg yolo.weights
//攝像頭模式(沒錢買不起GPU,所以未驗證)
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
2)yolo的使用樣例
[1]預訓練權(quán)重下載(250MB)
wget https://pjreddie.com/media/files/yolo.weights
[2]根據(jù)下載的權(quán)重來進行物體檢測
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
輸出結(jié)果如下所示:
通過上邊的介紹,我相信大伙應該對yolo或者說darknet應該有了初步的理解了,通過閱讀源碼以及對該框架的繼續(xù)學習,我相信我們應該可以將這套開源框架應用到實際場景中進行應用!
Hope everyone will have fun playing around!