最近微信的跳一跳小程序火了一把,所以前天也更新了微信玩了幾盤,最多手動到200左右就不行了。
后來準(zhǔn)備用代碼寫個輔助工具,上Github一查,已經(jīng)有人做出來了,17年12月29號的項目,不到5天差不多5K的stars,以后還會更多,簡直可怕。 github.com/wangshub/we… 具體思路都差不多:
唉,多么可惜,錯過了一個好項目。 既然別人已經(jīng)實現(xiàn)了,那就嘗試點不一樣的,用 深度學(xué)習(xí) 解決一下。 基本思路基本流程類似,唯一的區(qū)別在于如何獲取棋子和目標(biāo)塊的中心位置。 假如長按時間只取決于棋子和目標(biāo)塊的水平位置,那么只需要知道它們水平方向上的坐標(biāo)即可。 可以看作一個 物體檢測 問題,檢測出截圖中的棋子等物體,這里假設(shè)共包含七類物體:
模型實現(xiàn)我手動標(biāo)注了500張截圖,基于ssd_mobilenet_v1_coco模型和TensorFlow物體檢測API,訓(xùn)練好的模型跑起來是這么個結(jié)果。
可以看到截圖中的棋子、魔方、矩形塊、圓形塊都被檢測了出來,每個檢測結(jié)果包括三部分內(nèi)容:
這不僅僅是簡單的規(guī)則檢測,而是 真正看到了截圖中共有哪幾個物體,以及每個物體分別是什么。 所以接下來,就只需從檢測結(jié)果中取出棋子的位置,以及最上面一個非棋子物體,即目標(biāo)塊的位置。 有了物體的邊界輪廓,取中點即可得到棋子和目標(biāo)塊的水平坐標(biāo),這里進行了歸一化,即屏幕寬度為1,距離在0至1之間。然后將距離乘以一個系數(shù),作為長按時間并模擬執(zhí)行即可。 運行結(jié)果看起來很不錯,實際跑分結(jié)果如何呢? 大概只能達到幾百分,問題出在哪? 主要是標(biāo)注數(shù)據(jù)太少,模型訓(xùn)練得不夠充分,所以檢測結(jié)果不夠準(zhǔn)確,有時候檢測不出棋子和目標(biāo)塊,而一旦出現(xiàn)這類問題,分?jǐn)?shù)必然就斷了。 嘗試了以下方法,將一張截圖朝不同的方向平移,從而得到九張截圖,希望提高檢測結(jié)果的召回率,但仍然有檢測不出來的情況,也許只有靠更多的標(biāo)注數(shù)據(jù)才能解決這一問題。 規(guī)則檢測模型訓(xùn)練了20W輪,依舊存在檢測不出來的情況,郁悶得很,干脆也寫一個基于規(guī)則的 簡單版代碼 好了。 花了不到20分鐘寫完代碼,用OpenCV提取邊緣,然后檢測棋子和目標(biāo)塊的水平中心位置,結(jié)果看起來像這樣。
事實證明,最后跑出來的分?jǐn)?shù),比之前的模型要高多了…… 說好的深度學(xué)習(xí)呢?
總結(jié)面對以下情況時,基于人工經(jīng)驗定義規(guī)則,比用深度學(xué)習(xí)訓(xùn)練模型要省力、有效很多:
當(dāng)然,如果大家能一起努力,多弄些標(biāo)注數(shù)據(jù)出來,說不定還有些希望。 代碼在Github上:github.com/Honlan/wech… 不說了,我繼續(xù)刷分去了,用后面寫的不到一百行的代碼…… |
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)