在开始之前需要部署Faster-RCNN TensorFlow版本,我本人是参考这篇博客的,在此感谢博主,但是用博主的方式在运行自己的数据集时并未成功,捣鼓几时,用以下步骤完成了tf-faster-rcnn 训练自己的数据集。并修改demo.py文件,具有可视化效果。
tf-faster-rcnn 训练自己的数据集
1.替换数据集:
删除“/VOCdevkit/VOC2007”文件夹下所有文件,新建三个文件夹,名字分别为:JPEGImages,Annotations和ImageSets,其中JPEGImages存放图片数据,如:
Annotations存放标记的ground truth文件,也就是xml文件,如:
ImageSets文件夹下新建三个文件夹,即:Layout,Main,Segmentations,如:
参考Creat_FRCNN_DataSet中VOC2007txt.m程序,matlab执行,记得改路径,生成四个文件:trainval.txt,test.txt,train.txt,val.txt,将这四个文件复制到刚刚建立的Layout,Main两个文件夹中。
(第一步需要注意的事:JPEGImages与Annotations下文件的名字要一一对应)
2.修改自己的类别
修改 /tf-faster-rcnn/lib/datasets/pascal_voc.py文件,找到这句话:
self._classes = ('__background__', # always index 0
'aeroplane', 'bicycle', 'bird', 'boat',
'bottle', 'bus', 'car', 'cat', 'chair',
'cow', 'diningtable', 'dog', 'horse',
'motorbike', 'person', 'pottedplant',
'sheep', 'sofa', 'train', 'tvmonitor')
将其替换成自己的类别,如,我替换成如下:
self._classes = ('__background__', # always index 0
'My little Huihui goddess')
其中 'My little Huihui goddess'是我自己的类别
(第二步需要注意的事:类别的名字要与标注数据时的类别数量一致,类别名一致,区分大小写,最好都是小写)
3.修改迭代次数,
修改/tf-faster-rcnn/experiments/scripts/train_faster_rcnn.sh文件,找到类似这段代码:
pascal_voc)
TRAIN_IMDB="voc_2007_trainval"
TEST_IMDB="voc_2007_test"
STEPSIZE="[50000]"
ITERS=20
ANCHORS="[8,16,32]"
RATIOS="[0.5,1,2]"
ITERS后面的数值代表是迭代次数,这里作者已经将其改成20,由于train_faster_rcnn.sh此文件最后一句话调用了test_faster_rcnn.sh,因此需要将test_faster_rcnn.sh中的代码做相同处理,即,改变迭代次数(要与train_faster_rcnn.sh文件中的迭代次数一致)
4.删除以往的训练模型:
删除文件夹/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default下所有文件,
删除文件夹/tf-faster-rcnn/data/cache下所有的文件
5.删除标记缓存
删除文件夹/VOCdevkit/annotations_cache下的所有文件
注:如果不进行这一步很可能会出现Keyerror:一类的错误日志
6.训练及测试:
source activate tf-faster-rcnn
cd 到tf-faster-rcnn的目录下,我的是存放在/Github里面的
cd /Github/tf-faster-rcnn
训练:
GPU_ID=0
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
测试:
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16
修改demo.py
上图是原始tf-faster-rcnn项目中的demo.py演示部分,如果我们已训练好自己的模型,如何演示自己测试图片的可视化?
我们需要修改/tf-faster-rcnn/tools/demo.py文件
1.修改类别
找到这段代码:
CLASSES = ('__background__',
'aeroplane', 'bicycle', 'bird', 'boat',
'bottle', 'bus', 'car', 'cat', 'chair',
'cow', 'diningtable', 'dog', 'horse',
'motorbike', 'person', 'pottedplant',
'sheep', 'sofa', 'train', 'tvmonitor')
保留'__background__'这一项,其余改成自己的类,如:
CLASSES = ('__background__',
'My little Huihui goddess')
2.修改类别数
找到这段代码:
net.create_architecture("TEST", 21,
tag='default', anchor_scales=[8, 16, 32])
将21换成自己的类别数+1,由于我只有一个类“My little Huihui goddess”,因此这里改成2,如:
net.create_architecture("TEST", 2,
tag='default', anchor_scales=[8, 16, 32])
3.修改默认调用的模型
找到这段代码:
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}
修改你的模型的名字,我用的是vgg16来训练我的网络,迭代次数设置为200,所以我修改如下:
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_200.ckpt',),'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}
注:这个模型的名字也可以在你存放模型结果的文件夹下查看的,我存放的位置是:/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default文件夹下的。
因为在这里我演示的是用vgg16来可视化目标检测的结果,而原始demo.py里面默认的是res101,因此我们需要做相应的修改,找到如下代码:
parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16 res101]',
choices=NETS.keys(), default='res101')
修改如下:
parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16 res101]',
choices=NETS.keys(), default='vgg16')
4.修改调用模型的位置
因为我标注的数据集是替换了pascal_voc数据集,因此我的模型是存放在/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default文件夹下的,但是demo.py文件默认的是调用训练pascal_voc_0712数据集的模型(改模型的位置是:/tf-faster-rcnn/output/vgg16/voc_2007_trainval+voc_2012_trainval),因此我们需要修改调用模型的位置,找到这段代码:
parser.add_argument('--dataset', dest='dataset', help='Trained dataset [pascal_voc pascal_voc_0712]',
choices=DATASETS.keys(), default='pascal_voc_0712')
修改为:
parser.add_argument('--dataset', dest='dataset', help='Trained dataset [pascal_voc pascal_voc_0712]',
choices=DATASETS.keys(), default='pascal_voc')
5.修改测试图片索引
找到这段代码:
print('Loaded network {:s}'.format(tfmodel))
im_names = ['000456.jpg', '000542.jpg', '001150.jpg',
'001763.jpg', '004545.jpg']
for im_name in im_names:
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print('Demo for data/demo/{}'.format(im_name))
demo(sess, net, im_name)
将im_names=[.....]替换成想要测试的图片名子,如:
print('Loaded network {:s}'.format(tfmodel))
im_names = ['000001.jpg', '000002.jpg', '000003.jpg',
'000006.jpg', '000008.jpg']
for im_name in im_names:
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print('Demo for data/demo/{}'.format(im_name))
demo(sess, net, im_name)
将相应的000001.jpg,000002.jpg,000003.jpg等,移动到/tf-faster-rcnn/data/demo/文件夹下
6.运行
source activate tf-faster-rcnn
cd 到tf-faster-rcnn的目录下,我的是存放在/Github里面的
cd /Github/tf-faster-rcnn
GPU_ID=0
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py
注意GPU_ID=0一定要加上,不然会出现“no CUDA-capable device is detected”日志,运行的结果应该是没有进行优化后的结果。