具体操作参考源码地址:https://github.com/endernewton/tf-faster-rcnn
只做补充说明。
Faster R-CNN训练模型
1.制作PASCAL VOC2007格式的数据集
a. VOC2007文件夹下有以下5个文件夹
文件位置/tf-faster-rcnn/data/VOCdevkit2007/VOC2007
具体格式参照VOC2007
Annotations
存放的是xml格式的标签文件,每个xml文件对应JPEGImages的图片。
JPEGImages
存放的是数据集图片,包括训练和测试图片。图片需是JPEG或者JPG格式。
ImageSets
存在三个文件夹,Layout、Main、Segmentation。只用存放图像数据的Main文件,其他两个暂且不管。
Main文件夹下包含4个txt文档,test.txt、train.txt、val.txt和trainval.txt,包括测试集,训练集和验证集。txt内是图片名称,不包含后缀。
SegmentationClass和SegmentationObject
图像分割相关,暂且用不到。
b. 数据集重命名python代码
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
c. LabelImg进行标注
标注后的xml文件移动至Annotations下。
d.划分数据集
import os
import random
trainval_percent = 0.6
train_percent = 0.4
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(num*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()
2.训练自己的模型
a.训练前的准备
删除缓存
在output目录下找找到相应的模型。如果用vgg16模型则在output目录下找vgg16。其它模型类推。
tf-faster-rcnn/output/vgg16/voc_2007_trainval/default
tf-faster-rcnn/data/cache
tf_faster_rcnn/data/VOCdevkit2007/annotations_cache
若本来就没有训练过则没有生成以上目录,则不用删除。
其他更改
在tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,把后面的原来的20个label换成自己的。
b.相应参数位置
ITERS
./experiments/scripts/train_faster_rcnn.sh里的第22行把ITERS=70000改成ITERS=200,
同时把./experiments/scripts/test_faster_rcnn.sh的ITERS也改成200。
STEPSIZE要小于ITERS
config
./lib/model/config.py里含有LEARNING_RATE、BATCH_SIZE等参数
c.训练模型
相关模型下载
mkdir -p data/imagenet_weights#创建目录
cd data/imagenet_weights
wget -v http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
tar -xzvf vgg_16_2016_08_28.tar.gz
mv vgg_16.ckpt vgg16.ckpt#重命名
cd ../..
训练
./experiments/scripts/train_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in train_faster_rcnn.sh
# Examples:
./experiments/scripts/train_faster_rcnn.sh 1 pascal_voc vgg16
Tensorboard
通过浏览器打开
tensorboard --logdir=tensorboard/vgg16/voc_2007_trainval/ --port=7001 &
测试
./experiments/scripts/test_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in test_faster_rcnn.sh
# Examples:
./experiments/scripts/test_faster_rcnn.sh 1 pascal_voc vgg16
d.相应位置
训练好的模型默认保存在下面的目录:
output/[NET]/[DATASET]/default/
测试输出保存在下面的目录:
output/[NET]/[DATASET]/default/[SNAPSHOT]/
训练和验证的Tensorboard信息保存在以下目录:
tensorboard/[NET]/[DATASET]/default/
tensorboard/[NET]/[DATASET]/default_val/
补充
a.关于GPU0与GPU1
对于我的笔记本而言,打开任务管理器查看。
如图,GPU0为集成显卡,GPU1为独立显卡。
b.关于源码使用预训练模型测试结果时报错
TypeError: write() argument must be str, not bytes
参考issues
Edit tf-faster-rcnn/lib/datasets/voc_eval.py
line121, change ‘w’ to ‘wb’ like this
with open(cachefile, 'wb') as f:
line105, change to
cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile.split("/")[-1].split(".")[0])