当前位置: 首页 > 后端技术 > Java

手语也能机器翻译了!机器学习手势识别功能了解一下

时间:2023-04-01 22:51:18 Java

手语也可以机器翻译!了解更多机器学习手势识别功能手部关键点识别服务可以识别手部的21个关键点,通过比较每个手指的方向与手语规则,找到手语字母表。应用场景手语通常由有听力和口语障碍的人使用,是手势的集合,包括日常交互中使用的动作和手势。使用MLKit,您可以构建智能手语字母表识别器,它可以像助手一样将手势翻译成单词或句子,将单词或句子翻译成手势。这里尝试的美国手语手势字母表是根据关节、手指和手腕的位置分类的。接下来,我将尝试从手势中收集“HELLO”这个词。开发步骤1.开发准备详细准备步骤请参考华为开发者联盟。以下是关键的开发步骤。1.1启动MLKit在HuaweiDeveloperAppGalleryConnect中,选择Develop>ManageAPIs。确保机器学习套件已激活。1.2在项目级配置Maven仓库地址gradlebuildscript{repositories{...maven{url'https://developer.huawei.com/repo/'}}}dependencies{...classpath'com.huawei.agconnect:agcp:1.3.1.301'}allprojects{repositories{...maven{url'https://developer.huawei.com/repo/'}}}1.3集成SDK后,添加配置应用插件:'com.android到文件头.application'applyplugin:'com.huawei.agconnect'dependencies{//导入基础SDK。implementation'com.huawei.hms:ml-computer-vision-handkeypoint:2.0.2.300'//导入手部关键点检测模型package.implementation'com.huawei.hms:ml-computer-vision-handkeypoint-model:2.0.2.300'}1.4在AndroidManifest.xml文件中添加如下语句1.5申请相机权限和本地文件读取权限2.代码开发2.1CreateaSurfaceViewforcamerapreview,createaSurfaceViewforresults。目前我们只在UI中显示结果,您也可以使用TTS来识别扩展并读取结果。mSurfaceHolderCamera.addCallback(surfaceHolderCallback)privatevalsurfaceHolderCallback=object:SurfaceHolder.Callback{overridefunsurfaceCreated(holder:SurfaceHolder){createAnalyzer()}overridefunsurfaceChanged(holder:SurfaceHolder,format:Int,width:Int,height:Int){prepareLensEngine(width,height)mLensEngine.run(holder)}overridefunsurfaceDestroyed(holder:SurfaceHolder){mLensEngine.release()}}2.2创意手部关键分析器//CreatesMLKeyPointAnalyzerwithMLHandKeypointAnalyzerSetting.valsettings=MLHandKeypointAnalyzerSetting.Fact().setSceneType(MLHandKeypointAnalyzerSetting.TYPE_ALL).setMaxHandResults(2).create()//设置图像中可以检测到的手区域的最大数量。默认最多检测10个手部区域mAnalyzer=MLHandKeypointAnalyzerFacstory.getInstance().getHandKeypointAnalyzer(settings)mAnalyzer.setTransactor(mHandKeyPointTransactor)2.3开发者创建识别结果处理类“HandKeypointTransactor”。实现具体业务classHandKeyPointTransactor(surfaceHolder:SurfaceHolder?=null):MLAnalyzer.MLTransactor{overridefuntransactResult(result:MLAnalyzer.Result?){varfoundCharacter=findTheCharacterResult(result)if(foundCharacter.isNotEmpty()&&!foundCharacter.equals(lastCharacter)){lastCharacter=foundCharacterdisplayText.append(lastCharacter)}canvas.drawText(displayText.toString(),paddingleft,paddingRight,Paint().also{it.style=Paint.Style.FILLit.color=Color.YELLOW})}2.4创建LensEngineLensEnginelensEngine=newLensEngine.Creator(getApplicationContext(),analyzer)setLensType(LensEngine.BACK_LENS)applyDisplayDimension(width,height)//根据方向调整宽度和高度applyFps(5f)enableAutomaticFocus(true))create();2.5运行LensEngineprivatevalsurfaceHolderCallback=object:SurfaceHolder.Callback{//运行LensEengineinsurfaceChanged()overridefunsurfaceChanged(holder:SurfaceHolder,format:Int,width:Int,height:Int){createLensEngine(width,height)mLensEngine.run(holder)}}2.6停止分析器,释放检测资源funstopAnalyzer(){mAnalyzer.stop()}2.7处理transactResult()检测字符可以使用HandKeypointTransactor类中的transtresult方法获取检测结果,实现具体服务。除了手的每个关键点的坐标信息外,检测结果还包括手掌和每个关键点的Confidence值。可以根据置信度值过滤掉手掌和手部关键点识别错误。在实际应用中,可以根据误判容忍度灵活设置阈值。2.7.1寻找手指的方向首先假设可能手指的向量斜率分别在X轴和Y轴上。privateconstvalX_COORDINATE=0privateconstvalY_COORDINATE=1假设我们有手指在5个向量上,任何时候任何手指的方向都可以分类为上、下、下上、上下、不动。enumclassFingerDirection{VECTOR_UP,VECTOR_DOWN,VECTOR_UP_DOWN,VECTOR_DOWN_UP,VECTOR_UNDEFINED}enumclassFinger{THUMB,FIRST_FINGER,MIDDLE_FINGER,RING_FINGER,LITTLE_FINGER}先把结果中对应的关键点分离到不同手指的关键点数组中,像这样firstFinger=arrayListOf()varmiddleFinger=arrayListOf()varringFinger=arrayListOf()varlittleFinger=arrayListOf()varthumb=arrayListOf()手指上的每个键点对应的手指的关节,可以通过计算关节之间的距离和手指的平均位置值来计算斜率。根据附近关键点的坐标,查询关键点的坐标。取字母H的两个简单关键点:int[]datapointSampleH1={623,497,377,312,348,234,162,90,377,204,126,54,383,306,413,491,455,348,419,521};int[]datapointSampleH2={595,463,374,343,368,223,147,78,381,217,110,40,412,311,444,526,450,406,488,532};使用手指坐标的平均值来计算向量//ForForeFinger-623,497,377,312doubleavgFingerPosition=(datapoints[0].getX()+datapoints[1].getX()+datapoints[2].getX()+datapoints[3].getX())/4;//找到平均值并从xdoublediff=datapointSampleH1[position].getX()-avgFingerPosition的值中减去它directionintvector=(int)((diff*100)/avgFingerPosition);向量的结果会是正数或负数,如果是正数它会出现在X轴的正方向,如果它是相反的它是一个负值。通过这种方式,所有字母都是矢量映射的,一旦您拥有所有矢量,我们就可以使用它们进行编程。利用上面的向量方向,我们可以对向量进行分类,定义第一个为手指方向枚举[0].pointX>keyPoints[3].pointX&&keyPoints[0].pointX>keyPoints[2].pointX)返回FingerDirection.VECTOR_DOWNif(keyPoints[0].pointX>keyPoints[1].pointX&&keyPoints[3].pointX>keyPoints[2].pointX)返回FingerDirection.VECTOR_DOWN_UP如果(keyPoints[0].pointX{if(keyPoints[0].pointY>keyPoints[1].pointY&&a议员;keyPoints[2].pointY>keyPoints[1].pointY&&keyPoints[3].pointY>keyPoints[2].pointY)returnFingerDirection.VECTOR_UP_DOWNif(keyPoints[0].pointY>keyPoints[3].pointY&&keyPoints[0].pointY>keyPoints[2].pointY)返回FingerDirection.VECTOR_UP如果(keyPoints[0].pointY>访问华为机器学习服务官网获取华为机器学习服务开发指导文档华为HMSCore官方论坛华为机器学习开源仓库地址:GitHub、Gitee解决集成问题请到StackOverflow点击关注第一时间了解HMSCore的最新技术~