一种基于深度学习的手势图像关键帧提取方法
技术领域
本发明属于关键帧提取方法,尤其涉及一种基于深度学习的手势图像关键帧提取方法。
背景技术
手势视频关键帧提取是动态手势识别过程中的关键步骤,对手势视频进行关键帧提取,降低了数据复杂度,提升了手语识别算法的实时性,保证关键帧的提取效果是实现手语准确识别的重要条件。如何判定手语视频中的动作关键帧始终是一个难点,这主要是因为手势变化幅度比较小,不容易进行关键帧的判定,进行关键帧提取时容易出现关键帧冗余的情况。目前常见的手势分割技术有首尾帧和中间帧法、基于颜色、纹理、形状特征法、基于运动信息法、基于聚类方法等。
手势视频关键帧提取的方法多种多样,但是在实际提取过程中,由于手势的变化幅度比较小,常常会出现提取的关键帧较少或者关键帧冗余的情况,关键帧的提取成功与否直接影响到手语识别的精度。当前手势视频关键帧提取的主要挑战如下:1)对手势视频的关键帧选取具有局限性,不能准确表示视频的有效信息;2)在基于运动信息的关键帧提取时,对于运动信息的计算量比较大,无法进行实时计算,而且对于运动量的局部极小值的确定也不精确;3)对手势帧序列进行关键帧判定时,往往会由于背景的变化对运动区域产生影响,从而影响关键帧的判定。
发明内容
针对背景区域对视频关键帧判定的影响,原始图像特征表达信息的局限性的问题,本发明提出了一种基于深度学习的手势图像关键帧提取方法,是一种针对手语视频这种动作幅度变化较小的视频关键帧提取方法。
本发明提出利用Mobilenet-SSD目标检测模型实现手部区域的分割,消除背景区域对于运动区域的影响,利用VGG-16卷积神经网络自动提取手部区域的抽象复杂特征,增强图片特征的表达能力,降低模型的复杂度以及参数量,通过计算手部抽象特征的空间梯度信息以及相邻帧图像的梯度差,设置合适的阈值实现了手势关键帧的判定。
本发明采用的技术方案如下:
本发明包括以下步骤:
1)读取手势视频,然后将手势视频转换为手势视频帧图像;
2)通过Mobilenet-SSD目标检测模型训练得到手势检测模型,利用手势检测模型对所有手势视频帧图像中的手势进行检测,并将手势视频帧图像中检测出的目标手势进行分割,从而得到对应的手势分割图像;
3)将步骤2)的手势分割图像输入CNN网络模型训练输出后,得到手势分割图像的抽象特征;所述CNN网络模型采用VGG16训练模型,VGG-16训练模型中的block2-pool层作为输出层;
4)对手势分割图像的抽象特征进行空间梯度计算,并根据计算得到的空间梯度值绘制梯度直方图。
5)根据相邻两帧手势分割图像的梯度值差异,绘制差值折线图,通过差值折线图的波动情况设定相应阈值,根据阈值完成关键帧的判定。
所述步骤2)具体为:
2.1)随机选取手势视频帧图像中的300张手势图像,并利用Labellmg标注工具对300张手势图像中的手势进行标记,为了确保检测的准确性,对左右手不交叉的手势进行左右手分开标记;
2.2)按照3:1的比例将步骤2.1)标记后的手势图像分为训练集和测试集;
2.3)将训练集和测试集输入Mobilenet-SSD目标检测模型中,训练得到手势检测模型;
2.4)利用步骤2.3)的手势检测模型对所有的手势视频帧图像进行手势检测,得到对目标手势进行标注框标注的视频帧图像,根据视频帧图像中标注框的位置对目标手势进行分割,从而得到视频帧图像的手势分割图像;
2.5)将所有手势分割图像保存在文件夹中,对于无交叉手势的视频帧图像,去除左手手势分割图像,右手手势分割图像作为视频帧图像的手势分割图像。
所述的步骤3)具体为:
3.1)下载Keras下的VGG-16训练模型;
3.2)将手势分割图像输入VGG-16训练模型中,手势分割图像的原始特征分别经VGG-16训练模型的输入层、卷积层、池化层训练后输出转化为手势分割图像的抽象特征,选择VGG-16中的block2-pool层作为输出层;
所述block2-pool层为VGG-16训练模型的中间层,即为VGG-16训练模型第二个池化层;
手势分割图像输入VGG-16训练模型中维度为224×224×3的输入层,经过两层相同的卷积层和一层池化层,再经过两层相同的卷积层和一层池化层,让宽和高越来越小,通道数逐渐增加,最后选择block2-pool层作为输出层来获取手势分割图像的抽象特征。其中,卷积层中卷积filter为3×3,步长为1,filter数为64。
抽象特征的维度为56*56*128。
所述的步骤4)具体为:
4.1)对手势分割图像的抽象特征进行空间梯度计算:利用opencv工具中Sobel算子对抽象特征矩阵进行水平方向和竖直方向的梯度计算,将矩阵中水平方向和竖直方向获得的梯度值进行权重计算,得到手势分割图像所有通道最终的空间梯度值;
其中,所述权重计算中的权重设为0.5;
4.2)将手势分割图像上所有通道最终的空间梯度值保存在一维数组Ⅰ中,统计不同空间梯度值出现的个数,绘制不同梯度值对应个数的直方图。
所述的步骤5)具体为:
5.1)将每帧手势分割图像一维数组Ⅰ中数值为0的梯度值删除,将剩余梯度值中相同的梯度值出现的个数以及对应的梯度值所组成的键值对保存在一维数组Ⅱ中,将相邻两帧手势分割图像的一维数组Ⅱ进行差值计算,将得到的差值保存在新建数组中,根据新建数组绘制相应的折线图,观察波动情况;
5.2)根据所有折线图的波动情况,设定相应的阈值key,将大于阈值key的折线图所对应的两帧手势分割图像中的后一帧图像判定为关键视频帧图像,即为关键帧。
本发明的有益效果:
1)本发明采用Mobilenet-SSD目标检测模型完成目标手势的检测,不仅克服了背景区域的影响,而且降低了计算的复杂度,提高了关键帧判定的精准度,为后续的手势视频关键帧提取奠定了坚实的基础。
2)本发明采取VGG-16网络模型自动提取图片的抽象复杂特征,不仅使得图片的表达能力大大增强,而且减小了模型的复杂度,降低了参数量。
3)本发明利用手部区域的抽象特征进行空间梯度的计算,根据相邻图片的梯度差设定合适的阈值来进行关键帧的有效判定,实现手势视频关键帧的准确提取,保证了手势视频关键帧提取的完整性;解决了手势关键帧冗余的问题,且该关键帧提取方法具有较好的鲁棒性。
附图说明
图1为本发明方法的流程图。
图2为本发明方法所用到的部分数据集;(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)分别为部分手势视频帧图像。
图3为本发明实施例的SSD网络结构图。
图4为本发明实施例的手势目标标注结果图;(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)分别为部分手势目标标注后的结果图。
图5为本发明实施例的分割出的手势结果图;(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)分别为部分手势分割图像。
图6为本发明实施例的梯度直方图;(a)(b)分别为两个不同的手势分割图像对应的梯度直方图。
图7为本发明实施例的相邻两帧图像的差值图;(a)(b)分别为两张不同的差值图。
图8为本发明实施例的提取最终结果图;(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)(q)(r)(s)(t)(u)(v)(w)(x)为实施例中关键帧提取的部分结果图
具体实施方式
下面结合附图和实施例对本发明作进一步说明。
本发明主要针对手势视频中的关键帧提取情况,由于本发明的识别对象为自定义的手势动作,所以具体实施中自建了动态手势视频数据库,具体实施中所用到的部分数据集如图2所示,该图表示其中一个手势视频转换成的部分手势视频帧图像,将图像保存成.jpg格式,最后的图片大小为1280×720。
如图1所示,本发明方法先将手势视频转换为手势视频帧图像,通过Mobilenet-SSD目标检测模型检测出手势目标区域,对标注出的手势目标框进行分割,获取手部图像。通过VGG-16模型提取手部区域的抽象特征,并对提取出的抽象特征进行空间梯度的计算,统计各个梯度值出现的次数,去除值为0的梯度并计算相邻的两帧图像间各个梯度值出现的次数差,将得到的数据进行可视化,观察数据波动情况,通过设定合适的阈值来进行关键帧的判定。
本发明实施例如下:
步骤1:采用Opencv中的VideoCapture函数读入手势视频,并将读入的视频转换成手势视频帧图像,部分手势视频帧图像如图2所示。
步骤2:采用如图3所示的Mobilenet-SSD目标检测模型训练得到手势检测模型,利用手势检测模型对所有手势视频帧图像中的手势进行检测,为了消除背景区域噪声,根据检测出的目标框将手部区域分割出来,得到对应的手势分割图像。
2.1)编译protobuf,完成Tensorflow object detection API的模型训练与配置;
2.2)利用Labellmg标注工具对手势视频帧图像中300张手势进行标记,并按照3:1的比例分为训练集和测试集,为了确保检测的准确性,对左右手不交叉的手势进行左右手分开标记;
2.3)将标记好的手势视频帧图像生成的xml文件转换为csv文件,并将生成的csv文件转换为tfrecord格式,将需要的数据保存在工程文件夹data下;
2.4)在工程文件夹data目录下创建标签分类的配置文件(sign.pbtxt),这里只有手势一个类别,所以只需创建一个;
2.5)配置相应的管道文件ssd_mobilenet_v1_coco.config,在该文件中修改类别数、文件路径、以及网络参数;
2.6)标记后的手势图像输入Mobilenet-SSD目标检测模型中进行训练,并导出相应的手势检测模型;
2.7)利用训练后的手势检测模型对所有手势视频帧图像进行手势区域的检测,检测结果如图4所示,根据如图4目标框的坐标位置将手部区域分割出来,生成相应的如图5所示的手势分割图像,为了避免了背景区域的影响,对于无交叉手势的视频帧图像,去除左手手势分割图像。
步骤3:利用表1中VGG-16网络模型中的网络层提取手部区域的抽象特征,选择block2-pool层作为输出层来获取手势分割图像的抽象特征。
表1为步骤3用到的VGG-16网络模型中的网络层。
Layer(type) |
Output Shape |
Param |
Input_1(InputLayer) |
(None,224,224,3) |
0 |
block1_conv1(Conv2D) |
(None,224,224,64) |
1792 |
block1_conv2(Conv2D) |
(None,224,224,64) |
36928 |
block1_pool(MaxPooling2D) |
(None,112,112,64) |
0 |
block2_conv1(Conv2D) |
(None,112,112,128) |
73856 |
block2_conv2(Conv2D) |
(None,112,112,128) |
147584 |
block2_pool(MaxPooling2D) |
(None,56,56,128) |
0 |
3.1)从Keras的API下载训练好的VGG-16网络模型,在提取特征时,直接使用训练好的权重。手势分割图像输入VGG-16训练模型中维度为224×224×3的输入层,经过两层相同的卷积层和一层池化层,再经过两层相同的卷积层和一层池化层,让宽和高越来越小,通道数逐渐增加,最后选择block2-pool层作为输出层来获取手势分割图像的抽象特征。其中,卷积层中卷积filter为3×3,步长为1,filter数为64;
3.2)载入要获取的手势分割图像,将图片标准化统一的大小224×224,将图像转为数组形式并除以255,保证图片的精度;
3.3)利用VGG-16网络模型下的Process_input函数对数组进行预处理;
3.4)提取经过block2-pool层的手势分割图像的特征值,即为手势分割图像的抽象特征。
步骤4:对手势分割图像的抽象特征进行空间梯度计算并绘制不同帧手势分割图像的梯度直方图。
4.1)对手势分割图像的抽象特征进行空间梯度计算:利用opencv工具中Sobel算子对抽象特征矩阵进行水平方向和竖直方向的梯度计算,将矩阵中水平方向和竖直方向获得的梯度值进行权重计算,得到手势分割图像的最终空间梯度值;其中,所述权重计算中的权重设为0.5;
4.2)利用cv2.convertScalerAbs()函数将水平方向和竖直方向上的梯度值转换为绝对值的形式;使用cv2.addWeighted函数将水平方向和竖直方向上的sobel算子的结果结合;
4.3)统计手势分割图像上不同空间梯度值出现的个数,绘制不同梯度值对应个数的直方图,绘制出的梯度直方图如图6所示。
步骤5:根据相邻两帧手势分割图像的梯度值差异,绘制如图8所示的差值折线图,通过差值折线图的波动情况设定相应阈值,根据阈值完成关键帧的判定。
5.1)利用python中的counter函数统计每帧手势分割图像中各个梯度值出现的次数,由于图片的不同,所以图片所对应的梯度值也不同,对梯度值从0-100进行遍历,如果梯度值不在该范围内,就将梯度值设为0;
5.2)如图6(a)和图6(b)所示,不同手势分割图像梯度值为0出现的次数相差较大;去除梯度值为0的点,消除图片间梯度值的差异;
5.3)设定一个一维数组dist_list[],对所有图片帧序列进行遍历,将每张图片对应的梯度值以及该梯度值出现的次数所组成的键值对存入到该数组中,对一维数组dist_list[]进行外层循环、梯度值从0到100进行内层循环后得到相邻两帧图片的梯度以及该梯度出现的次数差值,建立数组two_image_diff[]用于存放次数差值;
5.4)利用matplotlib库中的pyplot模块对数组two_image_diff[]进行折线图的绘制,观察折线图的波动情况,当相邻两帧的波动差异较小时,就不判定为出现关键帧,如图7(a);而波动差异较大时,则就判定为出现关键帧,如图7(b)。这里设置阈值为100,对数组two_image_diff[]进行遍历,当出现某个梯度值对应的键值大于100时,就判定该相邻两帧图片中的后一张为关键帧。本实施例中判定出的部分关键帧如图8所示。
上述具体实施方式用来解释说明本发明,而不是对本发明进行限制,在本发明的精神和权利要求的保护范围内,对本发明做出的任何修改和改变,都落入本发明的保护范围。