实践五:使用tf-faster-rcnn训练自己的数据集
github地址运行示例demo修改配置,使支持CPU选项tf-faster-rcnn/lib/model/nms_wrapper.py 修改/注释以下行:#from nms.gpu_nms import gpu_nmsdef nms(dets, thresh, force_cpu=False):#Dispatch to either CPU or GPU NMS imp...
运行示例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,然后利用训练好的模型处理图像或者视频
更多推荐
所有评论(0)