用YOLO訓練自己的數據集--20170823

一、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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章