使用API训练自己的数据
说明
本文仍然使用谷歌API提供的网络模型框架,有了框架,现在要解决的是如何让网络训练自己的数据,而数据要提供两个东西给配置文件:一是对应的TFrecord文件,二是对应的.pbtxt文件
-
.pbtxt文件:很简单,照着object_detection/data文件夹下的示例写就好了,注意id: 0代表背景,自己的类别对应的id应为非0数
-
TFrecord文件:那么如何得到TFrecord文件,官网提供了转换TFrecord文件的小demo: preparing your inputs,思路大概就是通过tf.train.Features写到tf.train.Example中,然后就可以写到一个TFrecord文件中, 但是这个小demo只是一张图片的例子,要整合自己的数据让他一起转换总感觉好麻烦(最重要的是数据还要自己标定!!!),所以怎么做哩,该API又提供了已经写好的两个转换TFrecord的文件(记录1里面用过),一个是对VOC数据转,一个是对pet数据转,所以考虑将自己的数据标定成这些有现成代码的形式就行了。好在VOC数据格式有现成的标定工具LabelImg:工具github(但标的还是好想吐)
该工具有一点要注意的地方,最新版本的不知道改没改,具体见github以及实际使用情况啦,这里推荐一个将自己的数据集转成VOC数据格式的博客,写的超详细,就不再赘述:好博客
实际使用
将自己的数据准备好之后,就可以按照官方的使用示例,利用现有代码:create_pascal_tf_record.py转换成TFrecord文件,然后改好模型的配置文件里面的路径就可以开始训练了
-
要改的有相关的路径,以及类别数
但是实际的使用中,还是因为数据出了一点问题,记录如下:
-
转TFrecord的时候报找不到图片的错:
查找原因发现是因为:在生成TFrecord文件的时候,利用了annotation中xml文件的Folder关键字去遍历图片,由于我自己标定数据的Folder关键字与VOC数据存放的文件夹格式不匹配,所以出错了,在宿舍没有图片展示下,贴下相关代码好了:
所以干脆把data[‘folder’]这里改成了VOC2007,因为我的数据都在这个文件夹下面,视具体情况修改
-
转TFrecord报错找不到关键字difficult
查看了一下自己用工具生成的xml文件,发现difficult关键字确实不同,工具产生的关键字是大写,所以要么把xml文件中关键字改掉,要么在程序中处理一下,我是在程序中处理一下:
这里把difficult这里改一下,要么找大写的要么找小写的。
-
终于转成功了,但是训练的时候又出错了,总是训练了若干步之后突然停止训练(绝望脸)
查找原因,在stackoverflow上面有类似问题的说是.pbtxt中标号为0的问题,联系我自己的.pbtxt文件,我因为只做一类物体的检测,这一类物体在VOC的类别里面有,所以我将VOC的那个.pbtxt文件的其他我不要的类别都设成了0, 但好像就是这样导致出问题了,因为我用的数据除了自己找的数据,还把VOC数据里面相关的都用了,而在这些数据里,可能有其他类别的标注信息,而我又将这些框的id对应到了0,这些框有ground truth但id又是背景(貌似产生矛盾),反正就这样报错了,最后我采取在程序中改代码,只要不是我需要的类别就不把它写到TFrecord文件中去(很简单,通过name关键字判断跳过与否即可),就避免了出错,最后终于正常训练了。
总结
目录下的create_pascal_tf_record.py文件还是很值得好好看一下,本文涉及到的程序就只是这一个啦。