1.手柄轨迹识别优化并轨迹识别中的神经网络(接8)
根据上一篇博客的讲解后,当我们用手柄移动某一特定轨迹后,就可以在本地得到一个二进制的txt文件。实例如下——采集一个圆形的手柄轨迹:
那么,其实,在完成对每一帧位置坐标的二进制存储后,在运行的时候,就会发现一个问题——我们再一次的手柄轨迹很难做到与我们存储的二进制文件中的数据完全相同,也就是说,在实际运行中,很难做到精准的识别出存储的图形。
为了解决这种问题,针对每一种图形,我们要多采集几种,再结合机器学习的方式。当在实际运行时,得到的二进制数据先跟存储的多个图形二进制数据进行比较,不要求它们完全相同,但要基本相似,这样就可以提高手柄轨迹识别时的匹配度和反馈情况。所以,需要用到神经网络。
在记录手势时,还有一些额外的事情需要考虑。
在Unity的控制器中就对可能识别出的图形进行分类,标注出可识别出的图形种类个数,以及它们的每一个的名字,这样就能做到对不同识别轨迹图形的分类存储。
与您的头部相比,手势识别器知道手势的位置,方向
例如,头部左侧画的线与右侧画的线不同。画在你面前的直线与抬头时画在你面前的直线不同。手势的开始和结束很重要
例如,如果想要神经网络将顺时针和逆时针绘制的圆圈分类,则需要将它们等分为两种类型的示例。所以,在同一个称为“圆圈”的手势中,记录50次顺时针旋转和50次逆时针旋转。使用具有相似名称的多个手势来解决复杂的形状
对于某些形状,绘制它们的可能方式会变得非常复杂,从而使得出现错误的几率要高得多。可以通过记录具有相同名称的多个手势来避免这种情况,例如,顺时针圆,逆时针圆等等。但是代码以相同的方式对所有这些手势作出反应。- 确保每个手势的记录数量大致相同
例如,如果有100个圈子的记录,请确保要检测的所有其他手势的记录大概有100个。它不一定要完全一样,只要记住神经网络可以更容易地识别手势(所以如果你有100个圈子的数据,确保有大约100个你想要检测的所有其他手势的录音) 有更多的例子,所以增加特定手势被检测到的机会记录更多的例子。
神经网络:
人工神经网络是由大量处理单元互联组成的非线性、自适应信息处理系统。它是在现代神经科学研究成果的基础上提出的,试图通过模拟大脑神经网络处理、记忆信息的方式进行信息处理。人工神经网络具有四个基本特征:
- 非线性
具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量。 - 非局限性
一个神经网络通常由多个神经元广泛连接而成。一个系统的整体行为不仅取决于单个神经元的特征,而且可能主要由单元之间的相互作用、相互连接所决定。 - 非常定性
人工神经网络具有自适应、自组织、自学习能力。神经网络不但处理的信息可以有各种变化,而且在处理信息的同时,非线性动力系统本身也在不断变化。经常采用迭代过程描写动力系统的演化过程。 - 非凸性
在一定条件下将取决于某个特定的状态函数。例如能量函数,它的极值相应于系统比较稳定的状态。非凸性是指这种函数有多个极值,故系统具有多个较稳定的平衡态,这将导致系统演化的多样性。
网络中处理单元的类型分为三类:输入单元、输出单元和隐单元。输入单元接受外部世界的信号与数据;输出单元实现系统处理结果的输出;隐单元是处在输入和输出单元之间,不能由系统外部观察的单元。神经元间的连接权值反映了单元间的连接强度,信息的表示和处理体现在网络处理单元的连接关系中。人工神经网络是一种非程序化、适应性、大脑风格的信息处理 ,其本质是通过网络的变换和动力学行为得到一种并行分布式的信息处理功能,并在不同程度和层次上模仿人脑神经系统的信息处理功能。
项目中关于启动神经网络的代码
public class GestureEventExample : MonoBehaviour
{
//订阅事件
void OnEnable()
{
GestureRecognizer.GestureDetectedEvent + = OnGestureDetected;
GestureRecognizer.GestureRejectedEvent + = OnGestureRejected;
}
//取消订阅事件
void OnDisable()
{
GestureRecognizer.GestureDetectedEvent - = OnGestureDetected;
GestureRecognizer.GestureRejectedEvent - = OnGestureRejected;
}
//在检测到手势时调用
void OnGestureDetected(string gestureName, double confidence, Handedness hand, bool isDouble = false)
{
switch (gestureName)
{
case "Circle":
{
// DO SOMETHING REACTIN TO CIRCLE GESTURE
}
break;
case "Triangle":
{
// DO SOMETHING REACTING TO TRIANGLE GESTURE
}
break;
}
}
void OnGestureRejected(string error,string gestureName,double confidence)
{
}
}
2.unity读取Excel文件
因为语音识别要预设一些字符来匹配,并进行相应的操作,但是又不想在代码里罗列,于是就想用Excel来进行管理,并通过Unity来批导入,一个foreach就能把数据读到我们要维护的数据结构里。
首先要加入库文件 Excel.dll 和ICSharpCode.SharpZipLib库文件,链接 http://exceldatareader.codeplex.com/
using Excel; using System.Data; public class ExcelAccess { public static string ExcelName = "Book.xlsx"; public static string[] SheetNames = { "sheet1", "sheet2", "sheet3", "sheet4" }; public static List<Menu> SelectMenuTable(int tableId) { DataRowCollection collect = ExcelAccess.ReadExcel(SheetNames[tableId - 1]); List<Menu> menuArray = new List<Menu>(); for (int i = 1; i < collect.Count; i++) { if (collect[i][1].ToString() == "") continue; Menu menu = new Menu(); menu.m_Id = collect[i][0].ToString(); menu.m_level = collect[i][1].ToString(); menu.m_parentId = collect[i][2].ToString(); menu.m_name = collect[i][3].ToString(); menuArray.Add(menu); } return menuArray; } /// <summary> /// 读取 Excel 需要添加 Excel; System.Data; /// </summary> /// <param name="sheet"></param> /// <returns></returns> static DataRowCollection ReadExcel(string sheet) { FileStream stream = File.Open(FilePath(ExcelName), FileMode.Open, FileAccess.Read, FileShare.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = excelReader.AsDataSet(); //int columns = result.Tables[0].Columns.Count; //int rows = result.Tables[0].Rows.Count; return result.Tables[sheet].Rows; } }