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上使用的一些命令。
具體步驟可以參考
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格式