基于手势(哑语)识别的翻译系统

时隔两个月,毕业答辩结束了。毕设跟论文也顺利完成,也该写一下后续了。
前一篇文章写了手势识别系统的前期处理,即通过调用笔记本摄像头获取视频流,然后截取视频流中的指定位置图像做进一步的图像预处理。
这篇文章主要做的工作内容是获取手势特征并建立手势特征库建立手势数据集利用svm建立并训练手势模型
一、获取手势特征并建立手势特征库
在本实验中,采用方向梯度直方图的HOG特征提取的方法。
1、具体的实现方法
首先,将目标图像分割成小的连通区域,将之称为单元。之后采集单元中每个像素的梯度方向直方图。最后,将这些直方图结合起来形成一个特征描述符。我们还可以在更大的图像范围对这些局部直方图进行对比度归一化(contrast normalized)来提高性能,即先计算每个直方图中该块的密度,然后根据该密度对该块中的每个单元进行归一化。在这种归一化之后,对于光照变化和阴影可以获得更好的结果。
2、实现过程
Hog特征提取算法的实现过程:
(1)灰度化;
(2)标准化输入图像的颜色空间;
(3)计算图像的像素梯度;
(4)将图像网格化;
(5)统计网格单元的梯度直方图形成每个网格单元的描述子;
(6)将几个网格单元组合成一个稍微大一点的块,然后将块中所有单元的特征描述子连接起来,得到该块的hog特征描述子;
(7)将所有块的描述子连接起来得到图像最终的特征描述子。
由于opencv库提供hog特征函数cv.HOGDescriptor(),我们可以直接调用。

hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nBin)

参考文献:
OpenCV:使用python-cv2+Hog特征+SVM实现狮子识别HOG特征 至此我们就通过调用opencv库提供hog特征函数cv.HOGDescriptor()得到手势特征库。
二、建立手势数据库
一般我们训练模型的时候都是从网上下载公开的数据集,但是本实验所需要的数据集并没有现成公开的,所有只能自己动手制作数据集。制作数据的大致流程如下:(假设待分类一共有n类)

  • 新建一个文件夹,在该文件夹下新建n个文件夹train_1-train_n和n个对应的txt文件train_1.txt-train_n.txt。
  • 用手机拍摄相应分类的图片m张,将图片上下左右旋转以扩充数据集。 将相应分类的图片放入到已经建好的分类文件夹中
  • 使用如下代码:将每个子文件夹的内容(图像的名字)和标签写入到txt文件中。
#   制作数据集
import os
directory = "D:\\database\\negative_examples"
f = open('D:\\database\\negative_examples.txt', 'w')
files = os.listdir(directory)
for file in files:
    f.writelines(file+"     "+'-1')
    f.write('\n')
f.close()

程序执行结果如下:

手势识别java实现 手势识别项目_机器学习


手势识别java实现 手势识别项目_计算机视觉_02

  • 将所有的train_n.txt文件复制到一个总的txt文件命名为train.txt。这个文件包含了所有训练图片的名字和对应的标签。并将train_n文件夹复制到文件夹train中。
    以上步骤完成以后,就完成数据集的建立。
    三、模型训练
    1、训练方法
    本实验模型选择为SVM支持向量机,支持向量机是一种广义线性分类器,它通过监督学习的方法对数据进行二值分类的划分,它的最大裕度超平面是当决策边界为时求解学习样本的最大裕度超平面。对于非线性分类,支持向量机可以采用核方法进行分类。
    由于本实验数据属于非线性数据,故主要介绍非线性数据分类方法–核函数。那么,对于线性不可分的数据,支持向量机第一步先进行低维空间的计算,再将输入空间通过核函数映射到高维特征空间,最后构造出最优分离超平面,这样就能够消除数据在平面上未分化的分化平面,即线性数据分离。如图6-1所示,一组数据不能在二维空间中分割,因此映射到三维空间:

    因为当非线性数据被映射到一个新的高维空间时,数据的维数会呈指数增长。此时,数据的计算将非常困难,当它遇到无限维时,就没有办法进行计算。这时,就需要内核函数内核。其原因是在原始低维空间中直接计算内核,不需要显示映射结果。
    常用的核函数有:
  • LINEAR线性核函数(linear kernel)
  • POLY多项式核函数(ploynomial kernel)
  • RBF高斯核函数(radical basis function)
    2、训练过程
    本实验研究采用RBF高斯核函数的SVM支持向量机对上一步基于Hog特征提取的特征向量进行训练。
algo = SVC(kernel='rbf', C=1.0, gamma=0.001)
algo.fit(x_train, y_train)

采用RBF高斯核函数的SVM支持向量机训练效果以及测试样本预测结果如下图:

手势识别java实现 手势识别项目_手势识别java实现_03


四、系统测试

基于以上准备和处理工作,现在调用已经训练好的模型,进行系统测试,并将预测结果显示在屏幕上,系统测试结果如下图:

手势识别java实现 手势识别项目_计算机视觉_04


五、总结

在近些年以来,科学技术快速发展,人工智能领域快速升温,图像处理领域的手势识别在以后将成为火热的研究方向。本文以python+JetBrains PyCharm 2018.1.4 x64和计算机视觉库opencv为开发平台,实验的大致过程为:通过调用笔记本电脑的前置单摄像头获取视频流,然后对视频图像进行区域截取、镜像等操作,再对上一步截取的区域视频图像进行图像预处理操作,即通过利用基于YCrCb颜色空间的Cr分量+Otsu法阈值分割算法进行肤色分割、中值模糊处理去除图像中的噪音,然后形态学处理增强图像、边缘检测获取图像特征和目标图像轮廓、基于Hog特征提取算法得到特征向量,最终采用RBF高斯核函数的SVM支持向量机在自己制作的数据上训练模型并对待测目标手势进行预测。