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的图像识别以及视频实时识别
同样使用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版本以上。
关于此代码如何利用在视频检测上,如何通过多进程来加速神经网络,请参考往期文章