本文主要参考https://blog.csdn.net/u010554381/article/details/86233339,
yuanma
我用的源码是:https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5
说一下我的运行环境,Windows10,pycharm,tensorflow1.13.1,Keras2.2.4,python3.6。
1.先运行demo
- 现下载训练好的vgg16.ckpt,放到这个位置data \ imagenet_weights \ vgg16.ckpt。
- 配置环境,下载程序运行依赖的python包(cython,python-opencv,easydict等等)。
- 修改setup.py文件在第16行加入以下代码:
Extension(
'lib.utils.cython_bbox',
sources=['E:/python/tensorflow/Faster-RCNN-TensorFlow-Python3.5-master/lib/utils/bbox.c','E:/python/tensorflow/Faster-RCNN-TensorFlow-Python3.5-master/lib/utils/bbox.pyx'],
include_dirs = [np.get_include(), 'E:/python/tensorflow/Faster-RCNN-TensorFlow-Python3.5-master/lib/utils'],
extra_compile_args=[])
4.打开Anaconda Prompt,cd 到/Faster-RCNN-TensorFlow-Python3.5-master/data/coco/PythonAPI文件夹,然后运行:
python setup.py build_ext --inplace
python setup.py build_ext install
5.运行demo
2.准备数据集
按照网上的指导,制作VOC2007的标准数据集,包括使用labelimg标注数据,生成训练集和测试集。
下面是生成训练集和测试集的源码:
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 20 17:55:13 2020
@author: Administrator
"""
import os
import random
trainval_percent = 0.1
train_percent = 0.9
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()
3.训练自己数据源码修改
- 在Faster-RCNN-TensorFlow-Python3.5-master\lib\datasets\pascal_voc.py文件中,将以下代码中的类别替换为自己数据集的类别,‘background’, 这个不要修改,只修改其他的;
- Faster-RCNN-TensorFlow-Python3.5-master\lib\config\config.py中修改训练参数,即修改max_iters
- 打开Anaconda Prompt,cd 到/Faster-RCNN-TensorFlow-Python3.5-master文件夹,然后输入:
python train.py
- 这个时候理论上就运行成功了。如果遇到问题,查看标题5中的内容。
4.验证模型
- 模型训练成功后,将最后保存的模型,.ckpt复制,然后将
vgg16_faster_rcnn_iter_xxxx.ckpt.data-00000-of-00001的后缀删除,改为vgg16_faster_rcnn_iter_xxxx.ckpt。 - 修改CLASSES为自己的类型,
- 修改 tfmodel=为自己训练好模型的路径,我的路径为:
tfmodel='./default/voc_2007_trainval/default/vgg16_faster_rcnn_iter_40000.ckpt'
4.将自己想要验证的图片,放到data/demo文件中,然后修改demo.py的 im_names 的内容。
5.打开Anaconda Prompt,cd 到/Faster-RCNN-TensorFlow-Python3.5-master文件夹,然后输入:
python demo.py
5.遇到的问题总结
1.IndexError: list index out of range
删除fast-rcnn-master/data/cache/ 文件夹下的.pkl文件,或者改名备份,重新训练即可。
2.image invalid, skipping
- 将config.py中的roi_bg_threshold_low的值从改为0.0,然后训练
- 或者修改合适的batch_size,我的batch_size=16
3.total loss=nan
- lib/database/pascal_voc.py文件,将-1全部删除,最后改好之后为:
x1 = float(bbox.find('xmin').text)
y1 = float(bbox.find('ymin').text)
x2 = float(bbox.find('xmax').text)
y2 = float(bbox.find('ymax').text)
2.网上说修改学习率也可,我没有进行验证,但是使用步骤1已经不出现了
4.assert (boxes[:, 2] >= boxes[:, 0]).all()
- 修改train.py中的get_training_roidb函数,将imdb.append_flipped_images()屏蔽,改完之后为:
5.R = [obj for obj in recs[imagename] if obj[‘name’] == classname] KeyError:‘1’
测试和训练前需要将cache中的pkl文件+VOCdevkit2007中annotations_cache的缓存删掉。删掉后可正常运行。