chapter5. 深度学习中的目标检测

本章主要介绍了深度学习中的目标检测原理,及具体的代码实现。

一、深度学习中的几种目标检测原理

本小节主要介绍3中目标检测原理:R-CNN,Fast R-CNN,Faster R-CNN。
1、R-CNN
R-CNN遵循传统目标检测的思路,同样采用提取框,对每个框提取特征,图像分类,非极大值抑制四个步骤进行目标检测。与传统目标检测不同的是,R-CNN中,采用“深度卷积模型”提取各框中的特征。其具体步骤如下:
1、利用数据集先训练一个CNN模型;
2、在目标检测的数据集上,微调CNN;
3、用Selective Search搜索候选区域,即:提取框;
4、将提取框中的image缩放到统一大小;
5、将缩放后的image送到微调的CNN中提取特征;
6、将提取的特征送到SVM进行图像识别;
以下为R-CNN目标检测的算法框架:

与传统目标检测相比,R-CNN采用“深度卷积模型”来提取特征,在很大程度上提高了识别的准确率。但是,由于对于每个提取框而言,都要送入CNN提取特征,且需要将这些特征保存起来,供SVM使用,因此,R-CNN的计算量非常惊人。下面所讲的Fast R-CNN和Faster R-CNN在一定程度上改善了R-CNN的这个缺点。
2、Fast R-CNN
1)在正式介绍Fast R-CNN之前,我们首先了解一下SPPNet。
与R-CNN相比,SPPNet不需将每个提取框送入CNN提取特征,而只需对整个image计算一次卷积,然后,对image提取框相应位置的卷积做ROI池化,将其转变为最终的提取框特征即可,因此,与R-CNN相比,SPPNet可有效的减少计算量。
在SPPNet网络中,我们用到了一个ROI池化层,其作用是将不同尺寸的input,转变为相同维度的特征向量,ROI池化层常常接在卷积层后,如下图所示:

ROI池化层工作原理如下:
step0:卷积层为:(w,h,c);
step1:ROI池化层首先将卷积层划分为4x4的网格,对每个网格中的各个通道取最大值,这样我们就得到一个16c维的特征;
step2:在4x4网格的基础上,将卷积层划分为2x2网格,对每个网格中的各个通道取最大值,这样我们就得到一个4c维的特征;
step3:在2x2网格的基础上,将卷积层划分为1x1网络,对每个网格中的各个通道取最大值,这样我们就得到一个c维特征;
step4:将1-3步得到的特征拼接,即:16c+4c+c,就得到了最终的特征向量;
以上就是ROI池化层工作原理,与R-CNN相比,SPPNet应用了ROI池化层,从而使得网络的input image尺寸无需固定。
在SPPNet中,虽然无需将image中的每个提取框都送入“深度卷积神经网络”,而是对image计算一次卷积,然后在卷积的基础上直接应用ROI池化层提取“提取框”特征向量,但是,SPPNet中,“特征提取”和“区域分类”仍然是分开进行的。
Fast R-CNN相比SPPNet,更进一步,其“区域分类”也采用神经网络(而非SVM),这样就可以同时训练特征提取网络和分类网络,从而取得比SPPNet更高的准确率。以下为Fast R-CNN的算法框架,可以看出,Fast R-CNN有两类输出,一个输出负责分类,另一个输出则负责框回归(即确定提取框坐标(x,y,w,h))。

3、Faster R-CNN
尽管与R-CNN相比较,Fast R-CNN的准确率及计算速度均有了很大的提高,但仍然存在一个明显的缺陷,即:利用Fast R-CNN进行目标检测时,仍然需要先用Selective search提取框,这大大降低了目标检测的速度。在Faster R-CNN中,利用RPN(Region Proposal Network)网络取代了Selective search,极大的提高了计算速度,及准确率。
下面先来介绍一下RPN,在RPN中,首先对raw-image进行2次卷积,得到一个5139256的特征,其中,我们称该image共有5139个位置,对每个位置都添加9种尺寸的框(anchor),对各个框进行检测,判断其中是否存在物体。在实际中,anchor的尺寸可以根据具体的“目标检测任务”来进行设定。在我们讲述的这个网络中,假设每个位置对应9个anchor。将image的各个位置转换为一个256维的特征,这个特征对应了两部分输出,一部分表示该位置anchor为物体的概率,这部分的总输出长度为29(即anchor内有物体的概率,和,anchor内没有物体的概率)。另一部分为框回归,一个anchor对应4个框回归参数,因此,框回归部分的总输出长度为4*9。(下面图示为RPN网络示意图,Faster R-CNN中的anchor,以及anchor与网络输出的对应关系)。



Faster R-CNN使用RPN生成候选框以后,剩下的网络结构与Fast R-CNN一样。在训练过程中,需要训练两个网络,RPN,以及分类网络,通常这两个网络是交替训练的,即在一个batch内,先训练RPN网络一次,在训练分类网络一次。
从R-CNN,到Fast R-CNN,再到Faster R-CNN,不仅检测速度越来越快,而且检测的精度也在不断提升,以下为3者的对比:

二、Tensorflow Objection Detection API

(一)安装Tensorflow Objection Detection API

在Github上,Tensorflow Detection API存放在tensorflow/models项目下,通过如下代码下载tensorflow/models。

git clone https://github.com/tensorflow/models.git

下载tensorflow/models后,models下有个research文件夹,下面操作均以research文件夹为根目录。
安装tensorflow Objection Detection API的步骤如下:
1、安装或升级protoc
在object_detection/protos/中,可以看到一些proto文件,需要用protoc程序将这些proto文件编译为python文件。
使用protoc对proto文件进行编译,具体来说,应当在research文件夹下进行,运行下面的命令:

#From models/research
protoc object_detection/protos/*.proto --python_out=.

运行完成后可以检查object_detection/protos/文件夹下,是否每个proto都对应一个以.py为后缀的python源代码,如果是,则说明编译成功。
2、将Slim加入PYTHONPATH
Tensorflow Object Detection API是以Slim为基础实现的,需要将Slim加入PYTHONPATH后才能正确运行,具体执行如下代码:

export PYTHONPATH = $PYTHONPATH:'pwd':'pwd'/slim

执行完上述命令,如果在python shell中import Slim成功,则说明以正确设置。
3、安装完成测试
在research文件夹下,执行:

python object_detection/builders/model_builder_test.py

如果安装成功,则会出现下面页面:

(二)执行已经训练好的模型

在tensorflow object detection API中,提供了5种预训练模型,下面code给出使用预训练模型的实例。
code
目标检测结果图示:
在这里插入图片描述

(三)训练新的模型

1、用VOC 2012对模型进行训练:
VOC 2012下载地址为:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar;
在object_detection文件夹中新建voc/文件夹,将下载的数据加压到该文件夹,解压后得到的文件夹结构如下:


在object_detection文件夹下,执行下列命令(create_pascal_tf_record.py),将VOC 2012数据集转换为tfrecord格式,并将转换好的文件保存在voc/文件夹下,将其命名为:pascal_train.record,pascal_val.record。

python create_pascal_tf_record.py --data_dir voc/VOCdevkit/ --year= VOC2012 
--set=train --output_path=voc/pascal_train.record 
pythoηcreate_pascal_tf_record.py -呻data_dir voc/VOCdevkit/ --year= VOC2012 
--set ral --outp _path oc/pascal_val.record

并将pascal_label_map.pbtxt数据复制到voc/文件夹下:

cp data/pascal_label_map.pbtxt voe/ 

2、下载模型
从Tensorflow detection model zoo中,选择需要的模型,这里以Pretrained模型“Fas er R-CNN + Inception_ ResN et_ v2 模型”为例说明。将该模型解压后,存于voc/pretrained/文件夹下,具体解压后有5个文件,分别为:frozen _inference _graph.pb、 graph.pbtxt 、model.ckpt. data-00000 -of-OOOO1、model.ckpt. index、 model.ckpt.meta。
Tensorflow Object Detection API是依赖一个特殊的config文件进行训练的,在object_detection/samples/configs/文件夹下,下载一个示例config文件“faster_rcnn_inception_resnet_v2_atrous_pets.config”,将其保存到voc/文件夹下,具体代码如下:

cp samples/configs/faster rcnn inception_resnet_v2 atrous pets .config \ 
voc/voc .config 

修改voc.config中如下参数:
1)num_classes:使其与VOC 2012数据集相符;
2)eval_config中的num_examples(验证阶段要执行的图片数量);
3)其它5处含有PATH_TO_BE_CONFIGURED的地方,这些地方需要修改为自己的目录:


3、新建train_dir/作为保存模型和日志的目录,使用下列命令开始训练(train.py):

pytho train.py --traiη_dir voc/train_dir/ --pipeline_config_path 
voc/voc.config 

4、训练的日志和最终的模型都会被保存在train_dir中,可以通过Tensorboard来监控训练过程:

tensorboard --logdir voc/train_dir/

5、在训练时,如果发生内存或显卡不足的报错时,可以通过修改config文件的以下内容,继续训练(修改input image size):

(四)导出模型并预测单张图片

Tensorflow Object Detection API提供了一个导出模型的脚本“export_inference_graph.py”,用于导出训练好的模型,具体方法如下:

python export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path voc/voc.config \
--trained_checkpoint_prefix voc/train_dir/model.ckpt-1582 #根据train_dir/中的ckpt确定具体名称;
--output_directory voc/export/

我们可以将“(二)执行已经训练好的模型”中的code稍作修改,用"导出的模型"进行“目标检测”;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarah ฅʕ•̫͡•ʔฅ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值