1. 程式人生 > >Darknet+YOLO的安裝和測試指南

Darknet+YOLO的安裝和測試指南

Darknet是Joseph維護的開源的神經網路框架,使用C語言編寫。
官網地址
Darknet快速,易於安裝,同時支援CPU和GPU計算。
專案原始碼可以在github pjreddie/darknet 看到。

1 初步使用darknet進行預測

1.1 安裝框架

git clone https://github.com/pjreddie/darknet.git
# 以上是官方推薦的方式。有的同學在編譯過程中會出錯,這時可以直接在GitHub中使用http協議下載最新版本。
cd darknet
make

注意了,以上步驟在Linux系統上可能很輕鬆就完成了,但是在windowns上可得費點力氣。
這裡建議在win上安裝俗稱Linux子系統的cygwin軟體,用於執行在Linux上使用的一些命令。
具體步驟可以參考

如何在windowns上使用make等Unix繫命令?教你安裝cygwin

make完成後應該得到如下的檔案結構
make之後的檔案結構如下

1.2 測試

安裝好之後就可以執行如下命令測試了

./darknet

得到的結果為

$ ./darknet
usage: ./darknet <function>

我們這裡先跳到YOLO部分,使用YOLO提供的模型利用darknet進行預測
在如下地址下載yolov3.weights的權重檔案(模型)

wget https://pjreddie.com/media/files/yolov3.weights

執行如下命令

./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg

執行命令可能需要一小會
person.jpg是darknet/data/person.jpg目錄下的一張圖片,識別成功的話應該是下邊右圖中的效果。這張圖的位置在darknet/predictions.jpg
識別測試
識別的過程中會打印出如下的log

  ......
  106 yolo
Loading weights from yolov3.weights...Done!
data/person.jpg: Predicted in 22.345468 seconds.
horse: 100%
person: 100%
dog: 99%

類別標籤後的百分數代表預測的置信度,從結果看置信度都比較高。

1.3 改變檢測閾值

預設情況,YOLO只會把置信度超過0.25的物件定位出來,你可以修改這一閾值。
執行命令的時候指定-thresh引數即可:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

上面的設定是:即使置信度是0也將目標顯示定位出來

1.4 配置GPU

程式跑通之後,需要了解一些基本的配置
開啟makefile可以看到如下內容

GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
......

剛剛我們花了一小會使用CPU識別了一張圖片,如果你安裝好了CUDA,那麼現在可以使用GPU來識別。
將makefile中的GPU=0修改為GPU=1即可,預設是使用第一塊顯示卡(卡槽序號0)。
然後再次在專案的根目錄使用make,重複試驗預測命令,就會發現預測速度大大提高。

如果想要指定使用哪塊顯示卡,你可以在命令列中附加引數-i用阿里指定你想使用的顯示卡序號,例如:

./darknet -i 1 imagenet test cfg/alexnet.cfg alexnet.weights

你也可以使用CUDA進行編譯,使用CPU進行計算,使用-nogpu引數即可:

./darknet -nogpu imagenet test cfg/alexnet.cfg alexnet.weights

2 對YOLO訓練VOC資料集

這裡可以探索一下如何使用YOLO訓練其他資料集

2.1 下載資料

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/目錄

2.2 生成VOC資料集的標籤

VOCdevkit的目錄結構大致如下

VOCdevkit--VOC2007--Annotations: 若干xml檔案,包含圖片名稱和box的大小和位置,是樣本的標籤
                  				    --ImageSets
                  				    --JPEGImage: 若干圖片檔案,樣本
                  				    --SegmentationClass
                  				    --SegmentationObject
                  --VOC2012--Annotations
                  				    --ImageSets
                  				    --JPEGImage
                  				    --SegmentationClass
                  				    --SegmentationObject

xml檔案作為標籤是很繁瑣和複雜的。
下面執行官方提供的指令碼生成指定格式的label檔案

wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

根據每張圖片對應的xml檔案,會分別在VOCdevkit/VOC2007/labels/VOCdevkit/VOC2012/labels/位置生成對應於每張圖片的.txt檔案,作為圖片的標籤,例如

16 0.437 0.764 0.446 0.466666666667
# 符合如下形式
<object-class> <x> <y> <width> <height>

object-class代表類別,x\y\width\height代表圖片的相對位置和高寬。
根目錄下面則多了幾個txt檔案:

2007_test.txt
2007_train.txt
2007_val.txt 
2012_train.txt
2012_val.txt 

這些txt檔案彙總了所需訓練或者驗證的圖片的絕對路徑,後面訓練的時候需要用到
合併這些訓練集:

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

2.3 修改訓練的配置和下載預訓練權重

開啟cfg/voc.data檔案修改訓練集和測試集檔案的路徑

  1 classes= 20
  2 train  = <path-to-voc>/train.txt
  3 valid  = <path-to-voc>2007_test.txt
  4 names = data/voc.names
  5 backup = backup

然後下載預訓練權重

wget https://pjreddie.com/media/files/darknet53.conv.74

2.4 訓練VOC模型

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

3 問題追蹤

3.1 訓練和使用yolo時出現CUDA Error: out of memory問題

參考:https://blog.csdn.net/qq_33485434/article/details/80432054
我這裡把yolov3.cfg檔案中的subdivisions=16改成subdivisions=64之後就OK了

3.2 can’t open file :train.txt 和can’t load image的問題

參考:https://blog.csdn.net/lumingha/article/details/81781923
注意各個配置檔案修改為UNIX格式