Ubuntu16.04中用yolov3训练自己的数据集
一、配置yolo v3
参考yolo v3官网https://pjreddie.com/darknet/yolo/
下载darknet后进行编译:
git clone https://github.com/pjreddie/darknet cd darknet make
下载预训练权重文件:
wget https://pjreddie.com/media/files/yolov3.weights
接下来测试一下:测试data/dog.jpg图片的结果,如果能够正确识别,则说明配置成功。
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
官网给出的是CPU版本的编译,如果需要使用GPU,则需要修改makefile的前几行:
GPU=1 CUDNN=1 OPENCV=0 OPENMP=0 DEBUG=0
二、准备及标注自己的数据集
用LabelImg工具标注自己的数据集,github:
git clone https://github.com/tzutalin/labelImg
接着安装依赖的工具:
sudo apt-get install pyqt4-dev-tools # 安装PyQt4 sudo pip install lxml # 安装lxml,如果报错,可以试试下面语句 sudo apt-get install python-lxml
打开终端,进入LabelImg目录后使用make编译
cd LabelImg make all
编译成功后,即可在LabelImg文件夹中运行
python labelImg.py
注意:保存的标注文件有两种:.txt和.xml。我用的是.txt。voc_label.py脚本可以将.xml文件转化成.txt文件。位置:.\darknet\scripts\
voc_label.py
三、搭建yolo框架
在darknet文件夹下新建project_yolov3文件夹,作为自己的训练数据集及配置文件的存放地,避免与已有的一些东西混在一起。
在project_yolov3文件夹下新建如下文件夹,结构如下:
backup
cfg yolov3-tiny.cfg
.data
data .names
images
label
backup用于存放训练时返回的模型及权重文件;
cfg中从.\darknet\cfg中根据需要复制配置文件(我用的是yolov3-tiny.cfg),从.\darknet\cfg中复制voc.data文件修改名称为.data,根据自己的目录以及类别等修改里面相关内容。.cfg修改:首先是训练,所以训练的batch和subdivisions不要注释掉(可以根据电脑配置啥的修改这两个参数
),而测试的要注释掉。修改filters(每一个yolo层的上一层的filters参数要改,其他的filters不需要改),修改后等于(类别数目+5)×3,修改每一个yolo层的classes类别数。另外还有一些参数可以修改,参考官网即可。
data中首先从.\darknet\data中复制voc.names并修改名称为.names,然后按照自己的类别将类别名一行一行写入;
data\images下存放所有图片;
data\label文件夹存放所有标注文件(.txt);
在data文件夹下新建一个my.sh文件,用于生成train.txt和test.txt,这两个txt文件记录训练和测试图片的路径。
将my.sh放到对应的图片集所在的文件夹中。
执行
sh my.sh
在生成的txt文件中,删除my.sh那一条记录就行。(因为这里用的是取这个脚本所在的路径,再加上文件名输出的,这样就是绝对路径了,所以要将.sh文件放到相应的文件夹中去。)
my.sh:
#!/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
echo `pwd`/$temp_file >> $OutputFile
done
train.txt和test.txt的每一行是一张图片的绝对路径,内容示例:
四、训练
下载预训练模型:
wget https://pjreddie.com/media/files/darknet53.conv.74
最后开始训练:
./darknet detector train /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg darknet53.conv.74 2>&1 | tee /media/taoting/4014F4A914F4A358/darknet/project_yolov3/visualization/train_yolov3.log
命令中路径自行修改,其中2>&1 | tee /media/taoting/4014F4A914F4A358/darknet/project_yolov3/visualization/train_yolov3.log是保存训练的日志到文件。
注意:
1.
训练时默认是前1000次时,每100次保存一次模型,大于1000次时每10000次才保存一次模型。修改方式:找到./darknet/examples里面的detector.c,第149行修改就行。
2.
训练可以中断,中断后只要从最后一次保存的模型那里继续开始训练就好。在darknet文件夹下打开终端,重新编译:
make clean
make
如:
./darknet detector train /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg /media/taoting/4014F4A914F4A358/darknet/project_yolov3/backup/yolov3-tiny_5900.weights
3.
所有路径(特别是图片的路径和图片名最好是英文的,不然很容易训练自动终止)
训练参数满意了之后就可以停止训练,进行测试了。
五、测试
先将cfg文件里修改到测试模式,保存后,重新编译,再测试图片。
修改要输出的参数的方法:./src/image.c里的第287~300行;
将置信度在类别标签后显示的方法:./src/image.c里的第246~257行加上有注释的那4行
char possible[10];//存放检测的置信度
for(j = 0; j < classes; ++j){
sprintf(possible,"%.2f",dets[i].prob[j]);//置信度截取小数点后两位
if (dets[i].prob[j] > thresh){
if (class < 0) {
strcat(labelstr, names[j]);
strcat(labelstr, possible);//标签中加入置信度
class = j;
} else {
strcat(labelstr, ", ");
strcat(labelstr, names[j]);
strcat(labelstr, possible);//标签中加入置信度
}
printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100);
}
}
测试命令示例:这些命令也可以写相对路径
./darknet detector test /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg /media/taoting/4014F4A914F4A358/darknet/project_yolov3/backup/yolov3-tiny_6000.weights 20181007_234258.jpg
(https://blog.csdn.net/gusui7202/article/details/83781719) 这篇博客中有批量测试图片的方法