Faster R-CNN训练自己的数据集Windows10+pycharm+tensorflow环境下

本文主要参考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

  1. 现下载训练好的vgg16.ckpt,放到这个位置data \ imagenet_weights \ vgg16.ckpt。
  2. 配置环境,下载程序运行依赖的python包(cython,python-opencv,easydict等等)。
  3. 修改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.训练自己数据源码修改

  1. 在Faster-RCNN-TensorFlow-Python3.5-master\lib\datasets\pascal_voc.py文件中,将以下代码中的类别替换为自己数据集的类别,‘background’, 这个不要修改,只修改其他的;
  2. Faster-RCNN-TensorFlow-Python3.5-master\lib\config\config.py中修改训练参数,即修改max_iters
  3. 打开Anaconda Prompt,cd 到/Faster-RCNN-TensorFlow-Python3.5-master文件夹,然后输入:
    python train.py
  4. 这个时候理论上就运行成功了。如果遇到问题,查看标题5中的内容。

4.验证模型

  1. 模型训练成功后,将最后保存的模型,.ckpt复制,然后将
    vgg16_faster_rcnn_iter_xxxx.ckpt.data-00000-of-00001的后缀删除,改为vgg16_faster_rcnn_iter_xxxx.ckpt。
  2. 修改CLASSES为自己的类型,
  3. 修改 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

  1. 将config.py中的roi_bg_threshold_low的值从改为0.0,然后训练
  2. 或者修改合适的batch_size,我的batch_size=16

3.total loss=nan

  1. 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()

  1. 修改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的缓存删掉。删掉后可正常运行。


版权声明:本文为qq_28664681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。