某日工作室学妹问我,看视频学人工智能好枯燥,有没有实际项目可以实践下?
正巧室友刚做了一个识别剪刀石头布的图像识别程序
于是脑洞大开
改造了一下,做了这个识别结印手势来发动忍术的小游戏。
演示视频:
这里我就把项目整理成教程,让大家都能做脑洞大开的创作。
感谢室友陆玄青提供的简单图像识别源码
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中
领取专属 10元无门槛券
私享最新 技术干货