利用人工智慧實現小程式自動答題
♚
作者:Yiutto,程式設計浪子
GitHub: github.com/Yiutto
之前有看到有人用python實現自動執行 微信小程式《跳一跳》 ,後來看到別人用hash碼實現《加減大師》的自動答題領取娃娃,最近一直在研究深度學習,為啥不用機器學習實現呢?不就是一個分類問題嗎!
如何實現自動答題微信小遊戲《加減大師》?
思考:
-
影象識別嗎?
-
如何建立特徵工程?
-
選用什麼演算法?
一、影象特徵工程
如何獲取手機遊戲上的圖片?
-
使用adb命令擷取手機螢幕;
-
在PC端和手機端同時執行APowerMirror軟體,將手機投屏到電腦上,然後使用Pillow包中的截圖方法擷取電腦上對應手機螢幕的 區域。
-
在PC端和手機端同時執行APowerMirror軟體,將手機投屏到電腦上,然後使用Python呼叫windows的原生API擷取電腦上對應手機螢幕的區域。
實驗結果:三種截圖方式花費的時間差異很大,第一種每次截圖需要0.7s左右,第二種0.3s左右,第三種0.04s左右。
當然選擇第3種咯,下載地址 [https://www.apowersoft.cn/phone-mirror] ,一個好的軟體是成功的關鍵(夠清晰)。
獲取訓練樣本
相關步驟:
1. util.py
中的 shotByWinAPI
函式:首先利用window自帶api獲取全屏圖片,然後自定義 config.py
的相關引數。
可以用window命令鍵 PrtScSysRq
(F12的右邊),然後複製到畫圖中(1920x1080)。
用畫圖的放大鏡放大,圖中紅色框的小方塊位置(32x278) projection_x
即32, projection_y
即278。
在畫圖中計算出截圖的寬度和高度,即 projection_width
和 projection_height
(482x854)
2. img_tool.py
函式介紹:主要是通過 all(img,filename)
函式進行圖片分割
上述程式碼是為了將彩色圖片灰度模式載入
cropImg(img)
函式主要是為了裁剪含有數字的區域,通過設定引數
如果覺得設定比例太麻煩,可以直接寫死位置( img2=img[int(307):int(478),:]
)。得到如下圖:
binaryImg(img)
函式主要是為了將圖片二值化,可以參考 Python+OpenCV教程6:閾值分割 。得到的圖片如下圖:
cropAgain(img)
函式主要是為了將圖片分成上下兩部分
設定 pc_single_char_width
引數值,得到如下圖:
重新固定圖片的大小(30x60),得到如下圖:
二、訓練模型,建立LR分類器
相關程式碼請看 ml.py
,這裡不過多介紹,直接利用python包 fromsklearn.linear_modelimportLogisticRegression
sklearn邏輯迴歸(Logistic Regression,LR)類庫使用小結
三、自動答題模式開啟
實現原理
-
擷取遊戲介面,本專案中提供了三種方案。 在PC端和手機端同時執行APowerMirror軟體,將手機投屏到電腦上,然後使用Python呼叫windows的原生API擷取電腦上對應手機螢幕的區域。
-
提取截圖圖片中的表示式區域並進行文字識別,得到表示式字串。 由於圖片中的表示式區域固定,而且字元規整,因此這一步不是很困難,我僅僅訓練了一個簡單的邏輯迴歸模型就得到了非常高的識別正確率。
-
根據第二步得到的表示式,呼叫Python的eval()函式,得到表示式結果的正誤,然後點選手機螢幕的相應區域。當截圖使用投屏的方案時,點選手機螢幕通過程式碼點選 電腦上手機的對應區域。
首次操作,生成分類器模型
1.借用投屏軟體,利用畫圖工具配置相關引數 config.py
,可以參考上面的“影象特徵工程”
2.對於新的手機(我用的是honor8),必須重新訓練模型,設定 config.py
中的 debug
引數為True,開啟“加減大師”,然後執行 main.py
,這裡必須手動答題,儘可能多答對一些題,目的為了擴充訓練樣本。
3.步驟2會產生一個 SingleCharForTrain
資料夾,剔除重複樣本和無關樣本。
4.執行 img_tool.py
檔案,會生成一個 SingleCharForTrain
資料夾。
5.將步驟4得到的資料夾中的字元進行人工分類,儲存至 TrainChar
資料夾。
6.執行 ml.py
檔案,生成分類器模型 lr.pickle
。
注意桌面上不要有東西遮擋到手機的投影區域
根據分類器模型自動答題
1.修改 config.py
中的 debug
引數為False及其他相關引數。
配置正確和錯誤選擇的橫縱座標,橫座標不一樣,縱座標相同(在同一高度)
2.開啟加減大師,直接執行 main.py
即可。
遇到的問題
Q1: 跑到200步左右就停了?
A1: 如果是誤判的話,把出錯的那張圖重新截圖,將得到的字元新增到 TrainChar
資料夾中,重新訓練模型
A1: 如果是上一張圖和這張圖相同,再跑一次唄,不相信你運氣會那麼差
Q2: 刷到1000分,結果小程式上不了分
A2: 剛開始以為是答題時間沒有設定隨機的問題,設定 main.py
中
然而並沒有軟用,估計是後臺設定(個人認為,當天的分數不能超過第一名太多),反正是前500都能獲得小卡片,你可以嘗試設定比第一名多個幾分或少幾分。
記得給哥們的github打♥啊,上程式碼:
最後放出我的娃娃來,手機上顯示的是這樣的
到手的時候卻是這樣的(本來以為沒戲了,等了將近一個星期)
最後,祝大家都能拿到娃娃!!!
Python中文社群作為一個去中心化的全球技術社群,以成為全球20萬Python中文開發者的精神部落為願景,目前覆蓋各大主流媒體和協作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業界知名公司和技術社群建立了廣泛的聯絡,擁有來自十多個國家和地區數萬名登記會員,會員來自以公安部、工信部、清華大學、北京大學、北京郵電大學、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關、科研單位、金融機構以及海內外知名公司,全平臺近20萬開發者關注。
點選 閱讀原文 ,從零開始學習