TensorFlow提供的网络结构的预训练权重:https://cloud.tencent.com/developer/article/1006123
将voc数据集转换成.tfrecord格式供tensorflow训练用:https://blog.youkuaiyun.com/guoyunfei20/article/details/80626040
训练自己的数据集大体流程如右侧所示:
caffe版的流程:RFCN使用教程(测试或训练自己的数据)
在进行深度学习时,对数据集的制作通常包括以下几个步骤:
1、对图片重新命名
2、图片标注(生成.xml文件)
3、将.xml文件转成相应数据集的格式
4、建立.test格式文件
这个人的博客里有好多关于xml文件的处理:https://blog.youkuaiyun.com/gusui7202?t=1
具体以VOC数据的制作为例进行说明:
新建一个存放数据集的文件,可命名为VOC,VOC下一共有五个文件夹,对于目标检测任务来说,通常只用到前三个文件夹,Annotations、JPEGImages和ImageSets。
下面分别来讲。
1)JPEGImages文件夹
文件夹里包含了训练图片和测试图片,混放在一起
注:train图片和test图片要分两个文件夹放,它们里面的图片的命名必须都从000001开始顺序往下编号。要不后面有你哭的
2)Annatations文件夹
文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片
3)ImageSets文件夹
Action存放的是人的动作,暂时不用
Layout存放的人体部位的数据,暂时不用
Main存放的是图像物体识别的数据,Main里面有test.txt , train.txt, val.txt ,trainval.txt.这四个文件我们后面会生成
Segmentation存放的是可用于分割的数据
4)其他的文件夹不解释了,分割XXX等用的
一、对图片重命名【1】【2】
1.1 建数据集文件夹+图片重命名
新建以上三个文件夹,再ImageSets文件夹下在新建Main文件夹。
"""
用来对图片进行重命名,并初始化目录结构
"""
import cv2
import os
if __name__=='__main__':
path = os.getcwd()
#imgs = os.listdir(path+"\\imgs\\shengdaixirou\\")
imgs = os.listdir(path+"\\JPEGImages\\mixture3\\") #进入当前目录
#print(imgs)#查看读取的文件内容
#creat file
if os.path.exists('JPEGImages') == False:
os.mkdir('JPEGImages')
if os.path.exists('Annotations') == False:
os.mkdir('Annotations')
if os.path.exists('ImageSets') == False:
os.mkdir('ImageSets')
os.mkdir('ImageSets/Main')
cnt = 391 #图片名字从000391开始编号
prename = "000390"
for img in imgs:
#temp=cv2.imread(path+"\\imgs\\shengdaixirou\\"+img)
temp=cv2.imread(path+"\\JPEGImages\\mixture3\\"+img)
#os.remove(path+"\\imgs\\"+img) #清空该文件夹
#print(prename[0:len(prename)-len(str(cnt))]+str(cnt)) #验证重命名是否好用.中括号里面的部分表示名字的前3位‘000’,str(cnt)负责后三位的计数
cv2.imwrite(path+"\\JPEGImages\\text1_remaining\\"+prename[0:len(prename)-len(str(cnt))]+str(cnt)+".jpg",temp)
print ("renamed "+img+" to "+prename[0:len(prename)-len(str(cnt))]+str(cnt)+".jpg")
cnt+=1
print ("done!")
或者另一种方法(未检验):
import os
path = "E:\\image"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
print(file)
for file in filelist: #遍历所有文件
Olddir=os.path.join(path,file) #原来的文件路径
if os.path.isdir(Olddir): #如果是文件夹则跳过
continue
filename=os.path.splitext(file)[0] #文件名
filetype=os.path.splitext(file)[1] #文件扩展名
Newdir=os.path.join(path,str(count).zfill(6)+filetype) #用字符串函数zfill 以0补全所需位数
os.rename(Olddir,Newdir)#重命名
count+=1
摘自:https://blog.youkuaiyun.com/u011574296/article/details/72956446
二、图片标注
使用labelIImg来标注图片,具体的安装过程及使用过程如下:
https://mp.youkuaiyun.com/postedit/88706760
注:
每个图片和标注得到的xml文件,JPEGImages文件夹里面的一个训练图片,对应Annotations里面的一个同名XML文件,一一对应,命名一致。
- 标注自己的图片的时候,类别名称请用小写字母,比如汽车使用car,不要用Car
- 写的只识别小写字母,如果你的标签含有大写字母,可能会出现KeyError的错误。
三、格式转换.xml-》.csv-》tfrecord
3.1 xml转csv
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 16 00:52:02 2018
@author: Xiang Guo
"""
import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET
os.chdir('E:\\Tensorflowtext\\VOCMaker-master\\VOCMaker\\VOCMaker\\Annotations\\text1_eightclass')#cvs的保存路径
path = 'E:\\Tensorflowtext\\VOCMaker-master\\VOCMaker\\VOCMaker\\Annotations\\text1_eightclass'#xml文件的路径
def xml_to_csv(path):
xml_list = []
for xml_file in glob.glob(path + '/*.xml'):
tree = ET.parse(xml_file)
root = tree.getroot()
for member in root.findall('object'):
value = (root.find('filename').text,
int(root.find('size')[0].text),
int(root.find('size')[1].text),
member[0].text,
int(member[4][0].text),
int(member[4][1].text),
int(member[4][2].text),
int(member[4][3].text)
)
xml_list.append(value)
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
xml_df = pd.DataFrame(xml_list, columns=column_name)
return xml_df
def main():
image_path = path
xml_df = xml_to_csv(image_path)
xml_df.to_csv('tv_vehicle_labels.csv', index=None) #csv文件名(改成自己的名字)
print('Successfully converted xml to csv.')
main()
3.2 csv转tfrecord
在工程文件下创建py文件,命名为generate_tfrecord.py或者其他的名字(train文件夹下是所有的图片)
# -*- coding: utf-8 -*-
"""
由CSV文件生成TFRecord文件
"""
"""
Usage:
#一、程序中要根据你的工作路径修改:
1、os.chdir('E:\\Tensorf