自動化掃雷工具:Python+機器學習
先來看一下效果:1s之內完成初級掃雷,世界紀錄!
https://www.zhihu.com/video/985533541924503552本文針對win7操作系統的初級掃雷(9*9個格子,中級和高級的程序還有待訓練)
開發語言:Python
開發環境:Pycharm
依賴包:numpy、sklearn、PyUserInput、pillow
先簡單介紹一下工具包:
1.Numpy:不用多說,這是Python科學計算最強大的工具之一(另一個是Pandas),實現了矩陣的矢量化運算;
2.sklearn是機器學習最常用的依賴包,裡面結成了各種分類、聚類、降維和數據清洗工具。
3.PyUserInput安裝包集成了滑鼠和鍵盤的所有操作,通過簡單的
m = PyMouse()
m.click(x,y,1)
即可實現滑鼠在(x,y)像素點的點擊操作
注意:電腦屏幕的左上角是(0,0),水平方向是x方向,豎直方向是y方向(切莫與後邊的圖像數組混淆)
4.pillow是常用的圖像處理工具,此處僅僅用來把矩陣顯示成圖像工具包的安裝
numpy,pillow,sklearn簡單的採用 pip install package_name即可安裝
PyUserInput包依賴pywin32和pyHook
pywin32模塊默認已安裝
pyHook模塊可從這裡下載 http://www.lfd.uci.edu/~gohlke/pythonlibs/ ,
上邊兩個包裝完之後,採用pip install PyUserInput即可
總體思想:
1.截圖
打開掃雷,將掃雷程序放到屏幕上固定的地方。採用qq等截圖工具對整個屏幕進行截圖,使用「畫圖」程序打開剛剛截屏的圖像,找到我們需要截屏的位置(x,y,w,h),分別對應需要截屏的左上角坐標、寬度和高度
簡單地採用
Image.fromarray(img.astype(uint8)).show()
即可查看截取的圖片
3.訓練過程
我們的目標是識別每一個小的Cell對應的是什麼數字或者是否標了旗子,對於初級掃雷,共有以下幾種類別:
數字1,、數字2、數字3、空白(白色的)、標旗子、未點開(藍色的)
這是一個典型的分類問題,對應6個類別,因此我們需要事先訓練好模型,並將模型保存下來,待到預測過程中直接預測出結果
訓練過程我其實做的很簡單,自己手工標註5張圖片,一共是9*9*5組訓練集。直接採用最簡單的線性模型——LogisticRegression,對405組數據進行訓練,並將模型保存到linear_model.pkl中:
joblib.dump(clf,linear_model.pkl)
4.預測過程
訓練好模型之後,對於一個新的圖片,我們將之分成81個Cell,預測每個Cell對應的類別,據此我們得到圖片對應的標籤信息——data數組(9*9的矩陣,每個數字0——5)
5.掃雷演算法
我們得到data數組之後,下一部就是執行掃雷演算法
1)判斷是否存在可以標旗子的Cell,如果有就標上旗子
2)很多人可能不知道掃雷可以進行雙擊(食指和中指同時按下),雙擊可以大大加快掃雷的速度。這一步就是判斷是否存在雙擊的條件,存在就在該位置進行雙擊
3)如果上述兩步都沒有符合條件的,此時採用隨機演算法,在未點開的雷中隨機點擊
幾個注意點:
1)進行滑鼠點擊屏幕操作是IO操作,很耗時,因此每次點擊之後需要延時0.2s,使之完成點擊
2)本文僅僅針對初級,對於中級和高級還需要訓練數字4,數字5,數字6的識別,有待後續開發
推薦閱讀:
※Python筆記--Pandas常用函數匯總
※數據挖掘和網路爬蟲有什麼關聯區別?
※用R語言進行文本挖掘和主題建模
※用戶畫像——搜狗用戶挖掘:文本分類
※玩轉Pandas,讓數據處理更easy系列7