識別王者英雄:一個 PM 的機器學(xué)習(xí)入門之旅
![](http://image.woshipm.com/wp-files/img/48.jpg)
學(xué)習(xí),是一個 PM 永遠(yuǎn)不該停下的生存技巧。
基礎(chǔ)概念
上個月開始從原理層面了解機器學(xué)習(xí),選了一本在線電子書《Neural Networks and Deep Learning》作為教材,事實證明該書實在不錯,讓一個毫無神經(jīng)網(wǎng)絡(luò)、機器學(xué)習(xí)背景知識的 PM 很快就讀懂了其中的基本原理。
附上此書第一章我的讀書筆記,對于 PM 而言,讀完第一章就夠了,基本概念和方法論在這章里解釋得十分清楚。讀完之后有一種打開新世界大門的感覺。
行動誘因
上周末看到 Twitch 做的 ClipMine,基于游戲直播畫面識別出守望先鋒、爐石傳說中玩家正在玩的英雄和段位,供觀眾在多個主播間篩選自己想看的英雄。頓時手癢,想著這樣的需求在國內(nèi)直播行業(yè)里其實也是存在的,比如將幾千個正在直播的王者榮耀直播流識別出當(dāng)前在玩的英雄,這樣觀眾就可以選擇自己想看的英雄專注的看了。
手癢,又碰上周末,看來不得不做點啥了。
工程分析
王者榮耀這款游戲,想要識別其中正在玩的英雄,有幾個思路:
1. 游戲開始前選擇英雄的界面
2. 游戲開始后加載資源時的 Loading 界面
3. 游戲進(jìn)行中屏幕正中央的英雄本身
4. 游戲進(jìn)行中屏幕右下角的技能圖標(biāo)
分析如下:
- 在整個直播時長中,1 和 2 的時間占比是很短的,而且如果玩家直接直播游戲進(jìn)行中的畫面,那就沒法獲取英雄信息了。
- 并且 1 和 2 的界面里,當(dāng)前玩家所處的位置并不固定,如果還要加上玩家位置的判定,工程復(fù)雜度上升不止一點點。
- 因為英雄在游戲中永遠(yuǎn)處于正中央,所以 3 其實挺適合用來做訓(xùn)練素材。但考慮到英雄有不同的動作和朝向,最重要的是這個游戲單一英雄還有不同的皮膚。各種條件綜合起來,一方面需要提供更多的訓(xùn)練素材,一方面也加大了機器學(xué)習(xí)的難度。
- 而 4 這個界面,英雄的技能在較長的時間段內(nèi)是不會變的,而且位置穩(wěn)定,在整個直播時長里出現(xiàn)的時間占比也很高,唯一變化較大的是技能發(fā)動間歇里的讀秒倒計時。綜合考慮,4 是最適合用來做訓(xùn)練素材的。
確定了這點后,就能理清整個項目的運轉(zhuǎn)流程了:
- 獲取 60 幾個英雄對應(yīng)的游戲進(jìn)行中圖片,每個英雄不少于 1000 張(拍腦袋的,我也不知道多少張合適)
- 將 1 中圖片的右下角截取出來,作為機器學(xué)習(xí)的訓(xùn)練資料
- 運行機器學(xué)習(xí)代碼,訓(xùn)練出可以識別不同英雄技能的模型
- 從待識別的直播流中抽取畫面,截取右下角的技能畫面,用 3 中的模型去識別看是哪個英雄的技能,從而完成對直播流英雄的識別
流程已然清晰,但后面的工作量才是最大的,先來看看如何獲取訓(xùn)練資料吧。
收集素材
做機器學(xué)習(xí)的都知道,寫代碼不是最難的部分,收集優(yōu)質(zhì)的訓(xùn)練素材才是。如何能夠快速獲得 60 多個英雄分別對應(yīng)的 1000 張圖片呢?且不說找到 6 萬多張圖片的難度,找到后難道要我人肉來標(biāo)記哪張圖片是哪個英雄?如果真要這么做,估計一個人是很難完成了。
這一次想出的取巧方法是直接去優(yōu)酷上搜索「王者榮耀」+「英雄名字」,就能搜到很多玩家錄好的英雄視頻。于是讓團隊里的同學(xué)幫忙,很快收集齊了所有英雄的對戰(zhàn)視頻各 1 個。然后用 Adapter 這樣的軟件將視頻按一秒一幀轉(zhuǎn)化為幾千張圖片。(不過一開始沒有發(fā)現(xiàn) Adapter 這個軟件,當(dāng)時是用 OpenCV 去一幀幀把視頻里的畫面讀取出來的。)
唯一的坑是優(yōu)酷上的視頻往往并不只是對戰(zhàn)過程本身,還會有一些制作者加入的視頻特效、文字、轉(zhuǎn)場動畫啥的。一開始沒留意,污染了一小批訓(xùn)練素材,后來重新找了幾個干凈的視頻解決此問題。
于是就這樣,輕松獲得了含有英雄標(biāo)記信息的近 10 萬張圖片。
后面的事情就簡單了,用 OpenCV 統(tǒng)一對圖片進(jìn)行裁剪。一開始是裁到三個技能的區(qū)域,但因為這個區(qū)域覆蓋的面積較大,會包含進(jìn)來很多不必要的圖像信息,導(dǎo)致訓(xùn)練出來的結(jié)果不理想。在后期調(diào)優(yōu)時,想到每個英雄的技能其實是唯一的,沒必要識別全部,于是將素材全都裁剪到第二個技能,果然大大提升了識別準(zhǔn)確度。
技術(shù)實施
早有耳聞 Google 家 TensorFlow 上手容易且性能還不錯,加上是 G 家產(chǎn)品,自然和 Python 配合度最好,適合常年寫 Python 的我。于是果斷開始讀 TensorFlow 的文檔。
不得不說周末那個晚上有很多時間花在了如何在 virtualenv 里安裝 TensorFlow 和 OpenCV。網(wǎng)上的教程沒有一個是可以完全順利在 Mac 上跑完的,還好最后在 Google 和 Stack Overflow 的雙重加持下,這倆個組件都在我 Mac 上編譯成功了。
很快,在 TensorFlow 官方教程里找到一篇關(guān)于圖片識別的文章。跑了一下 demo,運行正常。于是開始研究如何訓(xùn)練自己的模型。
既然都按照官方教程走了,所以直接用了 Inception V3 的網(wǎng)絡(luò)結(jié)構(gòu)。近 10 萬張圖片,在沒有 GPU 加持的 Macbook Pro 上,差不多得跑 10 個小時才能跑完第一次訓(xùn)練。
不過其中最耗時是計算 Bottleneck 值,因為這個值在每次訓(xùn)練時其實都不會變。所以教程中會讓在第一次計算每張圖片的 Bottleneck 值后,將之保存下來,這樣下次訓(xùn)練只需要計算新增圖片素材的 Bottleneck 值即可,不需要每次都全量計算。這樣優(yōu)化之后,效率飛升。
到此時,已經(jīng)是周日凌晨 3 點了,趕緊讓模型跑起來,睡覺去。
性能調(diào)優(yōu)
周日中午醒來,第一次訓(xùn)練已經(jīng)跑完了,趕緊拿新模型去做各種測試,準(zhǔn)確率超乎想象的高。但如「收集素材」那一段里提到,一開始是識別三個技能,所以在某些英雄的識別上不太理想。
將所有素材調(diào)整為單個技能截圖后,又跑了一次,出結(jié)果時已經(jīng)是周日晚上。這個時候的準(zhǔn)確率靠我找到的測試圖片已經(jīng)沒有失敗的例子了。
截止這個時候,識別單張圖片大概需要 5 秒,倒也不是不能接受,但還想更快。在沒有 Nvidia 顯卡的情況下,只能依賴于在本地編譯 TensorFlow,從而讓 TensorFlow 能用上本地 CPU 的 SSE、AVX 這類指令,加快運算速度。如何在 Mac 上編譯 TensorFlow,可以參考這里。
附加功能
在本地已經(jīng)能完美識別英雄了,但總想著讓更多的同事能體驗這個功能。周二晚回家想起了之前用 itchat 寫的微信機器人,于是立馬將機器人和王者識別代碼結(jié)合起來,實現(xiàn)了在微信里給機器人發(fā)游戲圖片,機器人立即回復(fù)這個圖片里的英雄是誰。
結(jié)語
實際的學(xué)習(xí)和開發(fā)時間就是周六晚 8 點到凌晨 3 點。這 8 個小時讓我從原理及代碼層面認(rèn)識到了機器學(xué)習(xí)的魅力和實施細(xì)節(jié),真真切切的看到了另一個世界的入口以及未來無窮的可能性。
最大的觸動是開始思考未來產(chǎn)品經(jīng)理在設(shè)計產(chǎn)品邏輯時,如果理解機器學(xué)習(xí),那么很多以往被認(rèn)為不可能的事情,都將成為產(chǎn)品邏輯的一部分。而能否建立這種新的認(rèn)知,運用好新的工具,將在未來某些領(lǐng)域里區(qū)分出產(chǎn)品經(jīng)理的高下。
學(xué)習(xí),是一個 PM 永遠(yuǎn)不該停下的生存技巧。
作者:張濤
來源:https://zhuanlan.zhihu.com/p/28731349
本文由 @張濤 授權(quán)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。
題圖來自PEXELS,基于CC0協(xié)議
基礎(chǔ)太好了,想到就干,很強大
完蛋了我。我都看不懂了