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

欢迎关注“

计算机视觉研究院

计算机视觉研究院专栏

作者:Edison_G

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

                

扫描二维码 关注我们

微信公众号 : 计算机视觉研究院

回复“手势识别”获取源码

知乎专栏:计算机视觉战队

本次所有代码都是“深度学习DIY”博主贡献,主要是手势识别应用到简单的机器人。有兴趣的同学可以关注获取源代码!

1. 背景

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

首先展示下最终的成果:

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

2. 原理介绍

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

——数据收集——

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

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

剪刀(0)对应的数据

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

石头(1)对应的数据

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

布(2)对应的数据

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

——网络设计——

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

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

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?),而不是相加。极致的降低计算量与参数大小。

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

——网络训练——

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

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

——模型部署——

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

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

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

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

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

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

手势识别实践 | DIY应用到剪刀石头布机器人(附代码)_第10张图片
京东APP使用ncnn

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

支付宝APP使用ncnn

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

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

转入正题:

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

/End.

我们开创“计算机视觉协会”知识星球一年有余,也得到很多同学的认可,我们定时会推送实践型内容与大家分享,在星球里的同学可以随时提问,随时提需求,我们都会及时给予回复及给出对应的答复。

如果想加入我们“计算机视觉研究院”,请扫二维码加入我们。我们会按照你的需求将你拉入对应的学习群!

计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!

计算机视觉研究院

长按扫描二维码关注我

回复“手势识别”获取源码

你可能感兴趣的:(计算机视觉,神经网络,人工智能,深度学习,编程语言)