yolo生成和训练数据集

来源:互联网 发布:ubuntu wq保存退出 编辑:程序博客网 时间:2024/06/07 16:04

第二代yolo的性能明显比第一代yolo有所提升,在博主实际测试中。基于3000张的数据集来说,yolo的效果还是不错的,tiny-yolo的性能稍差,但是时间也缩短了很多。大约tiny的时间是yolo的1/5,YOLO的官方网站上也有所介绍,对于67的fps还真不是一般的电脑能达到的。
具体来说,yolo网络使用的使用是设置几种不同大小,形状的框,去挨个检测图片中的元素,然后合成为一个物体。具体的可以参考yolo检测网络的论文,名字为You Only Look Once:Unified, Real-Time Object Detection,意思是你只看一次,看来外国人起名字也很有意思,只是他们的名字可以缩写。。。相比较yolo来讲,tiny-yolo实际上用的框架是一样的,只是神经网络的结构不一样,所以,yolo训练出来的weights文件大约为200M,而tiny-yolo的weights文件大约为60M,这里博主可以简单的分析一下,tiny-yolo和yolo在结构上的区别,官方给出的配置文件里面yolo对应的是yolo.cfg,tiny-yolo对应的是tiny-yolo.cfg。
下面是yolo.cfg的部分内容
yolo
下面的是tiny-yolo.cfg的内容

可以看出tiny-yolo在图片大小上有所减小,由yolo的608*608变为了416*416 ,并且在第一层网络的时候就由yolo的32个filters减小到了16个。这样,tiny-yolo的体积就会减小很多,但是精确度也下将了很多,一般使用mAP来评价。后面会介绍如何评价检测精度。
进入正题,假设读者已经通过官网下载了yolo网络的源码,并且也尝试着测试了一波,发现,恩,还不错。接着开始考虑如何去训练自己的网络。博主在训练自己的网络的时候走了很多弯路。希望读者能少走弯路,多花时间去提升自我。
首先是要有自己的数据集,我们通过手机拍照,爬虫,相机拍照搞到了几千张图片,例如这样的图片:
不得不说淘宝的图片还是有点不靠谱的。(如果需要爬淘宝的图片,可联系博主,把源码发给你,没时间写blog,用的python+selenium),接下来需要做的就是将这些图片进行标注,毕竟yolo是个有监督模型,使用的是yolo网络推荐的工具labelImg,博主大体看了一下这个工具,使用的是python+qt,地址为https://github.com/tzutalin/labelImg ,按照上面的介绍安装,就ok了,这个工具的效率还是很高的,基本上几百张可以在不到一小时之内标注完成。标注完所有的图片之后,打开标注文件的文件夹就会看到如下:

都是一些xml,文件,打开一个文件,就是以下信息:

这张图片的所有信息都在里面,包括大小,包括你标注的物体的位置,大小,因为博主的源图片中只有一个物体,所以只有一个object的标签,要是有多个标注的物体的话,就会出现多个object的标签。拿到所有的图片的xml格式的标注文件之后,就要开始转化格式了。因为yolo网络采用的并不是这种格式,而是类似于图下这种。
第一个是类别,第二个和第三个是标注物体的中心位置的x,y的比例坐标。后面两个是标注物体的比例大小。如果有多个物体的话会有多行物体信息。所以首先我们应该先把xml文件转为txt文件,为了方便查看数量,我们还顺便对所有文件重命名了。例如下:

使用的工具来源于github上面的yolo-voc处理工具,你也可以使用命令下载到本地
git clone git@github.com:lucky-ing/yolo-voc.git
里面共有两个文件夹,现在我们使用的是xml2txt/xml2txt.py文件来对我们数据进行处理,首先你需要把你所有标注的xml文件和所有的图片文件放在一起,就像这样:

这是手机拍的照片,所有文件名很麻烦。(明白博主为什么要重命名所有的图片了吧)。接着切到刚才的xml2txt.py文件夹内,使用命令:
python xml2txt.py 0 /home/lucky/open/wires/1016wire /home/lucky/open/wires/picture_voc/10.22 /home/lucky/yolo/darknet/data/voc.names
python xml2txt.py,使用python(一般是指python2)运行xlm2txt
0的意思是文件重命名的开始序列,例如,博主写的是0,则本次处理的图片的名字都是从0000.jpg名字开始增加的,如果你写的是647,则第一张被处理的图片则从0647.jpg开始增加。
/home/lucky/open/wires/1016wire 是指之前所有图片和xml文件所在的路径,切记不要在后面加/。
/home/lucky/open/wires/picture_voc/10.22 是整理之后的图片和txt文件保存的地址路径,切记不要在后面加/。
/home/lucky/yolo/darknet/data/voc.names 是指我们上面提到的xml文件内标注的是标注物体属于某一类,但是yolo并不识别类别,只是识别编号,所以这里要把类名转为编号。该文件里面就是所有的类名,每个类名为一行,程序会根据顺序对他们进行编号,例如

博主制鞋了两种类别,分别是tuoxie和wire,那么如果xml文件里面是tuoxie,那么转换之后的txt文件内的编号就是0。如果只有一个类别的可以不用填写这个参数,默认就为0。
运行之后如图

程序开始疯狂操作。操作之后就会在你的目标文件夹内出现以下情况:

这时候你的操作几乎是成功的。接下还有一步就是需要将所有的图片文件都汇总到一个txt文件内,我们可以使用刚才下载的文件夹内的addneme2txt/addneme2txt.py来操作。只需要输入以下命令:

python pic2txt.py /home/lucky/open/wires/picture_voc/10.22 /home/lucky/open/10.22

python pic2txt.py是指使用python 运行pic2txt文件。
/home/lucky/open/wires/picture_voc/10.22 是我们之前整理后的图片和txt文件所在的路径。切记不要在后面加/。
/home/lucky/open 是为了我们可能要在服务器上训练网络,那时的我们图片的路径肯定和我们电脑的上路径不一样,例如我们电脑上路径在/home/lucky/open/wires/picture_voc/10.22 ,当我们把整个文件夹copy到服务器上的时候,放在了/home/lucky/open目录下,如果yolo网络仍然通过/home/lucky/open/wires/picture_voc/10.22来查询的话是肯定找不到的。所以我们需要修改为服务器的路径。
开始运行之后,电脑开始疯狂操作:

结束之后会在我们的图片和txt的文件夹内生成一个train.txt,打开就有:

至此,我们大部分的准备都已经完成了,接下来开始训练了。
首先,如果你要把训练部分放在服务器进行,你需要把我们的图片和txt文件夹全部拷贝到服务器,而且,路径要和上文的服务器路径一致。否则,yolo找不到图片所在位置。
假设你已经搞ok了。
yolo训练网络需要配置文件,和data文件,命令如下

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg

./darknet detector train 是指使用darknet的train函数。
cfg/voc.data是一些信息文件,我们需要修改这个文件,或者指向你自己的信息文件。我的信息文件如下所示:

classes是指训练中的物体的类别的个数,这里博主只训练了一种,所以为1.
train是告诉yolo,所有的训练的图片位置,指向的就是我们之前生成的train.txt文件。
valid是yolo的测试文件的路径文件,因为我们只训练,所以不需要修改,或者不要动。
names是所有类别的文件,就是我们上文提到的voc.names,貌似这里没什么用。
backup是指训练后的weights文件存放的位置。
cfg/yolo-voc.cfg是yolo网络的配置文件,如果我们使用tiny-yolo,就使用cfg/tiny-yolo-voc.cfg。但是还是需要修改一下里面的内容。在cfg文件的最后一层输出层中

因为我们训练的类别数目不一样,所以最后一层的filters的数量也不一样,计算公式为5*(class_num+5),如果我们只有一个训练数目的话,则filters=30.可参考blog.csdn.net/zhuiqiuk/article/details/70167963
修改完这些这些配置之后,开始,运行!,等待他运行结束之后,会在backup内输出一个weights文件,就是我们的训练后的数据,我们可以使用该文件检测识别我们识别的物体。如果想测试训练后的weights文件的可靠性,可以看博主另外一篇文章。介绍yolo的mAP的数据生成。
欢迎读者一起讨论,或者联系博主lucky_lsq@163.com

原创粉丝点击