博客专栏

EEPW首页>博客> 手势识别实践 | DIY应用到剪刀石头布机器人(附代码)

手势识别实践 | DIY应用到剪刀石头布机器人(附代码)

发布人:CV研究院 时间:2020-10-27 来源:工程师 发布文章

1. 背景

回家看到小外甥存了很多零用钱,作为舅舅,最近手头有点紧。于是经过几天的筹划,决定制作一个剪刀石头布机器人,向小外甥挑战。以小外甥好胜的性格,一定会欣然应答。然后凭借神经网络出色的性能,赢光他的零花钱不是问题。。。嘿嘿,想想还有点美呢。

上面这个是做好的成品,效果不错,小外甥被忽悠的一愣一愣,轻松拿下他的存钱罐。

2. 原理介绍

主要就是一个图像分类的神经网络。通过摄像头,判断小外甥出拳一瞬间的手型,然后根据规则显示克制他的手型即可。例如摄像头检测到小外甥出了剪刀,那么机器人就出一个布,只要模型训练的好,妥妥的百战****。

——数据收集——

用过深度学习的人都知道,这货需要训练数据,而且越多越好,各种背景,光照,远近最好都能撸一些图片,这样模型的鲁棒性就会很好。我编写了一个python代码,配合opencv调用摄像头来获取手势图片。将剪刀的标签设为0,石头的标签设为1,布的标签设为2,每种采集1000张图片左右。如下图所示:

1603772345163375.png

剪刀(0)对应的数据

1603772368939277.png

石头(1)对应的数据

1603772393119183.png

布(2)对应的数据

此时我们已经收集好了需要训练的数据,那么下一步就是设计网络了。

——网络设计——

由于只需要判断三种手势,所以一个分类网络就足够了,考虑到电脑的CPU能力有限,为了实现实时的检测,需要一个轻量级的分类网络。开源的mobilent系列,shufflenet系列,efficeentlite等都是很好的选择。这里我选择了shufflenetV2版本。通过实际测试,这个网络的效果最好。shufflenetv2的结构图如下图所示:

1603772420817960.png

shufflenetv2提供了一个通道系数来平衡速度和精度。如上面表格中的0.5X,1X,1.5X,2X所示。这里我选择使用0.5X的通道系数,参数量只有1.4M,计算量只有41M,在笔记本的CPU上面足够实现实时的检测。

下图a展示了基本ResNet轻量级结构,这是一个包含3层的残差单元:首先是1x1卷积,然后是3x3的depthwise convolution(DWConv,主要是为了降低计算量),这里的3x3卷积是瓶颈层(bottleneck),紧接着是1x1卷积,最后是一个短路连接,将输入直接加到输出上。

下图b展示了改进思路:将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。值得注意的是3x3卷积后面没有增加channel shuffle,按paper的意思,对于这样一个残差单元,一个channel shuffle操作是足够了。还有就是3x3的depthwise convolution之后没有使用ReLU激活函数。

下图c展示了其他改进,对原输入采用stride=2的3x3 avg pool,在depthwise convolution卷积处取stride=2保证两个通路shape相同,然后将得到特征图与输出进行连接(concat,借鉴了DenseNet?),而不是相加。极致的降低计算量与参数大小。

1603772445419659.png

——网络训练——

训练选择使用pytorch框架,因为pytorch基于动态图机制,调试简单,而且训练速度也比较快,在我的笔记本上面,训练了半个小时,就能达到0.99的top1精度。下图是训练的loss和top1曲线图。

1603772469725169.png

——模型部署——

其实直接使用pytorch进行推理也是可以的,知识pytorch的推理速度一般,因为网络没有做优化(量化以及层的融合),所以这里采用一种更为普遍的方式进行推理。转换成ncnn模型,使用腾讯开源的ncnn库进行推理。ncnn库的官方地址为:https://github.com/Tencent/ncnn

1603772495470003.png

腾讯优图ncnn是腾讯社交网络事业群公布的首个AI开源项目,也是腾讯优图实验室第一次对外公开深度学习的研究成果。ncnn于2017年7月正式开源,作为一个为手机端极致优化的高性能神经网络前向计算框架,在设计之初便将手机端的特殊场景融入核心理念,是业界首个为移动端优化的开源神经网络推断库。ncnn无第三方依赖,跨平台,在手机端cpu运算速度在开源框架中处于领先水平。基于该平台,开发者能够轻松将深度学习算法移植到手机端,输出高效的执行,进而产出人工智能APP,将AI技术带到用户指尖。

1603772518920169.png

不同框架间的模型转换是目前AI项目应用落地的一大痛点。ONNX是Facebook主推的开放文件格式,pytorch/caffe2原生支持。作为目前已知同类框架中CPU运算最快的ncnn,不仅具有最小的安装包体积,还拥有最佳的跨平台兼容性。在ncnn支持ONNX格式转换后,pytorch/caffe2训练的模型便能通过平台轻松部署到手机端。与此同时,ncnn也能借助ONNX良好的项目生态,对众多框架和运行库的高兼容性,以及结构定义清晰的ONNX格式,进一步降低各框架间的转换成本,促进AI移动端生态的创新和部署。

据统计,目前Googleplay商店已有QQ、微信、微视、京东、支付宝、爱奇艺、美颜相机、快手短视频、LIKE短视频、玩美彩妆等超过30款APP,选用ncnn作为手机CNN推断库,实现包括人脸检测跟踪、人脸配准、人脸识别、人体检测跟踪、人体姿态估计、图像分类、图像美化、目标分割、风格画生成、物体检测、文本检测和识别等AI场景应用。

9.jpg

京东APP使用ncnn

1603772559233887.jpg

支付宝APP使用ncnn

腾讯一直以来秉承“开放”战略,不断推动技术研发向共享、复用和开源迈进。截至目前,腾讯正式发布的开源项目共计58个。今年3月,凭借在AI开源领域卓越的技术影响,腾讯受邀成为LF深度学习基金会初始白金会员,与基金会共同维护、支持和推动人工智能领域的技术开源和革新。

腾讯优图ncnn(https://github.com/Tencent/ncnn)作为腾讯代表性的AI开源项目之一,将持续为人工智能发展助力,促进深度学习研究成果的落地应用。

转入正题:

将ncnn模型封装成一个动态库,这样可以使用python直接调用。然后结合pyqt,opencv来实现最终的剪刀石头布机器人。opencv负责读取摄像头并解码,ncnn库负责对解码后的摄像头画面进行图像分类,然后根据分类结果,找到克制手势,例如检测到“剪刀”,就出“石头”,然后将图像展示在pyqt上面。

/End.

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。



关键词:

相关推荐

技术专区

关闭