1. 引言
智能门禁系统已经被证明是智慧城市建设不可或缺的一部分,对于物体的识别技术在门禁系统中又扮演着极其重要的角色,例如:智能停车场系统中的车牌识别技术应用,火车站出入口人脸识别检测技术,并且已经在社区管理、学校考勤、科技园区等领域得到广泛的应用 [1] 。我们将其应用在对于宠物的智能管理上,提高对于宠物的管理效能。我们通过使用Opencv软件,对视频流进行截取,对截取图片当中的宠物,使用MobileNet-SSD神经网络进行对于宠物的识别,训练集采用Kaggle开源的猫狗数据集,大大提高了识别的准确率。
2. 宠物识别过程
2.1. 视频流截取宠物图片
对于动态视频流数据处理可以转化为静态图像帧的处理,这样就可以在不改变图像模型的情况下实现对视频流的处理工作 [2] 。这里我们用到opencv,使用Python语言开发具有高效性,
得益于其丰富的第三方库,Python能够将其他语言制作的模块快速轻松地连接在一起。本文所使用的OpenCV就是可以通过Python语言进行调用的一个第三方视觉库。Open CV于1999年由Intel创立至今经过多年的发展已经成为当今计算机视觉领域一款功能强大且通用的图像视觉处理库。使用opencv自带的videocapture()函数定义摄像头对象,本实验调用的是笔记本的内置摄像头,在while循环中,利用摄像头对象read()函数读取视频的每一帧。截取图像过程如图1所示:
截取图片结果如图2所示。
2.2. MobileNet-SSD神经网络
Mobilenet主要是为了适用于移动端而提出的一种轻量级深度网络模型 [3] 。主要使用了深度可分离卷积将表捉卷积核进行分解计算,引入了两个超参数去减少计算量,这两个超参数是宽度乘数和分辨率乘数。
深度可分离卷积是将一个标准的卷积核分成深度卷积核和1*1的点卷积核,假设输入为M个通道的featuremap,卷积核大小为Dk*Dk,输出通道为N,那么标准卷积核即为M*DK*DK*N。例如,输入feature map为m*n*16,想输出32通道,那么卷积核应为16*3*3*32,则可以分解为深度卷积:16*3*3得到的
是16通道的特征图谱。点卷积为16*1*1*32,如果用标准卷积,则计算量为:m*n*16*3*3*32 = m*n*4608。用深度可分解卷积之后的计算量为m*n*16*3*3 + m*n*16*1*1*32 = m*n*656,一共有28层(深度卷积和点卷积单独算一层),每层后面都跟有batchnorm层和relu层。深度可分解卷积操作示意图如下图3所示。

Figure 3. Deep decomposable convolution operation sketch
图3. 深度可分解卷积操作示意图
2.3. 宠物特征提取
神经网络每一层生成的新的神经节点作为新的特征输入下一层,从而能够处理较复杂的任务,但是处理图像分类的任务时,一副图像的每一个像素点都是输入层的一个特征,都需要一个独立的权重,如果使用多层的神经网络,由于权重过多,不仅训练花费时间极高,而且对内存一会产生加大的消耗 [4] 。
生物学家通过对动物大脑的研究发现动物识别物体时会从简单的线条开始逐步抽象出更高层次的物体,受此启发,计算机科学家发明了一种卷积神经网络的算法,对图像从最简单的线条开始识别,逐步识别出更复杂的目标物体 [5] 。例如要识别下图中的金毛,在眼睛鼻子首位先提取出一些曲线最为第一层的输出,第二层组合这些曲线继续提取特征,根据一条曲线和两个鼻孔提取出鼻子的特征输出到下一层,继续组合和提取特征,在最后一层组合眼睛,鼻子等特征识别出金毛。特征提取如图4所示。
卷积将相邻的像素当作一个集合进行处理,这就是卷积和非卷积神经网络的区别,卷积神经网络使用滤波器提取图像的局部特征,这更复合人们的认知,因为一副图像的局部像素的相关性更加紧密,例如上图提取鼻子的特征时,只需要整幅图像的中间的一部分像素,而其他像素都为干扰项,非卷积网络的每一层特征都会影响下一层特征的提取,于是增加了很多干扰项,降低了特征提取的准确度。
2.4. 训练数据集
MobileNet-SSD训练时候导入的图片大小是300 × 300 × 3,前面两个数据分别是图片呢的宽和高,第三个数据是图片的通道数,RGB,是三个维度。经过第一个卷积层得到的是150 × 150 × 32,也就是将原来的三个维度扩大成了32个维度,或者简单来说,将原来3个高扩大成了32个高 [6] 。具体看一下实现的过程。MobileNet-SSD网络结构图如图5所示:

Figure 5. MobileNet-SSD network architecture
图5. MobileNet-SSD网络结构图
这是第一个卷积层里面的参数,看主要的数据kernel size = 3,也就是使用了3 × 3的filter (滤波器) stride = 2每一个filter移动的步长是2,向右移动的时候一次移动两个像素,举例来说,filter的左上角的位置原来在从左向右数的第一个位置,移动之后,就变成了第三个位置,同理向下移动的时候也是这样的 [7] 。卷积层参数图如下图6所示:

Figure 6. Convolution layer parameter diagram
图6. 卷积层参数图
下图7就是移动以后得到的stride = 2时候的图像,经过卷积之后再经过一个激活函数relu,经过这样一次的对图像的滤波,最后可以得到想要的高维度的数据,但这个神经网络和其他的有些不一样,这个detections得到6个高维度数据,不仅仅是对最后的高维度的数据处理,这样的好处是,使得整个网络更加准确,而且速度较快。和yolo进行比较,这个的准确度可能达不到yolo的探测水平,我在做实时行人检测的时候,yolo的识别效果会更好,但是yolo的缺点就是速度太慢,根据你项目的需要,如果是实时检测猫狗的话,必然要选择MobileNet-SSD,这个网路根据名称可以看出,是由MobileNet进化而来的。

Figure 7. Image when stride = 2
图7. Stride = 2时候的图像
3. 实验结果及分析
根据现在中国的宠物饲养现状,大部分人饲养的都是猫狗类的宠物,所以训练集采用的是2013年kaggle公开的猫狗大战训练集,其中有猫类图片12,500张,有狗类图片12,500张大大满足了我们对于训练集的要求。为了防止过拟合现象的发生,我们采用了验证集的方法提高识别的准确率。验证集主要是测试当前网络采用的一些超参数是否合理,利用validation-based early stopping (提前停止训练)机制来防止过拟合。不要认为模型中有了验证集,它自己就会提早停止。测试集是在全部模型训练好之后拿来测试的,在模型的构建中不能用测试集的任何信息。而为了防止过拟合,我们需要选取一些数据验证下模型的泛化能力,因此验证集不能与训练集有重合。宠物识别结果如下图8所示:
4. 结论与展望
本文介绍了一种基于卷积神经网络的宠物识别方法,通过对网络的训练来调整参数,实验验证了本文算法具有较高的识别率,为相关需求领域提供了一种简单易行的小成本宠物识别解决方案。由于实验设备与时间的限制,本文所提出的方法考虑到算法的实时性,利用MobileNet神经网络架构大大减少了识别的时间,尽管如此,识别所需的时间仍然无法与实时的要求相适应。在识别宠物的广度上也略有不足。希望在日后的学习中能够让这些问题得到解决。