用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

你可能感兴趣的:(用YOLO训练自己的数据集--20170823)