CPU下Faster-RCNN环境配置以及训练自己的数据集
环境
- Ubuntu16.04
- python 2.7
- tensorflow1.7.0
下载源码
git clone https://github.com/endernewton/tf-faster-rcnn.git
修改配置
-
1修改lib/setup.py
- 将__C.USE——GPU——NMSTRUE 修改为 **C.USE——GPU——NMSTRUE**
-
2修改lib/model/nms_wrapper.py
- 按照下图注释掉两处
-
修改lib/setup.py
- 注释三处,如下图
- 注释需一行一行注释
-
编译lib
-
在lib目录打开终端,输入:
make clean make
* 每次修改lib目录下文件后需重新编译 **
-
-
安装Python COCO API,使用COCO数据库,在data目录下输入
git clone https://github.com/pdollar/coco.git cd coco/PythonAPI make
运行DEMO
-
下载与训练模型
- 下载模型 voc_0712_80k-110k.tgz,下载地址
- 需要科学上网下载
- 解压得到voc_2007_trainval+voc_2012_trainval文件夹
-
建立预训练模型的软连接,主文件目录下进行
NET=vgg16 TRAIN_IMDB=voc_2007_trainval +voc_2012_trainval mkdir -p output/{NET}/{TRAIN_IMDB} cd output/{NET}/{TRAIN_IMDB} ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
-
由于默认采用res101模型,而我们下载的模型为VGG16,所以需要修改tools/demo.py文件,将默认模型修改为vgg16
-
打开tools/demo.py
-
修改方法parse_args()
-
def parse_args(): """Parse input arguments.""" parser = argparse.ArgumentParser(description='Tensorflow Faster R-CNN demo') parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16 res101]', choices=NETS.keys(), default='vgg16')#修改此处 parser.add_argument('--dataset', dest='dataset', help='Trained dataset [pascal_voc pascal_voc_0712]', choices=DATASETS.keys(), default='pascal_voc_0712') args = parser.parse_args() return args
-
-
运行 ./tools/demo.py
- 如果正确会显示如图:
测试模型
- 下载与训练模型
- 在主目录下运行
NET=vgg16
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
cd ../../..
在主目录下执行
mkdir -p data/imagenet_weights
cd data/imagenet_weights
wget -v http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
tar -xzvf vgg_16_2016_08_28.tar.gz
mv vgg_16.ckpt vgg16.ckpt
cd ../..
- 下载voc数据集(密码:j8n5),名称已经修改好了
下载后放到data目录中解压 - 修改tf-faster-rcnn/lib/datasets/voc_eval.py文件的121行
with open(cachefile, 'wb') as f: #此处将文件打开方式从w修改为wb
pickle.dump(recs, f)
- 测试模型
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16
训练你自己的数据集
- 制作数据集
- 数据集文件结构
VOC2007
├── Annotations #图像标签文件,是.xml格式
├── ImageSets
│ ├── Layout
│ ├── Main #训练和测试用到的数据文件
│ └── Segmentation
└── JPEGImages #图像文件
#Layout和Segmentation文件在这里不需要
- 采用LabelImg进行图像标记,安装教程
- 这里贴一个对图片批量进行编号的程序
import os
import random
trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = '/home/yun/fast/tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations'
txtsavepath = '/home/yun/fast/tf-faster-rcnn/data/VOCdevkit2007/VOC2007/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(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/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()
-
将图片放在JPEGImages文件夹下,制作出来的xml文件放在Annotations文件夹下,运行上面程序自动生成Main文件夹下txt文件
-
执行完之后,应该是这样的结构
-
注意,每次修改Main文件夹下内容需将AnnotationsCache文件夹删除,第一次除外
/ImageSets/Main$ tree
.
├── test.txt
├── train.txt
├── trainval.txt
└── val.txt
- 替换数据集
- 提前下好voc数据集,并保存在data/VOCdevkit2007下,那么替换数据就是将自己训练集的Annotations、lmageSets和JPEGlmages文件和原文件替换即可。大家替换数据后,一定要将data/cache中的pkl文件删除,不然不会获得修改后的数据。
- 在lib/dataset/pascal_voc.py文件中,修改类别参数
self._classes = ('__background__', # always index 0
'#自己的类名'
- ib 下面的文件修改了之后要重新 make clean 然后在make
- 修改tf-faster-rcnn/experiments/scripts/train_faster_rcnn.sh中迭代次数,默认为70000,可修改少点
case ${DATASET} in
pascal_voc)
TRAIN_IMDB="voc_2007_trainval"
TEST_IMDB="voc_2007_test"
STEPSIZE="[50000]"
ITERS=70000 #迭代次数
ANCHORS="[8,16,32]"
RATIOS="[0.5,1,2]"
;;
-
修改模型参数
* 进入lib/model/config.py,对config.py进行修改:
其中,第一项,就是学习率,STEPSIZE就是你对训练步长的修改,这里一定要小于等于前面训练文件的ITERS参数。其他大家可以选择保持一致,对于动量和伽马参数不用修改,当然,对于训练每隔多少次显示,大家根据自己情况修改,这里是10次一显示。 -
修改图片尺寸
- 修改图片尺寸,在lib/model/config.py下修改训练以及测试的图片尺寸
__C.TRAIN.SCALES = (364,)#训练图片短边尺寸
__C.TRAIN.MAX_SIZE = 547#训练图片长边尺寸
__C.TEST.SCALES = (364,)#测试图片短边尺寸
__C.TEST.MAX_SIZE = 547#测试图片长边尺寸
- 每次修改lib目录下文件后需重新编译
- 执行训练代码 每次每次训练需将主目录下output文件夹以及data/cache文件夹删除
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
- 如果没有报错,即成功训练模型,模型默认位置在output文件夹下
** 使用自己训练的模型进行测试
- 修改demo.py
- 修改类名
CLASSES = ('__background__',
'#自己的类')
* 修改类别数量
net.create_architecture("TEST", 7,#此处为你的数据集类别数量+1
tag='default', anchor_scales=[8, 16, 32])
- 修改使用模型(将vgg16_faster_rcnn_iter_70000.ckp修改为你刚训练生成的模型,在output文件夹下一般只需修改最后迭代次数即可)
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101': ('res101_faster_rcnn_iter_100.ckpt',)}#其中的100,是我自己的训练设置,个人要根据自己的设置修改,一定要和初始设置的参数一致
- 修改测试图片
im_names = ['00197.jpg','00132.jpg']#次数为你想要测试的图片。
- 如果执行后不显示测试图片,可能原因为你的测试图片中准确率太低,无法达到显示精度要求,可
- 1.修改显示精度要求
- 2.换测试图片或加大训练论此,提高模型精度
- 修改显示最低精度要求
- tools/demo.py文件里修改
CONF_THRESH = 0.5 #分数达到0.5才会被框选
可能遇到的问题
- pip 安装失败
- 可能原因为未指定版本,如tensorflow==1.7.0
- 提取密码rekz
- protobuf问题,卸载掉3.18的版本,制定版本安装pip install protobuf==3.17.3
- Command exited with non-zero status 11
- 可能原因未修改输入图片的尺寸,导致越界
- targets_dh = np.log(gt_heights / ex_heights)
- 检查xml文件下的值,使得xmin>1,ymin>1(大于1不包括等于1),xmax>xmin,ymax>ymin
- 忘记修改类名
- 遇到问题多看看Issues
参考文献
- 1.https://blog.csdn.net/m0_38024766/article/details/90712715
- 2.https://github.com/endernewton/tf-faster-rcnn
- 3.https://www.cnblogs.com/zhengmeisong/p/9102059.html