具体操作参考源码地址: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_RATEBATCH_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])