手部关键点、手势识别方案

手部关键点、手势识别方案

项目实训负责的一个游戏模块,考虑使用手势识别来作为控制输入。因为是游戏,考虑到时延,识别模块肯定需要部署在前端(web端,手机客户端,小程序端)之类的。目前项目前端暂定为小程序。

现成的方案有:

  • 各个云服务器厂商提供的识别模块网络接口
  • 自己训练并在服务端部署大的模型
  • 在移动端部署

大概体现也就是直接训练个分类模型,或者先输出手部关键点。

没有在移动端部署模型的经验,初步考虑使用tensorflow.js部署。这里模型网络传输消耗的时间、框架传输消耗、初始化时间是个非常值得考虑的问题,这里的网络资源消耗不能无视。(所以类似依赖cdn导入的就比较不好处理)

这里有个现成的解决方案,google的mediapipe,它集成了诸多深度学习的解决方案,包括人体姿态,手部关键点,脸部mesh等。可以参考它在python端的使用。使用它的手部关键点检测,不考虑它的视频输入时的跟踪,考虑图片输入。

https://github.com/google/mediapipe

以python调用为例:

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
        static_image_mode=True,
        max_num_hands=2,
        min_detection_confidence=0.75,
        min_tracking_confidence=0.5)

使用opencv调用摄像头拍摄,使用hands模块的识别,返回的res.multi_hand_landmarks包含手部的21个关键点的三维坐标(x, y, z),对于在屏幕上绘制只需要x,y轴坐标即可,z是相对深度。
手部关键点、手势识别方案_第1张图片
这里的模块输出的是21个点坐标,但具体到各种手势,还需要简单处理下。
手部关键点、手势识别方案_第2张图片

以简单的抓握为例,基于上述模块,可以训练一个小分类模型判断。输入是21个点的三维坐标,输出分类,每个分类采集几千个样本就够了,几分钟就能采集分类完。

数据集的采集就很方便了,录入时注意下按分类分批录入保存下来坐标就可以了。

 dense (Dense)               (None, 42)                1806      
                                                                 
 dense_1 (Dense)             (None, 15)                645       
                                                                 
 dense_2 (Dense)             (None, 2)                 16    

差不多这样的一个简单模型就能到95以上的精度。。。

后面具体在移动端部署,大概也是这种关键点+手势判断的方案,关键点用来辅助动画之类的,分类模型用来判断各种事件。具体看开发时的需求,(目前小程序前端的方向感觉不是很清晰)。

这样的方案还是不够的,目前能想到的有几个点:

  • 具体到连续输入,需要有个跟踪模块来应对多个手,或者各种特判
  • 关键点位输出是不稳定的,会有振动,需要设计某种神奇的滤波
  • 背手、握拳的识别很不好,检出率低,具体是通过重新准备模型,或者使用某种神奇的后处理待定

另外,主要任务还是开发,需要设计好的用户界面。

还是以抓握为例

  • 简单的,比如使用两张图片(握拳,张开手)来表示
  • 复杂点,看有没有可能有个live2d的模型,训练多个抓握状态的判断,来匹配多个live2d模型的动作,不过未必有现场的live2d的手部模型
  • 再复杂点,现在的手部关键点其实是三维输出的,完全可以在前端准备个3d的手部模型,不过具体前端怎么显示渲染3d模型还不清楚22
  • 不然直接手动画一个火柴手。。。

具体实现还是要等,看具体开发时什么需求。

你可能感兴趣的:(计算机视觉,深度学习,神经网络)