首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

设计师的AI自学之路

某日工作室学妹问我,看视频学人工智能好枯燥,有没有实际项目可以实践下?

正巧室友刚做了一个识别剪刀石头布的图像识别程序

于是脑洞大开

改造了一下,做了这个识别结印手势来发动忍术的小游戏。

演示视频:

这里我就把项目整理成教程,让大家都能做脑洞大开的创作。

感谢室友陆玄青提供的简单图像识别源码

https://github.com/LuXuanqing/tutorial-image-recognition

改造后的识别手势玩火影忍者忍术源码在这里:

https://github.com/Arthurzhangsheng/NARUTO_game

本项目不要求有人工智能基础,但要有python基础

需要的环境

tensorflow1.1

keras

opencv

python3

ffmpeg

PIL

pathlib

shutil

imageio

numpy

pygame

一个摄像头

整体流程

下载源码后,用jupyternotebook打开tutorial.ipynb文件,按照里面的教程,一步一步运行,全部运行过后,就得到训练好的能识别手势的神经网络模型文件

运行model文件夹下的predict.py,即可开始试玩

注意事项

我用的vscode编辑器,把当前工作路径设置为 NARUTO_game 这个主文件夹,并以此设置相关的相对路径,若直接cd到model文件夹来运行predict.py文件,需要手动调整源码中的相对路径

其实教程具体操作已经全部写在tutorial.ipynb里了,为让大家更直观了解整个操作过程,这里就把tutorial.ipynb里的文字复制搬运到这里来。

Step1 - 采集数据

用手机拍摄视频记录你想要识别的物体。每段视频中只能包含一种物体,时长10~30秒,每个物体可以拍摄多段视频。视频尽量用4:3或1:1的长宽比,分辨率低越好(注意是低)。

进入data/video文件夹,为每种物体(手势)新建一个文件夹,然后把相应的视频导入进去。例如我拍摄了5段关于猫的视频和3段关于狗的视频,就在data/video文件夹下新建dog、cat两个文件夹,然后把把猫的视频全部放进cat文件夹,把狗的视频全部放进dog文件夹,视频的文件名无所谓。

识别结印手势的话我分了14类,12个结印为一类,空白动作为1类,还增加了一个取消动作(虽然这次并没有用到),一共14类。视频文件太大我就没传到github源码上了,大家可以自己用电脑摄像头录一下。

Step2 - 数据处理

在这一步,我们需要把视频转成图片,然后按照60%、20%、20%的比例拆分成训练集(training set)、验证集(validation set)、和测试集(test set)。

为了节省大家时间,我事先已经写好了相关的代码(utils.py),大家只要按照提示进行调用即可完成这一步骤。

Step3 - 数据增强

把一张原始图片经过拉伸、旋转、斜切、反转等操作,可以生产若干新的不同的图片,用以扩充训练集数据量,有助于提高模型的预测准确性

Step4 - 搭建卷积神经网络¶

在这一步我们要搭建神经网络的架构。

图像识别的常见方法是通过卷积操作提取图片中的特征,然后将特征输入到神经网络中,最后神经网络输出结果。所以在这一阶段,我们要分别准备卷积和神经网络两个部分

4.1 - 卷积部分

迁移学习(transfer learning)

对图像进行卷积操作需要耗费大量计算资源,并且训练需要巨大的数据量,一般个人是搞不定这事的。

好消息是人们发现了一个有趣的现象:训练出来用于识别A物体的卷积神经网络,它的卷积部分也能够很好地被用于识别B物体。

所以我们可以把人家已经训练好的NB的卷积神经网络借来用,这就是迁移学习。

载入VGG16

VGG16是一个非常经典的卷积神经网络,16代表有16个层,前13层是卷积层,后3层是全连阶层。我们需要使用它的前13个卷积层,并且使用这些层的权值,用来从图像中提取特征。然后把提取后的特征输入到我们自己的神经网络中进行识别。

4.2 - 神经网络部分

Step5 - 训练及验证

可以尝试选择不同的优化器和优化器参数(Keras文档),好的优化器能让训练结果尽快收敛并获得更高的准确率

下面开始训练,为了节省时间只设置了迭代20次。你可以尝试不同迭代次看看它数对最终结果的影响

画图看一下训练效果

怎么看训练的结果好不好

好的情况

总体上来看,train和val的正确率都随着迭代次数增加而上升,并且最后收敛于某一个比较高的数值。

两种不好的情况

1.欠拟合(under-fitting)

train和val的正确率都比较低。 造成这种情况的原因有很多,常见的有:数据量不够大、神经网络设计得不合理、优化器选择不合理、迭代次数不够

2.过拟合(over-fitting)

train的正确率很高,但是val正确率很低。 这种情况代表模型的泛化能力不好,它完全适应了训练集的数据(可以接近100%的正确率),但是不适用于验证集的数据。 解决方法是使用在Dense层后追加Dropout层或是在Densse层的选项中设置regularizer。

Step6 - 测试

如果上面的验证结果还不错,那恭喜你就快要成功了! 最后我们用测试集的数据来测试一下

Step7 - 拍张照,让程序来判断它是什么

拍一张照,上传到 data/x 文件夹中,默认文件名是 myimage.jpg。如果你保存了其它文件名或是其它文件夹,需要修改下方代码中的路径。

先显示一下图片看看对不对

让程序来预测试试吧

Optional - 用自己电脑的摄像头做实时预测

先保存训练好的模型文件

然后运行其中model文件夹下的的predict.py即可。

这里有个注意事项:我用的vscode编辑器,把当前工作路径设置为 NARUTO_game 这个主文件夹,并以此设置相关的相对路径,若直接cd到model文件夹来运行predict.py文件,需要手动调整源码中的相对路径

然后predict.py文件里大部分是关于如何根据识别到的图像结果,来做出放音效,放gif特效等操作,就不展开细讲每一步在做什么了,大家可以自己发挥想象力去改造。

用到的一些音效、gif图、字体也都放在源码仓库里了。

写在最后

我自己代码水平不高,可能引起知乎读者不适

因为编程和AI只是上学期才开始自学的 ಠᴗಠ

真正的专业是工业设计(〃´-ω・)

跟知乎人工智能大神没法比

正在努力学习python和AI中

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180624G0GSNT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券