一、YOLO安裝
YOLO官網:https://pjreddie.com/darknet/yolo/
1.安裝darknet
git clone https://github.com/pjreddie/darknet
cd darknet
make
2.下載權重文件pre-trained weight
wget https://pjreddie.com/media/files/yolo.weights
3、測試
./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg
或者
./darknet detect cfg/yolo.cfg yolo.weights
Enter Image Path:
data/dog.jpg
二、YOLO訓練自己的數據集(VOC格式)
根據網址修改:http://blog.csdn.net/ch_liu23/article/details/53558549
(一)構建VOC數據集
1、新建文件夾VOC2017(名字+年份)
在VOC2017文件夾下新建三個文件夾Annotation、ImageSets和JPEGImages,並把準備好的自己的原始圖像(.jpg)放在JPEGImages文件夾下;把xml文件放在Annotation文件夾下。
2、在ImageSets文件夾中,新建三個文件夾Layout、Main、Segmentation,然後把寫了訓練圖像的名字的文本train.txt放在Main文件夾下。
3、運行自己寫的腳本./write.sh
// 根據標記的xml文件生成一個train.txt文件,其中包含所有訓練集圖片的文件名
#!/bin/sh
#============ get the file name ===========
echo -e "請輸入你要讀取的文件夾路徑\n當前路徑爲${PWD}"
read InputDir
echo "你輸入的文件夾路徑爲${InputDir}"
echo -e "請輸入你要將數據輸出保存的文件路徑\n當前路徑爲${PWD}"
read OutputFile
echo "輸出保存的文件路徑爲${OutputFile}"
: > $OutputFile #清空OutputFile
#循環讀取文件夾名
for file_a in ${InputDir}/*; do
temp_file=`basename $file_a`
echo $temp_file >> $OutputFile
done
注:輸出文件是train.txt的絕對路徑,生成後需要去掉所以後綴名.xml。
(二)用tiny-yolo訓練
1.生成相關文件
按darknet的說明編譯好後,接下來在darknet-master/scripts文件夾中新建文件夾VOCdevkit,然後將整個VOC2017文件夾都拷到VOCdevkit文件夾下。利用scripts文件夾中的voc_label.py文件生成一系列訓練文件和labels,具體操作如下:
(1)首先需要修改voc_label.py中的代碼,這裏主要修改數據集名,以及類別信息,我的是VOC2017,並且所有樣本用來訓練,沒有val或test,並且只檢測人、車等,故只有五類目標,因此按如下設置:
sets=[('2017', 'train')]
classes = [ "person","car","electric bicycle","bicycle","motorcycle"]
注:刪除最後兩行輸出語句。
(2)修改好後在該目錄下運行命令:python voc_label.py
,之後則在文件夾scripts\VOCdevkit\VOC2007下生成了文件夾lables。同時在scripts\下應該也生成了train_2017.txt這個文件,裏面包含了所有訓練樣本(.jpg)的絕對路徑。
2.配置文件修改
(1)以tiny-yolo-voc.cfg爲例,該網絡是yolo-voc的簡版,相對速度會快些,主要修改參數如下:
filters=50 //修改最後一層卷積層核參數個數,計算公式是依舊自己數據的類別數filter=num×(classes + coords + 1)=5×(5+4+1)=50
activation=linear
[region]
classes=5 //類別數,本例爲5類
注:另外也可根據需要修改learning_rate、max_batches等參數。
(2)data文件下的voc.names
打開voc.names文件可以看到有20類的名稱,本例中只有五類,可改成:
person
car
electric bicycle
bicycle
motorcycle
(3)修改cfg文件夾中的voc.data文件
classes= 5 //類別數
train = /home/anngic/darknet/scripts/train_2017.txt //訓練樣本的絕對路徑文件
valid = /home/pjreddie/data/voc/2007_test.txt //測試集的絕對路徑文件
names = data/voc.names //上一步修改的voc.names文件
backup = /home/anngic/darknet/results/ //訓練後生成的權重保存位置
附:關於Difficult大小寫報錯的修改方法,需把所有Difficult改成difficult。
sed -i "s#Difficult#difficult#g" `grep "Difficult" -rl ./`
(三)訓練、測試
1.上面完成了就可以命令訓練了,可以在官網上找到一些預訓練的模型作爲參數初始值,也可以直接訓練,訓練命令爲
$./darknet detector train ./cfg/voc.data cfg/tiny-yolo-voc.cfg
2.訓練過程中會根據迭代次數保存訓練的權重模型,如使用權重tiny-yolo-voc_6000.weights進行測試:
$./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg results/tiny-yolo-voc_6000.weights data/images.jpg