Press "Enter" to skip to content

【目标检测】用Fast R-CNN训练自己的数据集超详细全过程

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

目录:

 

一、环境准备

 

二、训练步骤

 

三、测试过程

 

四、计算mAP

 

寒假在家下载了Fast R-CNN的源码进行学习,于是使用自己的数据集对这个算法进行实验,下面介绍训练的全过程。

 

一、环境准备

 

我这里的环境是win10系统,pycharm + python3.7

 

二、训练过程

 

1、下载Fast R-CNN源码

 

https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3

 

2、安装扩展包

 

下载的源码中有一个 requirements.txt文件,列出了需要安装的扩展包名字。可以在cmd中直接运行以下代码:

 

pip install -r requirements.txt

 

或者使用pip命令一个一个安装,所需要的扩展包有:cython、opencv-python、easydict、Pillow、matplotlib、scipy。

 

如果使用conda管理,按conda的下载方式也可以。

 

3、下载并添加预训练模型

 

源码中预训练模型使用的是VGG16,VGG16模型可点开下方链接直接下载:

 

http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz

 

下载的模型名字应该是vgg_16.ckpt,重命名为vgg16.ckpt 后,把模型保存在data\imagenet_weights\文件夹下。

 

也可以使用其他的模型替代VGG16,其他模型在下方链接中下载:

 

https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models

 

4、修改训练参数

 

打开源码的lib\config文件夹下的config.py文件,修改其中一些重要参数,如:

 

(1)network参数

 

该参数定义了预训练模型网络,源码中默认使用了vgg16,我们使用vgg16就不需修改,如果在上一步中使用其他模型就要修改。

 

(2)learning_rate

 

这个参数是学习率,如果设定太大就可能产生振荡,如果设定太小就会使收敛速度很慢。所以我们可以先默认为源码的0.001进行实验,后期再取0.01或0.0001等多次实验,找到运行后的相对最优值。

 

(3)batch_size

 

该参数表示梯度下降时数据批量大小,一般可以取16、32、64、128、256等。我个人的理解是,batch_size设定越大,训练时梯度下降的速率更快,也具有更高的方向准确度,但更加消耗内存;batch_size设定越小,虽然节省内存,但训练的速率比较慢,收敛效果也可能不是很好。所以在内存允许的情况下,尽量设定大一些。

 

(4)max_iters

 

max_iters参数表示训练最大迭代的步数。源码中是40000,我实验了4000和40000的步数,发现后来的测试结果中mAP值相差不大,以后会再继续研究。这个参数可以先按照源码的40000进行(要跑好几天。。。)

 

(5)snapshot_iterations

 

这个参数表示间隔多少迭代次数生成一次结果模型。

 

(6)roi_bg_threshold_low 和 roi_bg_threshold_high

 

这个参数表示在背景中被设定为ROI(感兴趣区域,region of interest)的阈值。如果后面出现Exception: image invalid, skipping 这样的报错,将roi_bg_threshold_low参数修改为0.0会解决问题。

 

 

5、替换数据集

 

源码中的VOCDevkit2007文件夹存放的是数据集,我们将自己的数据集按照文件夹结构替换存放在VOCDevkit2007中。Annotations存放的是标签的XML文件,JPEGImages存放的是自己的数据集所有图片,ImageSets\Main文件夹下保存的是test.txt、train.txt、trainval.txt、validation.txt,分别是测试集、训练集、训练验证集、验证集的标签文件名号。可以按照下图的结构制作自己的数据集~

 

 

考虑到源码中没有数据集划分程序,这里把划分代码贴出来,替换成自己的各个文件路径后直接运行就可以自动生成所需的txt文件啦。

 

# 数据集划分集类
import os
from sklearn.model_selection import train_test_split
image_path = r'F:/111/data/VOCDevkit2007/VOC2007/JPEGImages'
image_list = os.listdir(image_path)
names = []
for i in image_list:
    names.append(i.split('.')[0])     # 获取图片名
trainval,test = train_test_split(names,test_size=0.5,shuffle=446)   # shuffle()中是图片总数目
validation,train = train_test_split(trainval,test_size=0.5,shuffle=446)
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/trainval.txt','w') as f:
    for i in trainval:
        f.write(i+'\n')
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/test.txt','w') as f:
    for i in test:
        f.write(i+'\n')
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/validation.txt','w') as f:
    for i in validation:
        f.write(i+'\n')
with open('F:/111/data/VOCDevkit2007/VOC2007/ImageSets/Main/train.txt','w') as f:
    for i in train:
        f.write(i+'\n')
print('完成!')

 

6、生成所需文件

 

在cmd中进入 ./data/coco/PythonAPI文件夹路径,分别运行下面两条命令:

 

python setup.py build_ext --inplace

 

python setup.py build_ext install

 

之后,在cmd中进入 ./lib/utils文件夹路径,运行下面一条命令:

 

python setup.py build_ext --inplace

 

这样,就生成训练需要的文件啦。

 

7、修改目标类别

 

打开lib/datasets目录中的pascal_voc.py文件,第34行self._classes表示目标检测的类别,将其修改为自己数据集的类别。 注意不能修改 “_background_” ,它表示图片的背景。

 

 

8、删除缓存文件

 

打开源码中data/cache目录,删掉上一次训练生成的.pkl缓存文件。打开default/voc_2007_trainval/default目录,删掉上次训练生成的模型。

 

注意以后每次训练都要删掉上述两个文件夹中的缓存文件和模型 ,不删会报错的哦。

 

9、运行train.py文件

 

做好上面所有步骤之后,就可以运行train.py文件进行训练啦。每次生成的模型都会保存在default/voc_2007_trainval/default目录下。

 

三、测试过程

 

1、添加训练模型

 

新建Faster-RCNN-TensorFlow-Python3-master/output/vgg16/voc_2007_trainval/default目录。把训练生成的模型(default/voc_2007_trainval/default目录下的四个文件)复制到新建目录下,并重命名为如下图:

 

 

2、修改demo.py文件

 

(1)修改目标类别

 

修改demo.py文件中line32,CLASSES中的类别要修改为之前步骤中相同的类别。注意 “_background_”不要修改。

 

(2)修改网络模型

 

找到demo.py文件中line35、line36,将其修改为如下图所示:

 

(3)修改预训练模型

 

找到demo.py文件中line104,将其修改为’vgg16’,如下图:

 

(4)修改测试图片

 

找到demo.py文件中的line148,改为自己测试用的几张图片名称。注意和data/demo目录下存放的测试图片名字一致。

 

3、运行demo.py文件

 

做好上述修改后,就可以运行demo.py文件啦,能够对新的测试图片进行目标检测。

 

四、计算mAP

 

mAP(mean Average Precision), 即各类别AP的平均值,反映出一个目标检测模型性能的总体精确度。

 

1、修改pascal_voc.py文件

 

打开pascal_voc.py文件,找到line189,将”filename”内容修改为下图:

 

 

2、修改demo.py文件

 

打开demo.py文件,找到line31,添加两个模块:

 

# 添加这两个import
from lib.utils.test import test_net
from lib.datasets.factory import get_imdb

 

添加后如图所示:

 

 

然后,找到最后一行plt.show(),在它上面添加两行代码:

 

# 添加这两行代码
imdb = get_imdb("voc_2007_trainval")
test_net(sess, net, imdb, 'default')

 

添加后如图所示:

 

 

3、运行demo.py文件

 

新建data/VOCDevkit2007/results/VOC2007/Main目录,然后运行demo.py文件,等待运行结束就能看到mAP指标的计算结果啦! 贴出我自己模型的计算结果吧!

 

 

这次内容就分享到这里了,希望与各位老师和小伙伴们交流学习~

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注