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)    这篇博客中有批量测试图片的方法

猜你喜欢

转载自www.cnblogs.com/taotingz/p/11316467.html