已经安装好了object detection这个api,先利用该api对ssd_mobilenets进行训练
1.文件夹构造
为不影响tensorflow的源码,我在我的主文件夹下新建了名为ssd_mobilenets的文件夹,里面放置了名为QRCodeData的文件夹,QRCodeData中有image和xml两个文件夹,其中image包含这图片数据,xml包含着xml数据。在根目录新建models文件夹,用于存放config和预训练模型。继续再根目录新建data文件夹,用于存放.record数据。
2.数据准备
tensorflow有自己的格式要求,pascal的voc格式不能直接使用,但是之前说过了voc格式的数据即使各个框架不适用,但是也会给转化的脚本。为了进行转化,除了图像数据和xml文件,还需要准备一下几个文件
(1)准备.pbtxt文件
.pbtxt用于表示label和id的映射关系,我的.pbtxt文件命名pascal_label_map.pbtxt
,其中内容如下:
item {
id: 1
name: 'QR_code'
}
如有多类则在后面不断增加id
item {
id: 2
name: XXX
}
(2)准备.txt文件
.txt文件用于表示图像文件名中目标与id之间的映射关系。用脚本提取出所有数据集的名称,每个图像文件名占一行:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 12 17:50:26 2017
@author: seven
"""
import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':
source_folder='/home/seven/darknet/infrared/plate/image/'#地址是所有图片的保存地点
dest='/home/seven/darknet/infrared/train.txt' #保存train.txt的地址
file_list=os.listdir(source_folder) #赋值图片所在文件夹的文件列表
train_file=open(dest,'a') #打开文件
for file_obj in file_list: #访问文件列表中的每一个文件
file_path=os.path.join(source_folder,file_obj)
file_name,file_extend=os.path.splitext(file_obj)
#file_name 保存文件的名字,file_extend保存文件扩展名
file_num=int(file_name)
train_file.write(file_name+'\n')
train_file.close()#关闭文件
将source_folder改为自己图像所在路径,dest为输出txt的路径。得到的.txt每一行保存着image中每一个图像的名称,由于我只检测一类,所以直接在每一行加个1。我的.txt文件内容如下:
QR_code_2017711_122 1
QR_code_2017711_422 1
QR_code_2017711_506 1
QR_code_2017711_538 1
QR_code_2017711_474 1
QR_code_2017711_310 1
QR_code_2017711_499 1
QR_code_2017711_081 1
QR_code_2017711_269 1
QR_code_2017711_472 1
QR_code_2017711_211 1
QR_code_2017711_060 1
QR_code_2017711_071 1
QR_code_2017711_204 1
QR_code_2017711_276 1
QR_code_2017711_206 1
QR_code_2017711_214 1
QR_code_2017711_124 1
QR_code_2017711_331 1
QR_code_2017711_180 1
(3)生成.record文件
官方提供了脚本,我将脚本进行了修改,不需要再加其他参数,直接在代码中修改路径后,在ssd_mobilenets根目录保存为a.py,终端进入ssd_mobilenets ,输入