1.数据准备
1.1 删除“/VOCdevkit/VOC2007”文件夹下所有文件,新建三个文件夹,名字分别为:JPEGImages,Annotations和ImageSets
其中JPEGImages存放图片数据,Annotations存放标记xml文件,ImageSets文件夹下新建三个文件夹,Layout,Main,Segmentations。
1.2JPEGImages文件夹下图片需按顺序排列,批量修改文件名代码如下
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
注意:当最后一行count+=1 没有在代码中的位置时,会出现上述错误
1.3.生成四个文件:trainval.txt,test.txt,train.txt,val.txt,将这四个文件复制到刚刚建立的Layout,Main两个文件夹中。
生成txt文件
import os
import random
trainval_percent = 0.8 #trainval占比例多少
train_percent = 0.7 #test数据集占比例多少
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
二.训练阶段
1修改类别
2. 1.修改 /tf-faster-rcnn/lib/datasets/pascal_voc.py文件,找到这句话:
self._classes = ('__background__', # always index 0
'自己的类名称')
修改成自己的类别
2.2 .lib/datasets/imdb.py (第22行0改为2(有几类改成几类))
class imdb(object):
"""Image database."""
def __init__(self, name, classes=None):
self._name = name
#self._num_classes = 0
self._num_classes = 2
if not classes:
self._classes = []
else:
self._classes = classes
2.3.为了大家测试demo.py的方便,所以大家也把tools/demo.py中的类别改成自己的类别
self._classes = ('__background__', # always index 0
'自己的类名称')
net.create_architecture("TEST", 2,
tag='default', anchor_scales=[8, 16, 32])
saver = tf.train.Saver()
saver.restore(sess, tfmodel)
类别数量也要改
2.4.修改参数
这里大家根据自己的计算,选择合适的迭代次数以及学习率等, 个人认为,初试学习率0.001,如果不收敛再减小一个量
2. 4.1首先在experiments/scripts/faster_rcnn_end2end.sh文件中修改迭代次数:
修改/tf-faster-rcnn/experiments/scripts/train_faster_rcnn.sh文件,找到类似这段代码:
pascal_voc)
TRAIN_IMDB="voc_2007_trainval"
TEST_IMDB="voc_2007_test"
STEPSIZE="[50000]"
ITERS=40
ANCHORS="[8,16,32]"
RATIOS="[0.5,1,2]"
ITERS后面的数值代表是迭代次数,这里作者已经将其改成40,由于train_faster_rcnn.sh此文件最后一句话调用了test_faster_rcnn.sh,因此需要将test_faster_rcnn.sh中的代码做相同处理,即,改变迭代次数(要与train_faster_rcnn.sh文件中的迭代次数一致)
2.4.2
进入lib/fast_rcnn/config.py,对config.py进行修改:
# 学习率
__C.TRAIN.LEARNING_RATE = 0.001
# Momentum 动量
__C.TRAIN.MOMENTUM = 0.9
# Weight decay, for regularization
__C.TRAIN.WEIGHT_DECAY = 0.0001
# Factor for reducing the learning rate 伽马
__C.TRAIN.GAMMA = 0.1
# Step size for reducing the learning rate, currently only support one step
#__C.TRAIN.STEPSIZE = [30000]
__C.TRAIN.STEPSIZE = [5] #训练步长
# Iteration intervals for showing the loss during training, on command line interface
__C.TRAIN.DISPLAY = 10 #显示的次数
# The number of snapshots kept, older ones are deleted to save space
__C.TRAIN.SNAPSHOT_KEPT = 3 #保存模型的数量
# Minibatch size (number of regions of interest [ROIs])
__C.TRAIN.BATCH_SIZE = 64 #batch大小
#__C.TRAIN.BATCH_SIZE = 128
# Iterations between snapshots 每迭代多少次保存一次模型
__C.TRAIN.SNAPSHOT_ITERS = 5
2.3.删除以往的训练模型:
删除文件夹/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default下所有文件,
删除文件夹/tf-faster-rcnn/data/cache下所有的文件
2.4.删除标记缓存
删除文件夹/VOCdevkit/annotations_cache下的所有文件
注:如果不进行这一步很可能会出现Keyerror:一类的错误日志
2.5将生成的loss保存起来
train_val.py中增加
with open('..//loss.txt','a',encoding='utf-8') as f:
f.write(total_loss.astype(str)+'\n')
3.错误总结
训练自己的模型,报错ZeroDivisionError。
assert(cfg.TRAIN.BATCH_SIZE % num_images == 0), \ ZeroDivisionError: integer
解决方式
首先检查./data/VOCdevkit2007/VOC2007/ImageSets/Main路径下的train.txt和test.txt文件不为空。
删除缓存文件,data/VOCdevkit/cache和data/cache/文件。
get zero division errors #160