这篇博文不是教程向的,只是自己在实现了相关过程后对关键部分和比较绕的地方做出的总结。
详细过程推荐一个B站up主的教学视频,讲解的就是keras下的yolo如何使用,时间不长分P清晰,而且公布了额外需要的代码(我进行使用时也使用了该up修改过的代码,在此表示感谢),对于实现原理、darknet53网络结构讲的也很清楚:Keras 搭建自己的yolo3目标检测平台(yolo3源代码详解)
另外贴上keras-yolo的作者GitHub
有能力阅读源码的同学,非常建议做一些了解,至少知道某一块代码是在做什么,这样就不会局限于网上材料中说的那些细节,比如权重、训练图像、标签等路径等都可以自己对应修改。
相关的三种数据集
有名字的数据集都来自于计算机视觉挑战赛。目前在目标识别领域,计算机对目标的分辨和识别准确率已经高于人类。
COCO数据集:标注有80个类别
VOC数据集:标注有20个类别,数据量相对更少
imagenet数据集:数据量巨大,图片高达上万张
从darknet到keras
darknet和keras是两种不同的架构,darknet基本不依赖于特殊的库,以C语言为主体;keras则是Tensorflow为基础的,使用python语言写出的。在使用时最明显的区别是权重(或称之为模型)的不同。yolo作者的提供的预训练模型是在coco数据集下进行的训练,在darknet架构下,模型的后缀是.weight。keras能够读取的模型则是.h5后缀的。于是可以看到keras-yolo的代码和使用说明中就有convert.py这样的文件,这就是起到转化之作用。另外由于我太菜的原因,在这里模型、权重、网络三个词处于混用状态。
yolo所有可以调的地方
使用时:通过对路径的修改改变所载入的模型;识别的图片路径
训练时(在train.py文件中):用yolo能读取的格式写出的标签(.txt)的路径;先验框(archors)路径;存放新训练模型的位置;预训练模型位置;训练和验证集的比例;后三层、全部层训练时的batch_size(每一批处理的数量,取决于计算性能),epochs(训练世代,就是重复多少次)
这里详细说一下预训练模型,就是相较于一个新的白板网络,被图形识别训练过的网络可以更快更高效的寻找并提取图形的特征,尽管这些类(class)是之前训练中不曾出现过的。可以直接在yolo_weight.h5的基础上训练,也可以在darknet53(这是一个在imagenet数据集上进行过预训练的网络)上进行训练。
高级选项:改变先验框具体大小(锚点,anchors,文件路径./model_data/yolo_anchors.txt,通过提供的kmeans.py对图片上的框进行聚类,划分出识别大物体、中物体、小物体三种大小的框)
数据集的结构
测试在VOC数据集上进行,按照VOC数据集格式给出。当然自己重新整一种自己用的,也不是不行,只不过就是要修改很多处代码,甚至重写一个转化为yolo识别格式的程序才能顺利跑通。所以既然有现成的数据集格式,那么我们就把它当作一种标准去主动靠拢即可。
不论年份,完全体状态的VOC数据集里面有五个文件夹,分别是1目标识别所用的标签 2图片映射信息 3原始图片,以及另外两个含有语义分割信息的文件夹。
训练前的一些列转化过程
首先需要对原始的VOC数据集进行处理,建立起要进行训练的图片的“名字”集合,这一步使用的是B站up自己写的voc2yolo.py,会在VOC数据集./ImageSet/Main下生成一个train.txt。然后使用keras-yolo自带的voc_annotation.py,按照上一步的映射关系把VOC标注格式生成符合yolo可读的标注格式,这一步会根据比例和里面对文件的命名生成 年份_train.txt等三个.txt文件。在训练前还需要相应的在model_data文件夹中添加一个只含有类的.txt文件(这里说的是通用的和最一般做法,实际上我使用的VOC数据集的20个类已经预置在model_data文件夹中了)。
写在后面
由于使用了上面提到的B站up的代码,尤其是train.py这部分几乎做了重写,所以如果你觉得看的云里雾里,那么我建议直接使用up的代码。可以感受到的变化在于训练集和数据集的分配是在train.py中进行的,而不是在从VOC标签格式生成yolo可识别的标签格式过程中进行的。
另外使用了额外代码的地方是在建立VOC数据集标签和图片的映射关系的时候,即把准备训练的“名字”整理起来的过程。
初学小白,有理解不到位的地方请前辈多多海涵。我期待着批评和提升。