曹 凯, 王 召, 高 嵩*, 宋晓茹, 陈超波
(1.西安工业大学电子信息工程学院,西安 710021;2.西安工业大学机电工程学院,西安 710021)
场景理解作为智能视频监控领域的难点问题和核心内容,其目标是利用计算机视觉相关算法从自然场景中直接获取语义信息,近年来已经逐渐成为计算机视觉领域研究的核心问题[1]。人数计数是场景理解的一个重要内容[2],随着办学规模越来越大,学生随之越来越多,作为高校硬件资源之一的自习室、图书馆存在着求过于供的情况,多数学校的自习室、图书馆经常一座难求,这些场所座位资源的合理分配问题是高校需要解决的难题。
目前,人数统计的方法大体可以分为两类[3-4]:一类是基于视频序列的运动目标检测算法,将整个人体作为对象进行数量统计,此类方法首先对场景中的背景进行建模,后续帧与背景模型进行比较而提取出运动的前景区域,然后计算运动区域的面积、边缘轮廓等特征信息,再与人体的先验知识进行特征匹配,来估计人数。这种方法的精确度主要取决于先验知识,不稳定且准确率低。另一类是基于图像特征和深度学习的目标检测算法,该方法通过采集并学习图像中能够反映人体的特征来训练样本集,之后输出识别结果。这种方法的优点是精确度高,缺点是训练需要大量样本数据且比较耗时。深度学习目标检测算法[5]有YOLO(you only look once)[6-7]、单次多盒检测器(single shot multibox detector, SSD)[8]、Faster R-CNN[9-10],其中YOLO的目标检测速度较快,YOLO v3在Titan X GPU下检测速度可达到每帧22 ms,但在计算成本有限条件下可能数秒检测1帧,无法在实际中广泛使用。
以SSD为基础进行改进,采用Mobile-NetV2[11]卷积神经网络进行特征提取,并加入SENet[12]到网络结构中,增强网络对特征的选择能力。在显著减少计算的情况下,保留网络准确性,实现了移动应用等计算成本有限下的目标检测任务。使用深度学习算法与计算机视觉相结合的方法进行室内人数检测,设计人数监控系统,有助于学校自习室、图书馆座位对学生指引。人数检测也有利于解决其他公共资源的合理分配和利用问题,在机场、地铁站等公共场合[13],对人流的准确计数,能够有效地发挥智能调度系统的作用,让公共资源得到更充分的利用。
SSD目标检测模型是由Liu等[8]提出的使用卷积神经网络检测图像中目标的方法。模型的结构如图1所示,其主要由4部分组成: 基础特征提取部分、附加特征提取部分、原始包围框生成部分和卷积预测部分。主要工作过程:将300×300的输入图像经过基础特征提取部分与附加特征提取部分后得到图像的特征图;再经过原始包围框生成部分和卷积预测部分得到大量多尺度的目标包围框和对应位置处目标包围框的修正值及预测概率;根据原始包围框的位置、预测的类别与准确率、图片真实值计算误差,反向传播实现网络参数更新。
Conv代表卷积层;FC代表全连接层;ConvM_N代表此卷积层序号是M且包含N层卷积;FCM代表此全连接层的序号为M;Conv: MxNxC-sP代表此卷积层卷积核大小为 MxN,通道数为C,卷积步长为P,步长为1时省略不写图1 SSD模型结构Fig.1 Composition of SSD
基础特征提取部分用于对输入图像进行初步的特征提取,得到的浅层特征用于对目标分类与目标包围框回归,也作为后续附加特征提取等部分的输入。原始SSD目标检测模型直接将VGG-16[14]模型的卷积部分用作基础特征提取部分,其包含13层卷积层,对输入为300×300像素的彩色图像进行卷积运算,得到尺寸为19×19的特征图512张,作为附加特征提取层的输入。
附加特征提取层部分包含10层卷积层,对基础特征提取部分输出的特征图进行进一步卷积运算。在基础特征提取部分的VGG-16结构中后两层为全连接层,全连接层计算量较大,且存在参数冗余,故将后两层的全连接层修改为卷积层,如图1中的Fc6-Conv层和Fc7-Conv层。
SSD模型使用卷积层来实现目标分类与目标包围框修正,需要在被选特征层的每个特征值位置上生成若干原始包围框,在原始包围框基础上使用回归方法来修正目标包围框结果。网络中不同层输出的特征图具有不同的感受野(receptive field),即对原始图像不同的检测区域。通过设计各层的缩放因子来调整不同层内原始包围框的尺寸以适应不同大小的目标。假设共选m个特征层,则SSD模型对于第k层的缩放因子为
(1)
式(1)中:smin=0.2,smax=0.9。设输入图像的高和宽分别为Hinput和Winput,则该层对应的宽高比r的原始包围框宽为
(2)
原SSD目标检测模型使用VGG网络作为基础网络,但VGG网络主要有两个问题:①模型参数众多,计算量大,在特征提取过程中占用了较大内存与计算时间;②在前向传播过程中由于存在非线性变换导致变换过程中信息的损失。
针对第一个问题,使用深度可分离卷积网络[15-17],结构如图2所示,基本思想是将卷积分成两个单独的层:深度卷积和逐点卷积。深度卷积使用n×n卷积核对每个输入通道分别进行卷积。逐点卷积使用1×1卷积对深度卷积输出的特征图进行线性组合来构建新的特征图。这种结构将空间相关性和通道相关性分离,相比传统的卷积,它可以减少约k2计算复杂度,当卷积核k=3时,计算成本少8~9倍,而保留了准确率。
Depthwise Conv为深度卷积,3×3、1×1为卷积层的卷积核大小;Batch Normalization为批归一化;Pointwise Conv为逐点卷积;ReLU(rectified linear unit)为线性整流函数,其后的数字 6为此函数的参数图2 深度可分离卷积Fig.2 Depthwise separable convolutions
针对问题二,Sandler等[11]在流形学习理论的基础上提出非线性激活函数ReLU在高维度下会较好地保留信息,而在低维度下会丢失特征信息,故在输入层应该增加特征维度之后再对其进行非线性变换,而在输出层应该对特征进行降维后使用线性激活函数以减少信息的丢失,据此提出倒置残差结构(inverted residual block),如图3所示。倒置残差结构与残差结构[18]相比,输入和输出的通道数更少,并使用深度可分离卷积来过滤中间扩展层中的特征,这样提高了内存效率。
在MobileNetv2倒置残差结构的基础上加入SENet,如图4所示。SENet是由Momenta研发工程师Hu等[12]提出的卷积神经网络结构,此结构通过建模特征通道间的依赖关系,增强网络对特征的选择和抑制能力,其主要由Squeeze、Excitation和Reweight 3部分构成,如图5所示。其主要操作流程为:①Squeeze操作,使用全局平均池化压缩每个通道的特征,将每个通道的特征压缩为一个数值;②Excitation操作,通过控制两层全连接层的权值,来建模各个特征通道之间的相互依赖关系;③Reweight操作,通过Sigmoid得到范围为0~1的归一化权重,最后对每个通道分别进行乘法操作将权值加权到原特征上。
expansion convolution为扩展卷积,作用是扩展特征图的大小;depthwise convolution为深度卷积;projection convolution为投影卷积,作用是缩减特征图的大小图3 倒置残差结构Fig.3 Inverted residual block
expansion convolution为扩展卷积;depthwise convolution为深度卷积;GAP(global average pooling)为全局平均池化层;FC代表全连接层图4 改进的倒置残差结构Fig.4 Modified inverted residual block
X代表输入;H、W、C分别代表图片的高、宽、通道数;Ftr代表卷积、池化操作是传统的(tradition);Fsq代表卷积、池化操作的作用是Squeeze操作;Fex代表卷积、池化操作的作用是Excitation操作;Fscale代表卷积、池化操作的作用是尺度放缩(scale)图5 SENet结构Fig.5 Composition of SENet
训练样本来源主要有两部分,一部分样本数据来自微软开源数据集(common object in context,COCO)[19],另一部分样本是自己采集制作。原始COCO数据集中包含80多类对象,所以需要去除与实验无关的类别,仅留下关于人类别的数据。自己的数据集来自教室上方安装摄像机拍摄的视频,将采集的视频分帧,取出不同时段的图像作为训练样本,选取人数较少的图片来减少数据标注的成本。由于相机采集的是720P而网络输入是300×300,为避免数据过度压缩损失信息,将每帧分为4份数据,然后在这些图像上标注,制作成PASCAL VOC数据集,最终训练集共66 615张,其中包含人的样本有43 622张。测试集共11 370张,包含人的样本为7 331张。
由于样本中各种情形下的图像样本并不一致,为了避免样本分布不均导致训练出的模型泛化性能不佳问题,对自己采集的样本进行旋转、缩放、裁剪、平移、对比度、色彩抖动等操作,实现数据增广,使得训练的模型更好适应小尺度目标,提高泛化性。同时由于室内光照问题,特别是在距离光源较近的人身上的光照很强,使得处于此环境下的人相对于光照射下表面会有较大变化,从而会影响室内人检测的精度。采用自适应直方图均衡化来对图像进行增强从而提高图像的质量,减少光照变化对图像的影响。
采用NVIDIA GeForce RTX 2080 Ti型GPU、Intel i7-9700K CPU作为硬件平台,操作系统为Windows 10,并行计算框架版本为CUDA v10.0,深度神经网络加速库为CUDNN v10.0。采用Python 编程语言在Tensorflow[20]深度学习框架上实现本文的SSD目标检测模型并完成对模型的训练。
训练过程中使用困难样本挖掘 (hard negative mining)策略[21],即训练过程中先用原始的正负样本训练检测模型,然后使用训练出的模型对样本进行检测分类,把其中检测错误的样本继续放入负样本集合进行训练,从而加强模型判别假阳性的能力。训练过程中主要参数为:批大小为128,最大迭代次数为90 000次,每10 000次迭代后衰减一次,每间隔20 000次迭代后保存一次模型,最终选取精度最高的模型,训练loss曲线如图6所示。
图6 改进SSD的训练loss曲线Fig.6 Improved SSD training loss curve
模型测试平台是搭载神经元计算棒NCS2的树莓派3B+,计算环境是OpenVINO 2019R1。训练完成后将ckpt模型转化为pb模型文件,pb模型文件具有语言独立性,可独立运行,封闭的序列化格式,可移植性好。最后将pb模型文件转化为IR模型,将IR模型在部署好环境的树莓派上运行测试。
通过在测试集中分析模型改进前后的检测精度、检测速度和参数量以对比模型的性能。把测试集图像输入训练好的网络,对室内的人进行检测并记录其位置,当模型预测的目标边界与测试集对应的标注数据中的边界框的交并集比(IOU)大于等于设定的阈值时,认为检测结果正确,否则视为检测错误。检测精度的评价指标选取准确率P、召回率R和调和均值F1,各个评价指标的定义为
(3)
(4)
(5)
式中:TP为正确检测到人的数量;FP为误把非人目标检测为人的数量;FN为误把人检测为背景的数量;F1为对准确率和召回率的调和均值。
在制作的测试数据集上,默认IOU阈值情况下,分别对改进前后的SSD目标检测模型做测试,准确率与帧率如表1所示。
表1 改进前后SSD的实验结果
由表1可以看出,改进的SSD目标检测模型准确率提高了4.48%,召回率提高了1.44%,在特征提取MobileNetv2中加入SENet模块可以使SSD目标检测模型准确率和召回率均得到提高,且在搭载NCS2的树莓派3B+测试平台下检测速度可达8帧/s,适合在移动设备上部署。下面实验均在改进的SSD模型上进行。
当IOU阈值在0. 5以上时,对人的检测结果会受到很大影响,其漏检率将快速上升[22]。不同于城市环境下对检测到的人要求精确的位置,在室内人数检测场景下,对室内人检测的位置精度要求不高,只需较高的准确率即可。通过比较IOU阈值在0.3~0.6时准确率和召回率,选择较为合适的 IOU阈值。不同IOU阈值下,模型检测结果如表2所示,测试样图如图7所示。根据结果得出改进的SSD 目标检测模型在室内环境下检测人的IOU阈值在0.4最合适,模型的准确率和召回率比默认的阈值0.5时分别提高了0.98个百分点和0.62个百分点,故而在IOU阈值为0.4下进行下面模型检测性能的对比试验。
表2 IOU对准确率的影响
图7 IOU对准确率的影响Fig.7 Experimental results on various IOU thresholds
室内图像数据大多是在空中的摄像机采集,不同摄像机高度下采集的图像中人脸与头部的面积比例不同,会影响模型的准确率。本实验包含拍摄高度3、4、5 m各100张测试集,选择实际中较为合适的拍摄高度,检测结果如表3所示。根据结果得出模型在室内环境下在4 m高度采集人照片最合适,模型的F1比另两种高度下分别高出0.69个百分点与1.38个百分点。
表3 拍摄高度对检测准确率的影响
(1)通过修改原SSD的特征提取网络部分,将原VGG特征提取部分更换为加入SENet的MobileNetv2,使目标检测模型更轻量化,并提高了模型对特征信息的选择能力。在综合COCO数据与自制作的数据集上,改进后SSD模型比改进前准确率和召回率分别提高了4.48%和1.44%,且在硬件平台为搭载NCS2的树莓派3B+下每秒可检测8帧。试验结果表明,模型具有较高的准确性。在边缘计算设备上有较好的实时性。
(2)由于室内人数检测无须精确的人的位置信息,故将IOU阈值取为 0.4。在此阈值下,模型的准确率和召回率比默认的阈值0.5时分别提高了0.98个百分点和0.62个百分点。
(3)通过比较不同拍摄角度下数据的检测结果,本文训练的模型在室内环境下在4 m高度采集人照片最合适,比3、5 m高度下分别高出0.69个百分点与1.38个百分点。