Tensorflow下用自己的数据集对Faster RCNN进行训练和测试(二)1

Tensorflow下用自己的数据集对Faster RCNN进行训练和测试(二)

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


   
   
   
   
  1. cd $FRCN_ROOT/lib
  2. make

3、下载预训练模型

在这里提供一个百度云下载地址: 链接: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的训练验证和测试集


   
   
   
   
  1. wget http:/ /host.robots.ox.ac.uk/pascal /VOC/voc2007/VOCtrainval_06-Nov- 2007.tar
  2. wget http:/ /host.robots.ox.ac.uk/pascal /VOC/voc2007/VOCtest_06-Nov- 2007.tar
  3. wget http:/ /host.robots.ox.ac.uk/pascal /VOC/voc2007/VOCdevkit_08-Jun- 2007.tar

2、解压上面下载的三个压缩包


   
   
   
   
  1. tar xvf VOCtrainval_06-Nov-2007 .tar
  2. tar xvf VOCtest_06-Nov-2007 .tar
  3. tar xvf VOCdevkit_08-Jun-2007 .tar

严格按照命令解压,这样解压后的文件嵌套形式不会变。

三个压缩文件解压后文件存储在一个文件夹VOCdekit下,这个文件夹下包含VOCcode和VOC2007等文件夹,结构如下:


   
   
   
   
  1. $VOCdevkit/ # development kit
  2. $VOCdevkit/VOCcode/ # VOC utility code
  3. $VOCdevkit/VOC2007 # image sets, annotations, etc.
  4. # ... and several other directories ...

3、重命名

手动将下载的数据集文件夹VOCdevkit修改名字为VOCdevkit2007放入faster rcnn目录下的Data文件夹里。也可以通过以下代码实现,改名字是因为代码中是VOCdevkit2007


   
   
   
   
  1. cd $FRCN_ROOT/data
  2. ln -s $VOCdevkit VOCdevkit2007

4、下载预训练模型

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

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

                 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。

制作完成之后替换掉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。

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

阅读更多 收藏

})()

    
“股市三板斧”坚持只看1指标 赢数千万身家! 中资 · 顶新


	
  • King_key
    King_key: 请问,你的类别数目是直接修改就行吗?为什么我的在直接修改后出现了 Assign requires shapes of both tensors to match. lhs shape= [8] rhs shape= [84]

这样的错误!还请解答一下(2个月前#3楼)举报回复

  • a1103688841
    a1103688841: 楼主 在测试的时候
    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

出现了
UnknownError (see above for traceback): exceptions.NameError: global name ‘gpu_nms’ is not defined
Traceback (most recent call last):

File “/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/script_ops.py”, line 206, in call
ret = func(*args)

File “/root/faster_rcnn1/Faster-RCNN_TF-master/tools/…/lib/rpn_msr/proposal_layer_tf.py”, line 127, in proposal_layer
keep = nms(np.hstack((proposals, scores)), nms_thresh)

File “/root/faster_rcnn1/Faster-RCNN_TF-master/tools/…/lib/fast_rcnn/nms_wrapper.py”, line 19, in nms
return gpu_nms(dets, thresh, device_id=cfg.GPU_ID)

NameError: global name ‘gpu_nms’ is not defined

[[Node: PyFunc = PyFunc[Tin=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_STRING, DT_INT32, DT_INT32], Tout=[DT_FLOAT], token=“pyfunc_0”, _device="/job:localhost/replica:0/task:0/device:CPU:0"](rpn_cls_prob_reshape/_95, rpn_bbox_pred/rpn_bbox_pred-0-1-TransposeNCHWToNHWC-LayoutOptimizer/_97, _arg_Placeholder_1_0_1, PyFunc/input_3, PyFunc/input_4, PyFunc/input_5)]](3个月前#2楼)查看回复(1)举报回复

    • hitzijiyingcai
      子季鹰才回复 a1103688841: 这是你在gpu上跑的时候,没有设置好吧 (3个月前) 举报回复
    • a1103688841
      a1103688841: 楼主 在lib中make的话会出现:
      bash make.sh
      make.sh: line 14: nvcc: command not found
      g++: error: roi_pooling_op.cu.o: No such file or directory这个错误怎么办呀
      (3个月前 #1楼) 查看回复(1)举报回复
      • hitzijiyingcai
        子季鹰才回复 a1103688841: 这个问题很常见,你可以去百度一下,之前也遇到过,忘记记录下来了 (3个月前) 举报回复

    • 上一页
    • 1
    • 下一页

    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    股票“三不卖七不买“6字黄金口诀… 赢百万身价 看完恍然大悟 之星 · 顶新
    		
    
    
    
    		
    
    
          
    xiao__run关注
    xiao__run

    84篇文章

    排名:千里之外

    yangdashi888关注
    yangdashi888

    228篇文章

    排名:6000+

    Jaycci关注
    Jaycci

    5篇文章

    排名:千里之外

    lk123400关注
    lk123400

    10篇文章

    排名:千里之外

    股票“三不卖七不买“6字黄金口诀… 赢百万身价 看完恍然大悟 之星 · 顶新
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    2019又出新赚钱方式,第一批学府街人已经赚嗨了! 小宛 · 鹓鶵
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    股市奇才17年不亏之谜,方法令人意想不到! 珅乾 · 鹓鶵
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    年轻人别犹豫!到底3月还是4月买车更划算?这场团购会是... 坚果汽车 · 顶新
    		
    
    
    
    			
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    股票“三不卖七不买“6字黄金口诀,只买井喷股 赢数百万身家! 中资 · 顶新
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    
    
    		
    
    

    你可能感兴趣的:(TensorFlow)