当前位置: 首页 > 科技观察

认王英雄——一个PM的机器学习入门

时间:2023-03-22 10:45:33 科技观察

基本概念上个月开始从原理层面了解机器学习。我选择了一本在线电子书《Neural Networks and Deep Learning》作为教材。事实证明,这本书真的很好。让没有神经网络和机器学习背景知识的PM也能快速理解基本原理。我附上了本书第一章的阅读笔记。对于PM来说,看第一章就够了。本章对基本概念和方法进行了非常清楚的解释。看完有种打开了新世界大门的感觉。行动激励我上周末看到了Twitch制作的ClipMine。基于游戏直播,可以识别玩家在守望先锋和炉石中使用的英雄和段位,方便观众在多位主播中筛选自己想看的英雄。突然手痒痒的,想着国内直播行业居然存在这样的需求,比如从正在直播的王者荣耀上千个直播流中识别出当前正在播放的英雄,让观众选择自己想看的英雄。我读了。手痒痒的,又到了周末,我得做点什么了。王者荣耀游戏工程分析,识别正在玩的英雄有几种思路:1.游戏开始前选择英雄的界面2.游戏开始后加载资源时的Loading界面3.中心4、游戏过程中画面右下角技能图标分析如下:在整个直播时间里,1和2的时间比很短,如果玩家直接播放游戏进行画面,无法获取英雄信息。而在1和2的界面中,玩家的当前位置是不固定的。如果再加上球员位置的判断,工程复杂度会增加不少。因为英雄总是在游戏的中心,所以3其实挺适合做训练材料的。但考虑到英雄的动作和朝向各不相同,最重要的是这款游戏中的单个英雄也有不同的皮肤。结合各种条件,一方面需要提供更多的训练材料,另一方面也增加了机器学习的难度。4界面中,英雄的技能在很长一段时间内不会发生变化,走位稳定,出现的时间占整个直播时间的比例也非常高。唯一变化较大的就是间隔倒计时中的技能。综合考虑,4最适合做培训教材。确定了这一点之后,整个项目的操作流程就可以清晰了:获取60多个英雄对应的游戏内图片,每个英雄不少于1000张图片(不知道有多少张适合拍我的head)截取1中图片的右下角,运行机器学习代码作为机器学习的训练数据,训练出可以识别不同英雄技能的模型从直播流中提取需要识别的图片,截取技能图片在右下角,并使用3模型来识别是哪个英雄的技能,这样直播英雄的识别过程已经很清楚了,但是后面的工作量是最大的。我们来看看如何获??取训练数据。收集机器学习资料的人都知道,写代码并不是最难的部分,收集高质量的训练资料才是。如何快速获取60多个英雄对应的1000张图片?且不说六万多张图找起来难度不小,难道我找完还得用人肉标出哪个英雄是哪张图吗?如果真要做到这一点,估计一个人很难完成。我这次想出的猫腻方法是直接去优酷搜索《王者荣耀》+《英雄名》,可以找到很多玩家录制的英雄视频。于是我请了队里的同学帮忙,很快就把所有英雄的战斗视频都收集了起来。然后用Adapter之类的软件把视频转成每秒几千张图片。(不过一开始并没有发现Adapter软件,当时是用OpenCV逐帧读取视频中的图片)唯一坑的是优酷上的视频往往不只是战斗过程本身,还有一些由作者添加的制作视频效果、文字、过渡动画。一开始没注意,污染了一小批培训资料。后来找了几个干净的视频解决了这个问题。这样一来,就轻松获得了近10万张包含英雄标签信息的图片。后面的事情就简单了,用OpenCV对图片进行统一裁剪。最开始的时候,三个技能区域都被切掉了,但是因为这个区域覆盖面积大,会包含很多不需要的图像信息,导致训练效果不理想。在后期的调优中,我发现其实每个英雄的技能都是独一无二的,没必要全部识别,所以我把所有的素材都切到了二技能上,这样识别准确率就大大提高了。技术实现早就听说谷歌的TensorFlow好用,性能也不错。再加上是G品,自然和Python配合得最好。适合常年写Python的我。所以我决定开始阅读TensorFlow文档。不得不说,那个周末花了很多时间在如何在virtualenv中安装TensorFlow和OpenCV上。没有一个在线教程可以在Mac上成功运行。幸运的是,在Google和StackOverflow的支持下,这两个组件都在我的Mac上成功编译。很快,我在TensorFlow官方教程中找到了一篇关于图像识别的文章。我运行了一个演示,它运行良好。于是我开始研究如何训练自己的模型。既然按照官方教程来了,我们就直接使用InceptionV3的网络结构。近10万张图片,在没有GPU支持的MacbookPro上,运行第一次训练需要将近10个小时。然而,最耗时的是计算Bottleneck值,因为这个值在每次训练期间都不会改变。因此,在教程中,第一次计算每张图片的Bottleneck值后,会保存下来,这样下次训练只需要计算新添加的图片素材的Bottleneck值,就不用再计算了每次都完整。经过这次优化,效率飙升。这时候已经是周日凌晨3:00了,让模型跑起来睡觉。PerformanceTuning周日中午醒来,第一次训练已经完成,赶紧拿新模型做各种测试,准确率超乎想象。不过在“素材收集”一节中也提到过,一开始是鉴定了三个技能,所以对部分英雄的鉴定并不理想。把所有素材调整成一个技能截图后,我又跑了一遍,结果出来的时候已经是周日晚上了。此时的准确性取决于我找到的测试图片,没有失败的例子。截至此时,识别单张图片需要5秒左右,这不是不能接受的,但我还是想快点。在没有Nvidia显卡的情况下,只能靠本地编译TensorFlow,让TensorFlow使用本地CPU的SSE、AVX等指令来加速计算。如何在Mac上编译TensorFlow,可以参考这里。附加功能可以在本地完美识别英雄,但我一直想让更多的同事体验到这个功能。周二晚上回家的时候想起了itchat写的微信机器人,于是马上把机器人和王者的识别码结合起来,实现了我在微信里把游戏图片发给了机器人,机器人马上回复了图中的主人公是谁。结语实际的学习和发展时间是周六晚上8点到凌晨3点。这8个小时让我从原理和代码层面体会到了机器学习的魅力和实现细节,真正看到了另一个世界的入口和未来的无限可能。最大的触动是在设计产品逻辑时开始思考未来的产品经理。如果他们懂机器学习,很多过去认为不可能的事情都会成为产品逻辑的一部分。能否建立起这种新的认知,能否用好新的工具,将决定未来产品经理在某些领域的优劣。学习是PM永远不应停止的生存技能。