深度学习和OpenCV的对象检测(MobileNet SSD图像识别)

基于深度学习的对象检测时,我们主要分享以下三种主要的对象检测方法:

  • Faster R-CNN(后期会来学习分享)
  • 你只看一次(YOLO,最新版本YOLO3,后期我们会分享)
  • 单发探测器(SSD,本节介绍,若你的电脑配置比较低,此方法比较适合)

R-CNN是使用深度学习进行物体检测的训练模型; 然而,这种技术很难理解,难以实施,并且难以训练。

如果我们只追求速度,那么我们倾向于使用YOLO,因为这个算法要快得多,但是识别物体位置精准性差,召回率低

R-CNN 与YOLO各有自己的优缺点,由谷歌开发的SSD是两者之间的平衡。

MobileNets:高效(深层)神经网络

在构建对象检测网络时,通常使用现有的网络架构,例如VGG或ResNet,然后在对象检测管道中使用它。问题是这些网络架构可能非常大,大约为200-500MB。

相反,我们可以使用MobileNets,Google在2017年提出的适用于手机端的神经网络模型。我们将这些网络称为“MobileNets”,因为它们专为资源受限的设备而设计。MobileNets与传统CNN的区别,主要使用了深度可分离卷积Depthwise Separable Convolution 将卷积核进行分解计算来减少计算量

引入了两个超参数减少参数量和计算量

宽度乘数(Width Multiplier): [减少输入和输出的 channels ]

分辨率乘数(Resolution Multiplier):[减少输入输出的 feature maps 的大小]

可以将一个标准卷积核分成一个深度卷积depthwise convolution 和 一个1X1的卷积(叫作逐点卷积pointwise convolution)。如下图所示

( 左)具有批量标准化和ReLU的标准卷积层。(右)深度可分的卷积与深度和点的层,批量标准化和ReLU

结合MobileNets和Single Shot Detectors,实现快速,高效的基于深度学习的物体检测

mobilenet_ssd caffe模型可视化地址:
http://ethereon.github.io/netscope/#/gist/5b1ffa5d22f6ac1f25f30fbd24a716be

conv13是骨干网络的最后一层,作者仿照VGG-SSD的结构,在Mobilenet的conv13后面添加了8个卷积层,然后总共抽取6层用作检测,貌似没有使用分辨率为38*38的层,可能是位置太靠前了吧。

提取默认框的6层为conv11, conv13, conv14_2, conv15_2, conv16_2, conv17_2,该6层feature map 每个cell产生的默认框个数分别为3,6,6,6,6,6。也就是说在那6层的后边接的用于坐标回归的3*3的卷积核(层名为conv11_mbox_loc……)的输出个数(num output)分别为12,24,24,24,24,24,24。

那6层后边接的用于类别得分的3*3卷积核(层名为conv11_mbox_conf……)的输出个数为3*21(类别为21类,3个默认框) = 63,126, 126, 126, 126, 126。

如果我们将MobileNet架构和SSD CAFFE框架结合起来,我们就可以实现快速,高效的基于深度学习的对象检测方法。

MobileNet SSD模型数据: COCO dataset

在图像中检测到20个对象(背景类为+1),包括飞机,自行车,鸟类,船,瓶,公共汽车,汽车,猫,椅子,奶牛,餐桌,狗,马,摩托车,人,盆栽植物,绵羊,沙发,火车和电视监视器。

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

caffe prototxt 与caffemodel模型已经共享百度网盘:

回复:MobileNet SSD

即可领取

在本节中,我们将使用 OpenCV中的MobileNet SSD +深度神经网络( dnn)模块来构建我们的对象检测器

待我们的神经网络检测完成后,我们遍历检测模型,得到检测对象的尺寸box与label

使用训练好的模型,我们简单的使用便可以实现对象检测,一共代码20多行,再次感谢Google团队对MobileNet SSD模型的研究以及训练(如何训练自己的模型,我们后期分享)

微&信搜索:启示AI科技

可以体验不同的AI工具