实践五:使用tf-faster-rcnn训练自己的数据集

github地址

运行示例demo

修改配置,使支持CPU选项
tf-faster-rcnn/lib/model/nms_wrapper.py 修改/注释以下行:

#from nms.gpu_nms import gpu_nms
def nms(dets, thresh, force_cpu=False):
   #Dispatch to either CPU or GPU NMS implementations.
    if dets.shape[0] == 0:
        return []
    if cfg.USE_GPU_NMS and not force_cpu:
        #return gpu_nms(dets, thresh, device_id=cfg.GPU_ID)
        return cpu_nms(dets, thresh)
    else:
        return cpu_nms(dets, thresh)

tf-faster-rcnn/lib/model/config.py 修改代码为:

__C.USE_GPU_NMS = False

tf-faster-rcnn/lib/setup.py 注释下面代码:

CUDA = locate_cuda()
self.src_extensions.append('.cu')
Extension('nms.gpu_nms',
        ['nms/nms_kernel.cu', 'nms/gpu_nms.pyx'],
        library_dirs=[CUDA['lib64']],
        libraries=['cudart'],
        language='c++',
        runtime_library_dirs=[CUDA['lib64']],
        # this syntax is specific to this build system
        # we're only going to use certain compiler args with nvcc and not with gcc
        # the implementation of this trick is in customize_compiler() below
        extra_compile_args={'gcc': ["-Wno-unused-function"],
                            'nvcc': ['-arch=sm_52',
                                     '--ptxas-options=-v',
                                     '-c',
                                     '--compiler-options',
                                     "'-fPIC'"]},
        include_dirs = [numpy_include, CUDA['include']]

训练/验证
手动创建tf-faster-rcnn/data/VOCdevkit2007/results/VOC2007/Main/目录

./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 0 pascal_voc vgg16
./experiments/scripts/train_faster_rcnn.sh 1 coco res101
#----------------------------------------------------------------------------------------------------------
./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 0 pascal_voc vgg16
./experiments/scripts/test_faster_rcnn.sh 1 coco res101

每次训练前需要把output和data/cache目录删掉。下载在imagenet上预训练好的vgg16模型,放在data/imagenet_weight目录下;
训练次数需要在训练脚本中修改.它的训练不像SSD可以随时中断,然后接着之前的训练.需要一次训练好才会生成文件.后续需要添加
训练次数在train_faster_rcnn.sh 和test_faster_rcnn.sh 里修改
3、在运行测试脚本的时候。脚本调用的生成模型在output中,而且默认迭代70000次。如果中途停止了,想运行测试脚本。要修改test脚本中迭代值。否则会给出找不到模型的错误。

训练自己的数据集

使用自己的数据
1,所有图片放到/tf-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages中。
2,所有xml文件放到/tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations中。
3,修改tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main下的4个文件:
(1)test.txt 测试图片名称,数量占总图片数量的50%
(2)trainval.txt 训练/验证图片名称,数量占总图片数量的50%
(3)train.txt 训练图片名称,数量占 训练/验证(上一条) 总数的50%
(4)val.txt 验证图片名称,数量占 训练/验证总数的50%
4,最后修改tf-faster-rcnn/lib/datasets/pascal_voc.py,把self._classes定义的类别填入我们自己要识别的类别.
在自己数据集上训练
训练自己的数据遇到不少问题,主要在于作者没给出修改哪些文件,现在记录下来。
首先保证./tf-faster-rcnn/tensorboard/vgg16/voc_2007_trainval/default文件夹为空,因为训练的时候会从这个目录下开始
1、制作自己的数据集
2、修改训练、测试命令脚本

cd experiments/scripts/
vim train_faster_rcnn.sh
vim test_faster_rcnn.sh

这里修改的是迭代次数

case ${DATASET} in
  pascal_voc)
    TRAIN_IMDB="voc_2007_trainval"
    TEST_IMDB="voc_2007_test"
    STEPSIZE="[5000]"
    ITERS=10000
    ANCHORS="[8,16,32]"
    RATIOS="[0.5,1,2]"

3、修改超参数

cd lib/model/
vim config.py

在config.py中可以修改学习率、动量等超参数。
4、修改./lib/datasets/pascal_voc.py。

self._classes = ('__background__',  # always index 0
                     'digital tube')

5、修改tools/demo.py里面的’CLASSES‘、’NETS’以及’DATASETS’变量为和自己的数据集相关,修改main函数里面测试图片名,即可利用训练好的模型测试。
这里有两处修改
(1)修改NETS名称。cpkt文件中的数字要跟生成模型的迭代次数一致,否则就找不到文件了。

NETS = {'vgg16': ('vgg16_faster_rcnn_iter_10000.ckpt',),'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}
DATASETS= {'pascal_voc': ('voc_2007_trainval',),'pascal_voc_0712': ('voc_2007_trainval+voc_2012_trainval',)}

(2)main函数中修改 类别数。我这里是2。数字应该是类别+1。1是背景。

net.create_architecture("TEST", 2, tag='default', anchor_scales=[8, 16, 32])

6、完成修改了,可以愉快训练测试了。【注释掉sys.exit(1)】
train修改参数

parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]',default=0, type=int)
parser.add_argument('--iters', dest='max_iters', help='number of iterations to train',default=70000, type=int)
# 预训练模型
parser.add_argument('--cfg', dest='cfg_file', help='optional config file',default="/home/dl3/zhuzhao/tf-faster-rcnn/experiments/cfgs/vgg16.yml", type=str)
parser.add_argument('--weight', dest='weight', help='initialize with pretrained model weights',default='/home/dl3/zhuzhao/tf-faster-rcnn/data/imagenet_weights/vgg16.ckpt',type=str)
parser.add_argument('--imdb', dest='imdb_name', help='dataset to train on',default='voc_2007_trainval', type=str)
parser.add_argument('--imdbval', dest='imdbval_name', help='dataset to validate on',default='voc_2007_test',type=str)
parser.add_argument('--net', dest='net', help='vgg16, res50, res101, res152, mobile',default='vgg16', type=str)

test修改参数

parser.add_argument('--cfg', dest='cfg_file',help='optional config file',default="/home/dl3/zhuzhao/tf-faster-rcnn/experiments/cfgs/vgg16.yml", type=str)
parser.add_argument('--model', dest='model',help='model to test',default='/home/dl3/Desktop/zhuzhao/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default/vgg16_faster_rcnn_iter_70000.ckpt', type=str)
parser.add_argument('--imdb', dest='imdb_name',help='dataset to test',default='voc_2007_test', type=str)
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16

7、如果在训练或测试自己的数据集之前,先训练了一次作者的数据。可能会报出数据大小不一致的错误。删除之前训练生成的文件就好。
利用tensorboard查看训练结果并调参
1,迭代次数、学习率、动量等超参数
2,然后利用训练好的模型处理图像或者视频

猜你喜欢

转载自blog.csdn.net/qq_27163197/article/details/81585460
今日推荐