对于Tensorflow版本的Faster
RCNN网络,网上包括github上都有不同的源码版本,本人之前也在进行不同版本的运行测试,可以说是每个版本都有不同的错误,在解决这些错误时可谓道阻且长。而对于用自己的数据集来训练和测试Faster
RCNN网络,本人在之前的博客https://blog.csdn.net/hitzijiyingcai/article/details/81808091
<https://blog.csdn.net/hitzijiyingcai/article/details/81808091>
中已经成功实验了一次,之前的那篇博客采用的是github上的此源码https://github.com/endernewton/tf-faster-rcnn
<https://github.com/endernewton/tf-faster-rcnn>
。但是本人发现网上很多关于源码的解析都是基于另一个github代码:https://github.com/smallcorgi/Faster-RCNN_TF
<https://github.com/smallcorgi/Faster-RCNN_TF>
,对于此代码的demo的基本运行及可能遇到的错误,可以参看本人之前的博客:
https://blog.csdn.net/hitzijiyingcai/article/details/81747148
<https://blog.csdn.net/hitzijiyingcai/article/details/81747148>
,因此,本人就打算基于此源码进行自己的数据集的训练和测试,基于此源码的过程可谓是困难重重,遇到的各个错误有时并不能完全搜到,在这里记录下整个过程。

一、运行demo

1、获取代码 
git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git

NB:在下载了整个文件夹之后,要自己手动新建几个文件夹,否则后面会报错,一个是在根目录下新建一个output文件夹,另一个是在experiments文件夹下新建一个logs文件夹。

2、建立cyphon模块 

在下载的Faster RCNN的lib目录下make
cd $FRCN_ROOT/lib make
3、下载预训练模型

在这里提供一个百度云下载地址: 链接:https://pan.baidu.com/s/1zNWzMxBwQ6qVoXXvN89Peg
<https://pan.baidu.com/s/1zNWzMxBwQ6qVoXXvN89Peg> 密码:0rtb

下载完成之后,在tools文件夹下新建一个名称为model的文件夹,把下载好的模型放进去。

4、运行demo

在Faster RCNN根目录下执行:
python ./tools/demo.py --model
/share2/home/qingdong/sharedir/Faster-RCNN_TF/tools//model/VGGnet_fast_rcnn_iter_70000.ckpt
至此,可以得到运行demo的结果,在这期间会遇到一些错误,具体可参看在文章开头提供的本人之前博客的地址中的内容。

二、下载数据并预训练

1、下载 VOCdevkit的训练验证和测试集
wget
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar wget
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar wget
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
2、解压上面下载的三个压缩包
tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf
VOCdevkit_08-Jun-2007.tar
严格按照命令解压,这样解压后的文件嵌套形式不会变。

三个压缩文件解压后文件存储在一个文件夹VOCdekit下,这个文件夹下包含VOCcode和VOC2007等文件夹,结构如下:
$VOCdevkit/ # development kit $VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc. # ... and several other
directories ...
3、重命名

手动将下载的数据集文件夹VOCdevkit修改名字为VOCdevkit2007放入faster
rcnn目录下的Data文件夹里。也可以通过以下代码实现,改名字是因为代码中是VOCdevkit2007
cd $FRCN_ROOT/data ln -s $VOCdevkit VOCdevkit2007
4、下载预训练模型

此处下载的目的是将其参数作为我们训练模型的初始化参数:

下载地址:https://drive.google.com/open?id=0ByuDEGFYmWsbNVF5eExySUtMZmM
<https://drive.google.com/open?id=0ByuDEGFYmWsbNVF5eExySUtMZmM>或

                 
https://www.dropbox.com/s/po2kzdhdgl4ix55/VGG_imagenet.npy?dl=0
<https://www.dropbox.com/s/po2kzdhdgl4ix55/VGG_imagenet.npy?dl=0>

此处为下载VGG_imagenet.npy,需要翻墙,本人也是费了点力气才下载成功,下载完成之后在faster
rcnn目录下的data文件夹下新建文件夹pretrain_model,将下载好的预训练模型VGG_imagenet.npy放进去。

5、训练模型

在根目录下:
./experiments/scripts/faster_rcnn_end2end.sh gpu 0 VGG16 pascal_voc

在这里要注意,源码中的迭代次数为70000次,为了节约时间完成对源码的运行测试,可将experiments/scripts/faster_rcnn_end2end.sh文件、lib/fast_rcnn/config.py文件中的迭代次数此改为小一点数(具体格式可参看后文)。本人将其修改为了200。
NB:训练和测试模型中遇到的错误:

(1)训练完模型后会出现如下错误



这是因为tensorflow问题并没有在/output/faster_rcnn_end2end/voc_2007_trainval
中生成VGGnet_fast_rcnn_iter_70000.ckpt文件。

解决方法:

在FASTER-RCNN_TF/lib/fast_rcnn/train.py 文件中:

将saver = tf.train.Saver(max_to_keep=100)改为:

saver = tf.train.Saver(max_to_keep=100,write_version=saver_pb2.SaverDef.V1)

同时,在文件开头加上:from tensorflow.core.protobuf import saver_pb2

在这里要注意,上述修改后,再次训练时,会出现如下提示:



这是在保存迭代文件时提示V1版本过低建议使用V2,此时千万不要改为V2,否则在修改完之后会持续提示:

 Waiting for
../output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_200.ckpt
to exist... 

这是没法生成ckpt文件,即使在output文件夹下可以看到生成了一些结果文件,但是没法生成ckpt文件,因此上述不要改成V2。

(2)在训练测试时出现如下错误:




这个错误真的是费了九牛二虎之力,在百度后发现根本没有切实可行的方法,最后还是使用Google解决了问题,发现在运行代码时候在lib文件夹下面执行make操作的时候需要将make.sh文件以及setup.py文件进行修改,将arch参数从sm_37改为sm_61。此处是我在服务器上的参数,在这里附上一张参考图,大家可以根据自己的电脑配置自行查找相应参数进行修改。




重新训练完成后在$Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval中生成VGGnet_fast_rcnn_iter_200.ckpt文件。

6、测试模型

在修改完上述错误之后,运行如下代码进行测试:
python ./tools/test_net.py --device gpu --device_id 0 --weights
output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_200.ckpt
--imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network
VGGnet_test
测试结果:



可以看到在测试结果中出现了负值,这是完全不对的,这是由于迭代次太少的原因,因此又将迭代次数进行了修改,改为了2000,得到了如下结果:



可以看出,AP仍然非常小,但是作为测试运行代码来说,是正确的结果就可以了。

三、用自己的数据集进行训练、测试

1、制作数据集

此部分内容可以参考本人之前的博客,有详细介绍:
https://blog.csdn.net/hitzijiyingcai/article/details/81636455
<https://blog.csdn.net/hitzijiyingcai/article/details/81636455>。

制作完成之后替换掉data下的VOCdevkit2007下相应的数据即可。

2.修改代码

(1)lib/datatsets/pascal_voc.py



修改为自己的类别,由于本人的图片为png格式,因此也将图片读取格式一并修改。

(2)lib/datasets/imdb.py



这里将num_classes改为自己的类别数+1,本人定义了3类,因此是4。

(3)lib/networks/VGGnet_train.py



将类别数改为4。同理,VGGnet_test.py修改同上

(4)tools/demo.py



为了测试demo.py的方便,所以也把tools/demo.py中的类别改成自己的类别。

(5)修改迭代次数等参数

这里大家根据自己的计算,选择合适的迭代次数以及学习率等,
个人认为,初试学习率0.001,如果不收敛再减小一个量级,另外,70000次在gpu(看自己的gpu性能,我的是1080)上跑,也只是需要半天多的时间,所以还是可以接受的迭代次数,至于选择多少迭代次数合适,可以根据不同次数训练好的模型,测试验证。此次为了测试运行代码且由前为了得到正确的结果,将迭代次数设为2000。

首先在experiments/scripts/faster_rcnn_end2end.sh文件中修改迭代次数:

(在ITERS中修改成自己想要的参数)

然后,我们进入lib/fast_rcnn/config.py,对config.py进行修改:




其中,第一项,就是学习率,STEPSIZE就是你对训练步长的修改,这里一定要小于等于前面训练文件的ITERS参数。其他大家可以选择保持一致,对于动量和伽马参数不用修改,当然,对于训练每隔多少次显示,大家根据自己情况修改,这里是10次一显示。

除此,我们可以修改batch的大小,



第一个参数是每次输入faster-rcnn网络中图片数量,第二个参数就是训练batch的大小。

关于模型保存问题:



这里,第一个参数是训练时,每迭代多少次保存一次模型;第二个参数是保存时模型的名字。

另外,大家要在训练的时候,可以将rpn检测目标设置为True:




NB:在这里需要注意的是,以上在修改每一个py文件的时候,会发现相应的文件夹中也有一个同名的pyc文件,在修改之前要将其删除。在修改完上述py文件后要进入lib文件夹重新进行make。

3、训练数据

进入你的Faster-rcnn文件夹根目录,然后直接输入:
./experiments/scripts/faster_rcnn_end2end.sh gpu 0 VGG16 pascal_voc
训练完成之后,Faster-RCNN-TF会将训练好的模型保存在output文件夹下,具体如下,这里是自己训练的一个模型
,前面为迭代次数保存的模型,最终的模型为以2000为后缀名的:



若训练时遇到文件夹权限问题,可以参考这篇博客
https://blog.csdn.net/qq_39531954/article/details/78865452
<https://blog.csdn.net/qq_39531954/article/details/78865452>。

4、测试数据

对于需要调整参数进行优化的我们来讲,我们最好对于不同迭代次数产生的模型都进行测试,能够让我们很好的找到一个合适的迭代次数。

训练完成后,会产生许多数据的计算值,并保存了下来,但是在单独测试(单独)时,我们就要将这些文件删除了,以免会产生错误,如下图:



另外,在测试前,最好进入自己数据集中的ImageSet/Main文件夹下,重新看一下自己的训练、验证、测试集编号和数量,确认没有问题。

对于测试代码可以根据tool文件夹里的test_net.py文件能够得到我们的测试语句,如下图:




这里,根据自己的情况进行修改,其中default中的值就是默认值,如果你在测试时,在终端输入时对这部分不赋值,那么就会按照default中默认值进行赋值。如果你想压缩在终端时的赋值语句,就完全可以把这部分的default值全部按照自己要输入的值修改好。

本次使用的语句为:
python ./tools/test_net.py --device gpu --device_id 0 --weights
output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_2000.ckpt
--imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network
VGGnet_test

这里,采用gpu,weights就是我们训练好的模型位置。cfg就选择你测试的方式,这里使用的就是端到端的方式,即由输入直接得到结果。networks就是你使用的网络结构,当然,如果你有自己的网络结构,可以使用自己的,只是自己需要重新修改定义。

最后,可以运行demo看看实际框出的效果图:
python ./tools/demo.py --model
output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_2000.ckpt



在这里附上效果较好的一张图片,可以看出,本次是定义了三类且迭代了2000次,跟源码当中迭代70000此相比效果虽没那么好,但是对于迭代2000次来说,已经能够达到一定的效果,后续会增加次数相信会有更好的结果。

 

 

本文为博主原创,转载请注明出处:https://blog.csdn.net/hitzijiyingcai/article/details/81914200
<https://blog.csdn.net/hitzijiyingcai/article/details/81914200>