tensorflow faster rcnn实现

转载https://blog.csdn.net/u012834824/article/details/78626027


代码地址:https://github.com/smallcorgi/Faster-RCNN_TF

软件要求:tensorflow 和python包:cpython、python-opencv、easydict

python包安装命令行:sudo apt-get install cython python-opencv

                                 sudo pip install easydict

硬件要求:For training the end-to-end version of Faster R-CNN with VGG16, 3G of GPU memory is sufficient (using CUDNN)

demo运行步骤  

1、获取代码 

git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git
2、建立cyphon模块 
cd $FRCN_ROOT/lib
make  (在下载的faster rcnn根目录下的lib文件下执行make)
3、 下载在PASCAL VOC 2007上训练的模型去测试 

模型地址:https://drive.google.com/open?id=0ByuDEGFYmWsbZ0EzeUlHcGFIVWM

                 https://www.dropbox.com/s/cfz3blmtmwj6bdh/VGGnet_fast_rcnn_iter_70000.ckpt?dl=0

4、运行demo

cd $FRCN_ROOT (在faster rcnn根目录下运行)
python ./tools/demo.py --model model_path

运行demo过程中遇到的错误

1、g++: error: roi_pooling_op.cu.o: No such file or directory

解决:Setting the following should make it work (it worked at least for me)
(1) export
PATH=$PATH:/usr/local/cuda-8.0/bin/ (or your corresponding cuda path) for your terminal
(2) In make.sh file inside lib directory, do
CXXFLAGS='-D_MWAITXINTRIN_H_INCLUDED'

2、importerror: no module named gpu_nms

解决:I have solved the problem of generating gpu_nms.so by revising cudaconfig = {'home':home, 'nvcc':nvcc, 'include': pjoin(home, 'include'), 'lib64': pjoin(home, 'lib64')} as cudaconfig = {'home':home, 'nvcc':nvcc, 'include': pjoin(home, 'include'), 'lib64': pjoin(home, 'lib')}

3、ensorflow.python.framework.errors.NotFoundError: /home/Projects/Faster-RCNN_TF/tools/../lib/roi_pooling_layer/roi_pooling.so: undefined symbol: _ZN10tensorflow7strings6StrCatB5cxx11ERKNS0_8AlphaNumE

解决: revise the CUDA_PATH and add -D_GLIBCXX_USE_CXX11_ABI=0 in /lib/make.sh

update as:

g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc  -D_GLIBCXX_USE_CXX11_ABI=0  \
	roi_pooling_op.cu.o -I $TF_INC  -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \
	-lcudart -L $CUDA_PATH/lib64 

训练模型步骤:

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://www.dropbox.com/s/po2kzdhdgl4ix55/VGG_imagenet.npy?dl=0

并在faster rcnn目录下的data文件夹下新建文件夹pretrain_model,将下载好的预训练模型VGG_imagenet.npy放进去。

5、训练和测试模型

cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh $DEVICE $DEVICE_ID VGG16 pascal_voc
其中$device要换成自己的硬件,即gpu 。  $device_id换成自己的硬件号,级0或者1或者......

训练和测试模型中遇到的错误:

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

Wrote snapshot to $Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt

grep: experiments/logs/faster_rcnn_end2end_VGG16_.txt.2017-09-14_21-36-10: No such file or directory
+ python ./tools/test_net.py --device gpu --device_id 0 --weights --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test

test_net.py: error: argument --weights: expected one argument

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

解决方法:

Tensorflow has been updated and is saving 3 types of check points (instead of only 1). You will need to change the line in the FASTER-RCNN_TF/fast_rcnn/train.py :

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

And add this in the same train.py file preamble:
from tensorflow.core.protobuf import saver_pb2

重新训练完成后在$Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval中生成VGGnet_fast_rcnn_iter_70000.ckpt文件,然后运行python ./tools/test_net.py --device gpu --device_id 0 --weights output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test测试模型

训练自己的数据集(这里我以检测一类物体为例n_classes = 2

1、制作数据集

简单起见,我把自己的数据集整理成和Pascal voc一样的数据格式。VOC2007下应该有Annotations、ImageSets和JPEGImages三个文件夹,其中:Annotations是标注数据xml文件,JPEGImages是和Annotations中的xml文件一一对应的图片文件,两个文件除了后缀分别是.xml和.jpg,其他部分应该一样,都应该是六位数字,比如:000001.jpg和000001.xml。ImageSets下有一个Main文件夹,文件夹内有trainval.txt、train.txt、val.txt和test.txt四个文件,文件中是图片名称,不带后缀.jpg和.xml,单纯的数字。

对数据集图片进行标注,每张图片均可得到相应的xml文件,参考这里http://blog.csdn.net/jesse_mx/article/details/53606897安装标注工具LabelImg,安装完成后,./labelImg.py打开标注工具,标注并生成xml文件。下面将文件名存为txt格式,首先将xml文件或者jpg文件夹中的内容分为四部分这里以xml文件为例,分为train、val、trainval和test四个文件夹,里面是相应的xml文件。这里我按照作者的数据集比例来训练数据,其中trainval和test基本上为1:1,两个加起来是总的数据集。trainval中train和val数目基本也是1:1。下面利用这四个文件夹生成相应的 trainval.txt、train.txt、val.txt和test.txt四个文件。参照这里https://jingyan.baidu.com/article/656db918a7e848e381249c0e.html,其中公式"ren "&A1&" "&B1 用于批量修改文件名,公式=left(文件全名,find(".",文件全名)-1) 文件全名即是A1,用于只保留文件名不带后缀,即可生成txt文件。

2、修改部分文件

lib/pascal_voc.py --> change the classes   n_classes = 2
tools/demo.py --> change the classes

VGGnet_train.py --> change the classes

VGGnet_test.py --> change the classes

如果修改的.py文件有相应的.pyc文件,一定要再次编译生成新的.pyc文件。

import py_compile
py_compile.compile('/path/to/foo.py')

3、训练完成后用上述的测试脚本得出正确率

运行python ./tools/test_net.py --device gpu --device_id 0 --weights output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test测试训练好的模型

4、运行demo看看实际框出的图

python ./tools/demo.py --model  output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt

将定位出的物体从图片中切出

1、修改demo.py文件,将眶出的物体信息即坐标保存在文件中。在demo.py文件中加上如下代码:

打开文件并写入:

        f = open('/{}ax_dets.txt'.format(im_name),"w")
        f.write(str(bbox[0])+' '+ str(bbox[1])+' '+ str(bbox[2])+' '+ str(bbox[3])+' ')
        f.write('\n')
        f.close()

循环读图片:

        lists=[]
        file=open('tupianming.txt')
       for line in file.readlines():
        line=line.strip("\n")
        lists.append(line)
        im_names=lists

这里要用到tupianming.py即图片名称的txt文件

2、根据测试生成的坐标txt文件将定位不出物体的图片从demo集中剔除。

3、再次生成demo图片集的图片路经txt文件

4、利用opencv根据坐标信息切出物体,代码如下:

#-*-coding=utf-8-*-
save_dir = "/cut_img_1/"
import cv2
for line in open("train_image_path.txt"):
    line = line.strip('\n')
    ll1 = line.split('/')
    save_name = ll1[7]
    save_name.strip('\r\n')
    save = save_dir + save_name
    save.split('\r\n')
     lin = line.strip()
    image = cv2.imread(str(lin))
     f = open( save_name + 'ax_dets.txt')
     poem = f.read()
    

    if poem:
        l1 = poem.split()
        #print (l1)
        #print (type(l1))
        x1 = int(float(l1[0]))
        y1 = int(float(l1[1]))
        x2 = int(float(l1[2]))
        y2 = int(float(l1[3]))
       hight = y2 - y1
        width = x2 - x1
        print (hight,width)
        cropImg = image[y1:y1 + hight, x1:x1 + width]
       cv2.imwrite(save, cropImg)


又来继续更新,物体检测前一段时间已经做的差不多了,整个定位到把定位到的物体切出来也都已经成为一个整体。最后想补充说明一下,在demo.py文件中坐标那里,如果定位到物体则会生成相应的坐标文件,如果没有定位到物体则坐标应为0,这样省去了挑选未被定位图片的过程,整个切物体的代码也可以放在demo.py文件的最后,这样就是一个完整的检测并切出物体的代码啦~~


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TensorFlow 2 Faster RCNN 是基于 TensorFlow 2 的一个目标检测算法,它使用 Faster RCNN 框架来进行图像中的目标检测。Faster RCNN 是一种常用的目标检测算法,采用卷积神经网络作为特征提取器,并通过候选区域生成和预测来确定图像中的目标框。 TensorFlow 2 Faster RCNN 的优势在于其使用 TensorFlow 2 的新特性,如动态图、eager execution 和更直观的 API,使得开发者能够更加轻松地构建和训练模型。它提供了高度可定制化的模型架构,使得用户可以根据自己的需求进行修改和扩展。此外,TensorFlow 2 Faster RCNN 还支持分布式训练和推理,可以加速模型的训练和预测过程。 TensorFlow 2 Faster RCNN 的应用范围广泛,可用于多个领域,如物体识别、行人检测、车辆识别等。它可以帮助我们在图像中准确地定位和识别不同类别的目标,为自动驾驶、视频监控、人脸识别等应用提供强大的支持。 然而,TensorFlow 2 Faster RCNN 也存在一些挑战。首先,它需要大量的训练数据和计算资源来训练高质量的模型。其次,模型的训练速度可能较慢,特别是在有限的硬件资源下。最后,模型对小目标的检测效果可能会受到一定影响,需要进一步的优化。 总之,TensorFlow 2 Faster RCNN 是一个强大的目标检测算法,采用了 TensorFlow 2 的新特性,开发者可以利用其丰富的功能和易用的接口来构建和训练自己的目标检测模型。尽管面临一些挑战,但它在图像识别领域具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值