钱闻卓
(杭州电子科技大学,杭州 310018)
自从进入了自媒体时代以后,越来越多的用户在抖音、快手这样的平台来分享自己的生活视频并且观看别人的视频。在抖音公布的2020年数据报告中,日活跃用户已经突破了6亿大关,这已经接近全国人口数量的一半。伴随着视频量的爆炸式增长,视频的商业用途也在逐渐地扩大,在过去十几年中,随着计算机视觉技术的不断发展,与视频数据处理有关的人体动作识别[1]、目标检测[2-3]等方法都在生活中被大规模推广和应用,这大大提高了人们的生活效率和质量。其中人体动作识别技术是计算机视觉应用的一大代表,它在办公交互、虚拟竞技、虚拟游戏、医疗诊断、视频监控等领域都有很广泛的应用。近年来,人体动作识别技术取得了较快的发展,比较常用的传统的动作识别方法有基于模板匹配的方法、基于概率统计的方法,以及基于语法的方法[4]。由于传统的识别方法大部分需要人工提取特征,所以较为耗时耗力[5]。而随着深度学习技术的发展,人们开始利用神经网络技术完成一些分类任务,其中在2012年ImageNet大型视觉识别挑战赛(ILSVRC)上,由于AlexNet的横空出世,使像ImageNet这样的大型数据集的图像分类错误率大大下降[6],使人们更加注意到利用深度学习技术进行分类的优势。此后,不少研究人员将目光转向了深度学习研究中去。伴随着深度学习技术的发展,行为动作识别的技术也得到了快速发展,其中,有基于无监督学习的方法构造网络[7],也有基于循环神经网络的识别方法[8],还有基于卷积神经网络的识别方法,其中一种方法是基于双流法来处理视频数据[9],对其动作进行分类,该方法的缺点在于训练速度较为缓慢,难以处理规模较大的实时视频,另一种方法则是在2015年,由Facebook提出的C3D神经网络[10],C3D神经网络是直接将视频数据作为输入,来提取其特征,进行数据信息的传递,由于此过程的数据预处理过程很少,因此其运行时间得到大大缩短。该模型在UCF101数据集上进行训练,识别的准确率是85.2%,速度达到313.9 fps,由于它的高速率,使此网络应用前景会更加广阔。
虽然C3D神经网络的速率较快,但是其速率大小仍不适合在商业领域进行应用,而对于准确率,C3D神经网络在UCF101数据上的准确率为85.2%,还有较大的提升空间。因此,在这些问题上,本文将进一步优化C3D神经网络,来对其进行准确率的提升,训练收敛速度的加快。
最原始的C3D神经网络具有8个卷积层,8个通道数分别为 64、128、256、256、512、512、512、512,5个最大池化层、2个全连接层,以及1个softmax输出层。其中视频输入是C×L×H×W,C为图像通道,L为视频序列的长度。Tran经过大量的实验证明3×3×3的卷积核是3D卷积网络的最佳选择[10]。因此,在本网络中,所有3D卷积滤波器均为3×3×3,步长为1×1×1。为了保持早期的时间信息,设置pool1核大小为1×2×2、步长1×2×2,其余所有3D池化层均为2×2×2,步长为2×2×2。每个全连接层有4096个输出单元。整个网络的结构以及各层的尺寸大小如图1所示。
图1 C3D网络结构
该网络的输入尺寸大小是(3×16×112×112),对于这类尺寸,可以写成(c×l×h×w)的形式。在这其中,c代表着通道的数量,l代表着输入视频帧的数量,h代表输入高度,w代表输入宽度。其中3D卷积滤波器内核尺寸可以写为(d×k×k),其中d代表着3D卷积滤波器内核的深度,k代表着3D卷积滤波器内核的大小。此输入通过1个数量为n、内核尺寸为(3×3×3)、步长以及padding均为(1×1×1)的3D卷积核,则输出的特征图尺寸为(n×l×h×w),并且在该原始网络中使用的优化算法为SGD(随机梯度下降),而激活函数为ReLU,并为防止过拟合现象而采用了Dropout正则化方法[5]。
原始的C3D神经网络在层与层之间采用了ReLU激活函数,并且优化器采用了SGD优化算法,本文针对这两个方面,将ReLU激活函数优化为Mish激活函数,用Adam优化算法替换了SGD优化算法,形成了MA-C3D神经网络(Mish-Adam C3D network,后文统一简写为MA-C3D),以此来提高模型的识别准确率。
在以往的卷积神经网络训练当中,多数网络通常都会使用的激活函数为修正线性单元(recti⁃fied linear unit,ReLU)[11],该激活函数的计算表达式较为简单,没有一些过多的复杂运算。并且,由于此激活函数没有饱和区,梯度消失的现象就不会再次发生。因此,它被广泛地应用在各个网络结构中。但是,ReLU在训练过程中并不适应较大的梯度输入,会造成部分神经元“坏死”的情况,导致相应的参数无法更新,并且它在原点并不可导、不平滑,因此会导致在梯度优化过程中会出现一些意想不到的问题。上述的问题会导致输入数据的信息难以深入地向网络层传递,进而影响网络层之间的参数的优化更新,最后导致应用的模型的识别准确率出现下降。因此,在这样的情况下,本文采用了一种新的激活函数,即Mish激活函数,该函数相比ReLU激活函数,有以下几方面的优点:
(1)该函数没有上界。因此不会出现因为饱和而导致梯度为零的情况,从而可以使参数更好地进行更新,进而使模型的识别准确率得到上升。
(2)该函数存在下界。在负半轴有较小的权重,因此可以防止ReLU函数出现的神经元坏死的现象,此模型也可以产生更强的正则化效果,并且如果出现输入为负数的情况,同样能够进行参数更新和信息的传递,进而使最后训练的参数更加准确,使模型识别更加准确。
(3)Mish激活函数的每个点基本都是平滑的。因此会更加容易优化并且更加容易泛化,而且随着网络更深,输入信息也可以更深入的流动。此外,在x<0的部分中,该函数保留了少量的负信息,这样也有利于输入信息更好的流动。进而使参数的更新更加准确,使得最后的模型识别更加准确。
Mish的函数图像如图2所示。其中该激活函数的输入x为输入信息的加权和,y为x经过Mish激活函数的函数值,并且该激活函数已经在文献[12]中已经证明在多个任务实验里Mish的激活效果要优于ReLU的激活效果。
图2 Mish激活函数
对于优化器,本文采用Adam优化算法[13]来进行优化,选用Adam优化算法而不是以往的随机梯度下降(stochastic gradient descent,SGD)[14]算法的原因是随机梯度下降算法是在每一次仅仅取一个样本进行优化,这样会比较容易引入随机噪声,导致准确率下降。并且,随机梯度下降的学习率一般是固定的,因此如果学习率的选择不当,会导致难以得出理想中的最优解。因此,基于上述的问题,本文采取了另一种优化算法,即Adam算法,Adam算法相比于SGD算法它结合了动量和RMSprop算法的优点,它利用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率,这样使得学习率不再是一个定值,并且学习率的调整也有一个确定的范围,这会使得参数的变化比较平稳,且能够很好地处理噪音数据带来的问题。因此,损失值能达到全局最优解的概率也就越大,最后可以更容易得到神经网络最优参数,进而使模型的识别准确率达到更高。
本文实验所采用的实验设备是Intel(R)Xeon(R)Platinum 8260C CPU,主频为2.30 GHz,内存为16 GB,硬盘为1 T,GPU为NVIDIA GeForce RTX 3090,GPU显存为24 GB。操作系统为Ubuntu 18.04,编程语言选择Python 3.7,深度学习框架采用PyTorch1.7.1,主要依赖库为Cuda 11.0、Cudnn 8.0、OpenCV 4.4、Pillow 7.2、NumPy 1.19.5、Matplotlib 3.3.3。
本文实验采用了UCF101数据集对其进行实验,它是收集自YouTube的UCF101数据集[15],它是一个现实动作视频的动作识别数据集,它提供了来自101个动作类别的13320个视频,总共时长约27 h。UCF101在动作方面提供了最大的多样性,它也包含了像摄像机的大量移动、杂乱的背景、亮度不一的照明条件等干扰因素,这些问题都对模型的泛化能力提出了很高的要求,增大了模型训练的难度。
对于自身的数据视频,首先将视频转化为连续的帧,之后本文按照每相隔3帧取1帧的原则,得到能覆盖此动作信息的连续帧,如果最后的帧数没有到16帧,则可以降低采样的步长,使得每个动作得帧数达到16帧及以上。利用这样的方式,可以获取整个动作较为完整的信息。转化为帧图像之后,我们按照16∶5∶4的比例划分训练集、测试集和验证集。并且在训练时,将每帧大小统一为171×128,以进入本文的网络进行训练。同时,为了进一步增强模型的鲁棒性,我们利用了对图像的随机像素丢弃、图像添加噪声以及对图像进行几何变化等手段来对原始数据进行增广。
本实验通过UCF101数据集进行训练,总共进行了50次迭代,训练时长约为18.7h,准确率变化曲线以及损失函数曲线如图3、图4所示,最终可达到的行为动作识别准确率可达到85.3%,原始C3D网络在本实验中达到的准确率为79.4%,由此可见,本方法能够有效地提高准确率。
图3 UCF101准确率变化曲线
图4 UCF101函数损失值变化曲线
在此基础上,本文也和一些经典模型,比如Two-stream双流卷积神经网络[16]、LTSM Compos⁃ite Model[17]、R-C3D[18]进行了比较,经过模型之间准确率的比较,证实了本文提出的模型的准确率要好于上述三种模型,如表1所示。
表1 UCF101各数据集对比
本文采用对C3D神经网络进行了结构上的一些改进,形成了MA-C3D神经网络,基于以上的改进方法,可以得到以下的结论:
(1)改进后的MA-C3D神经网络,在UCF101数据集上验证,经过测试之后,可以得到改进后的MA-C3D网络的准确率要高于原始的C3D网络及其他的一些卷积神经网络模型算法。
(2)Mish函数虽然可以让网络的信息能够更加深入的流动,进而提高模型的准确率,但是会因此降低模型训练的速度,增大一定的计算量。
(3)本文主要对模型准确率的提高进行了实验与研究。但是,在模型参数量的大小优化方式上,并没有进行更深的研究,后续将考虑对最后的全连接层进行替换,换为以全局平均池化[19]加上全连接层的方式手段来减少参数量的计算,进而对模型就行更深的优化。
(4)本文主要对激活函数和优化器进行了优化,网络结构优化较小。因此,后续将考虑采用逐层卷积[20]以及将特征金字塔方法应用于3D卷积神经网络[21-22]等方法来对网络进行优化。
(5)本文通过对激活函数和优化器的变化来提高C3D网络训练的准确度,这是一种非常简单有效的改变结构的方式,未来可以从这些角度进一步对各个神经网络模型进行优化,让其更好应用到生产生活中。