5步实现深度学习OpenCV对象检测:Faster-RCNN图片识别

Faster-RCNN图片识别

Faster-RCNN对象检测算法是R-CNN对象检测的第三个版本算法,其前面还有Fast-RCNN与RCNN算法,由于R-CNN无法实现End-to-End训练,Fast R-CNN Selective Search耗时比较长等原因,作者在此2版的基础上,更新到了Faster-RCNN对象检测算法。

对象检测

从下方结构图可以看出:Faster-RCNN对象检测算法将特征提取、proposal提取、Bounding Box Regression、Classification整合到一个网络中,对象检测速度不仅有了提示还避免了前2个版本的缺点。

Faster R-CNN

Faster R-CNN对象检测流程:

1、特征提取(convolutional layer):Faster R-CNN使用卷积+relu+pooling池化层提取被检测对象的特征。

2、区域预测网络(Region Proposal Network):RPN通过softmax函数判断锚点(anchors)属于某个特征,再利用边界框回归(bounding box regression)修正anchors获得精确的对象检测值。

3、目标区池化(Roi Pooling):收集输入的特征数据和候选目标区域,利用此层信息提取目标区域特征数据,然后全连接层识别图片。

4、分类(Classification):利用目标区域特征数据计算太识别图片,同时利用边界框回归获得对象检测的精确位置。

Faster R-CNN流程图

如何来实现Faster R-CNN,以及Faster R-CNN的具体工作是如何实现的,小编也参考了很多网友的源码,无奈代码量太大(少的也得几千行),我们前期分享了如何使用opencv与MobileNet SSD的图像识别以及视频实时识别

MobileNet SSD视频流实时识别

MobileNet SSD图像识别

同样使用opencv也可以来实现Faster R-CNN的对象检测算法,很多代码都比较类似,小伙伴们也可以参考往期文章

使用OpenCV进行基于Faster R-CNN深度学习的对象检测

Faster R-CNN prototxt 与Faster R-CNN model模型已经共享:

回复:RCNN 即可领取

模型一共2种:

faster_rcnn_inception_v2与faster_rcnn_resnet50,2种模型是在不同的训练集上训练的数据,其中faster_rcnn_inception_v2模型较小,速度较快,本期按照此模型来搭建对象检测,其faster_rcnn_resnet50模型跟faster_rcnn_inception_v2模型的代码完全一致,只是修改一下模型的路径便可

在本节中,我们将使用 OpenCV中的深度神经网络( dnn)模块与Faster R-CNNprototxt 与Faster R-CNN model来构建我们的对象检测器

1、模型以及第三方库

模型以及第三方库

首先导入模型以及模型参数,若使用faster_rcnn_resnet50模型, 12 、13行直接修改为faster_rcnn_resnet50模型的相对地址

2、定义模型识别类型

定义模型识别类型

Faster R-CNN模型相比SSD来说,能够识别的种类,丰富了很多,大概有100个种类,几乎包含了生活中所能涉及的种类,当然,若你有强大的数据支撑,也可以来训练自己的模型(后期分享如何来训练自己的模型)

3、opencv建立神经网络

opencv建立神经网络

对比51 、52行可以知道,SSD模型是在caffe上训练的模型,而Faster R-CNN模型是tensorflow上训练的模型,但是强大的opencv库使用dnn函数就能很方便的加载预训练模型,且可以对比看出,其模型与参数文件前后有区别

4、计算blob,进行神经网络的预测

计算blob,进行神经网络的预测

获取图片的长宽参数,重新调整图片长宽为300*300,来进行图片blob的计算,然后blob传入神经网络来进行计算,使用前向传播来预测图片

5、遍历预测值,提取设置阈值的对象

遍历预测值,提取设置阈值的对象

此部分跟SSD对象检测代码完全一致,小伙伴们可参考往期文章,此模型需要加载在opencv3.4.2版本以上。

关于此代码如何利用在视频检测上,如何通过多进程来加速神经网络,请参考往期文章

深度学习和OpenCV对象检测(MobileNet SSD多进程视频流实时识别)