国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

macOS下基于圖像識(shí)別的自動(dòng)化程序

2017-04-08 07:57楊雨昕呂偉龍向豪
電腦知識(shí)與技術(shù) 2017年5期
關(guān)鍵詞:自動(dòng)機(jī)圖像識(shí)別內(nèi)存

楊雨昕 呂偉龍 向豪

摘要:隨著macOS系統(tǒng)用戶的逐漸增多,各類(lèi)應(yīng)用需求不斷增加,而自動(dòng)化程序的出現(xiàn)可以解決可以解決許多日常應(yīng)用中的痛點(diǎn)難點(diǎn),比如重復(fù)性操作、游戲外掛、自動(dòng)搶票等。文章給出一種在macOS系統(tǒng)下自動(dòng)化程序的實(shí)現(xiàn)框架,不同于一般的自動(dòng)化程序,其特點(diǎn)是可以從屏幕截圖自動(dòng)識(shí)別信息,利用多種不同的程序語(yǔ)言完成不同的功能模塊,最終實(shí)現(xiàn)一個(gè)可以自動(dòng)進(jìn)行掃雷游戲的程序。其中,利用python語(yǔ)言實(shí)現(xiàn)程序主框架并完成人機(jī)交互,利用C++語(yǔ)言高效實(shí)現(xiàn)核心算法策略,利用octave語(yǔ)言實(shí)現(xiàn)圖像的讀取與識(shí)別。

關(guān)鍵詞:圖像識(shí)別;自動(dòng)化程序;程序設(shè)計(jì);macOS,python;C++;octave;深度優(yōu)先搜索(DFS)

中圖法分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)05-0155-05

隨著macOS系統(tǒng)用戶的逐漸增多,各類(lèi)應(yīng)用需求不斷增加,而自動(dòng)化程序的出現(xiàn)可以解決可以解決許多日常應(yīng)用中的痛點(diǎn)難點(diǎn),比如重復(fù)性操作、游戲外掛、自動(dòng)搶票等。

Python是一種強(qiáng)大的解釋型程序設(shè)計(jì)語(yǔ)言,在各種庫(kù)的幫助下可以便捷的實(shí)現(xiàn)各種強(qiáng)大的功能。Octave是一個(gè)類(lèi)似于MATLAB的開(kāi)源的科學(xué)計(jì)算及數(shù)值分析工具,擅長(zhǎng)處理圖片等矩陣型數(shù)據(jù)。C++是一種廣泛使用的程序設(shè)計(jì)語(yǔ)言,相比于python它有更高的執(zhí)行速度,許多核心算法在python上實(shí)現(xiàn)會(huì)遇到速度瓶頸,C++的實(shí)現(xiàn)則可以讓速度提升一至兩個(gè)數(shù)量級(jí)。

筆者在macOS系統(tǒng)下使用python、c++、octave三種語(yǔ)言實(shí)現(xiàn)了一個(gè)掃雷游戲的自動(dòng)化程序(下簡(jiǎn)稱(chēng)掃雷自動(dòng)機(jī)),能夠讀取并識(shí)別屏幕圖像,模擬用戶的思維與操作,從而自動(dòng)進(jìn)行游戲。該文希望通過(guò)對(duì)這個(gè)自動(dòng)化程序的分析,給其他程序初學(xué)者提供一個(gè)可行的自動(dòng)化程序解決方案。

1主框架流程

2重難點(diǎn)分析

掃雷自動(dòng)機(jī)需要完成信息獲取、局面決策、人機(jī)交互三個(gè)大任務(wù)。信息獲取中,需要完成屏幕截圖、圖像讀取、圖像識(shí)別等子任務(wù);局面決策需要在保證正確性的情況下盡可能多的判斷出一定是或一定不是地雷的位置,提高每一次主循環(huán)的效率;人機(jī)交互方面需要在保證速度的同時(shí)考慮到游戲本身的性能,太快會(huì)讓游戲本身來(lái)不及反應(yīng),甚至出現(xiàn)一些嚴(yán)重的錯(cuò)誤。

2.1信息獲取

自動(dòng)化程序獲取信息的方式可以大致分為三種,一種是環(huán)境已提供好便于讀取的信息,通過(guò)調(diào)用接口或讀取文件就可以解決;一種是通過(guò)一些反編譯手段從內(nèi)存中獲取到環(huán)境不希望我們獲得的信息;還有一種從用戶屏幕、音響等輸出設(shè)備間接獲取。這里我們通過(guò)屏幕圖像間接獲取信息。

2.1.1屏幕截圖

在macOS下,屏幕截圖可以由macOS系統(tǒng)自帶的命令‘screencapture完成,此命令可以將圖片保存至指定路徑或剪貼板。另外,還可以使用PIL庫(kù)中的ImageGrab.grab()函數(shù)將當(dāng)前屏幕圖像保存至內(nèi)存中,并轉(zhuǎn)換成可供python使用的格式。

2.1.2圖像讀取

根據(jù)圖像數(shù)據(jù)保存的位置,可通過(guò)imread()等常規(guī)手段讀取硬盤(pán)中的圖像,也可以利用python的PIL庫(kù)函數(shù)截屏至內(nèi)存,還可以通過(guò)AppKit的NSPasteboard讀取剪貼板中的圖像。

將圖像保存至硬盤(pán)再通過(guò)常規(guī)手段讀取,整體速度取決于硬盤(pán)的速度;使用PIL截屏至內(nèi)存,簡(jiǎn)潔方便,但這樣便不能通過(guò)octave工具分析圖像,且其速度與手動(dòng)保存至硬盤(pán)再讀取相似,可以合理推斷其實(shí)現(xiàn)采用了相同的方法。通過(guò)AppKit的NSPasteboard讀取剪貼板中的圖像性能最佳,不過(guò)需要swift或Objective-C的支持,以及轉(zhuǎn)換到python所支持的格式。

2.1.3圖像識(shí)別

在掃雷自動(dòng)機(jī)中,圖像識(shí)別的任務(wù)是獲取掃雷地圖上每一個(gè)方格的狀態(tài)。而在其他應(yīng)用中,可以是識(shí)別驗(yàn)證碼、鎖定人物位置等功能。

識(shí)別每一個(gè)方格的狀態(tài),首先需要確定每一個(gè)方格在圖像中的相對(duì)位置。筆者的方法是先找到游戲界面的左上角,再根據(jù)每一個(gè)方塊與游戲界面的左上角的相對(duì)位置計(jì)算每一個(gè)方塊在整個(gè)圖像中的絕對(duì)位置。尋找游戲界面左上角的方法可以很靈活,筆者直接枚舉一個(gè)小區(qū)域中的所有像素點(diǎn),當(dāng)與標(biāo)準(zhǔn)左上角區(qū)域吻合時(shí),就是左上角的位置。

整個(gè)決策算法包含兩種方法,優(yōu)先循環(huán)使用第一種方法,無(wú)法更新地圖后使用第二種方法,循環(huán)這個(gè)過(guò)程,直到地圖經(jīng)過(guò)兩種方法都無(wú)法更新。

2.3 人機(jī)交互

人機(jī)交互部分可以由python的第三方庫(kù)完成,筆者選擇使用PyUserInput庫(kù),可以實(shí)現(xiàn)模擬用戶鼠標(biāo)點(diǎn)擊事件。點(diǎn)擊位置由之前確定的各個(gè)方格的位置以及局面決策結(jié)果確定,由于本次采用H5掃雷進(jìn)行測(cè)試,性能不足,兩次點(diǎn)擊之間需要有一定的時(shí)間間隔,否則游戲本身無(wú)法正常響應(yīng)。

3 程序?qū)崿F(xiàn)

整個(gè)掃雷自動(dòng)機(jī)由三部分組成,首先是python的主框架部分,負(fù)責(zé)架構(gòu)整個(gè)項(xiàng)目、調(diào)用各個(gè)模塊、儲(chǔ)存信息、人機(jī)交互等;其次是C++的局面決策部分,負(fù)責(zé)分析掃雷游戲的一個(gè)局面,給出當(dāng)前最優(yōu)解;最后是數(shù)據(jù)輸入部分,也就是屏幕圖像的獲取、讀取和識(shí)別,由octave完成。

下面選取一些主要的函數(shù)或細(xì)節(jié)進(jìn)行分析。

3.1 主框架

主框架由python編寫(xiě)

3.1.1 截圖

3.3.3 地圖識(shí)別

地圖識(shí)別的過(guò)程和數(shù)據(jù)收集以及模型訓(xùn)練中的預(yù)測(cè)過(guò)程類(lèi)似,得到圖像數(shù)據(jù)后,輸入模型即可。

4 效率分析

掃雷自動(dòng)機(jī)是由三種語(yǔ)言共同完成,這中間有一系列的程序調(diào)用、文件讀寫(xiě)。下面給出掃雷自動(dòng)機(jī)在游戲循環(huán)內(nèi)的訪問(wèn)關(guān)系。

其中,C++程序內(nèi)獨(dú)立計(jì)時(shí)后發(fā)現(xiàn),包括文件讀寫(xiě)在內(nèi),其真實(shí)平均運(yùn)行時(shí)間為0.289ms,遠(yuǎn)遠(yuǎn)低于python中調(diào)用它的總耗時(shí),可見(jiàn)在python中使用os庫(kù)調(diào)用其他可執(zhí)行文件或腳本是需要可觀的成本的,大約為5ms。

而octave/圖像識(shí)別模塊是掃雷自動(dòng)機(jī)游戲循環(huán)中最耗時(shí)的部分,成為性能瓶頸。經(jīng)過(guò)分析,其中的兩個(gè)子步驟占用了大部分時(shí)間,分別是讀取圖像文件和讀取模型參數(shù)矩陣,平均耗時(shí)分別為0.446s以及0.394s。

若要優(yōu)化掃雷自動(dòng)機(jī)的性能,可以放棄octave模塊,使用python在初始化時(shí)讀取模型參數(shù)矩陣,避免其在循環(huán)體內(nèi)重復(fù)讀取,并用python語(yǔ)言實(shí)現(xiàn)octave圖像識(shí)別模塊的功能;使用不壓縮的圖片格式(例如.tiff .bmp等)保存截圖,可以提高讀取圖片的速度,在python中使用scipy.misc的imread()讀取.tiff格式的截圖,耗時(shí)在80ms左右。這樣一個(gè)循環(huán)的總耗時(shí)可以控制在0.25s左右,整體提速4~5倍。

若需要進(jìn)一步提高性能,需要利用AppKit的NSPasteboard直接讀取剪貼板(內(nèi)存)中的圖像,在這里不做過(guò)多的討論。

5 掃雷自動(dòng)機(jī)效果圖

6 結(jié)束語(yǔ)

計(jì)算機(jī)技術(shù)不斷發(fā)展,合理利用程序設(shè)計(jì)語(yǔ)言等工具可以給予我們?cè)S多幫助。在操作系統(tǒng)的支持下,使用不同的手段,合理組合不同的工具,可以充分發(fā)揮其各自的能力,組合出花樣繁多的功能。希望這個(gè)自動(dòng)化程序的設(shè)計(jì)過(guò)程能夠給大家?guī)?lái)啟發(fā)。由于本人水平限制,文中難免存在各種問(wèn)題,歡迎讀者批評(píng)指正。

參考文獻(xiàn):

[1] 周志華.機(jī)器學(xué)習(xí)[M].北京:清華大學(xué)出版社,2016:53-65.

[2] 劉穎超,張紀(jì)元.梯度下降法[J].南京理工大學(xué)學(xué)報(bào)(自然科學(xué)版),1993(02):12-16,22.

[3] Anany Levitin.算法設(shè)計(jì)與分析基礎(chǔ)(第3版)[M].北京:清華大學(xué)出版社,2015:94-96.

猜你喜歡
自動(dòng)機(jī)圖像識(shí)別內(nèi)存
{1,3,5}-{1,4,5}問(wèn)題與鄰居自動(dòng)機(jī)
外部高速緩存與非易失內(nèi)存結(jié)合的混合內(nèi)存體系結(jié)構(gòu)特性評(píng)測(cè)
基于Resnet-50的貓狗圖像識(shí)別
“春夏秋冬”的內(nèi)存
高速公路圖像識(shí)別技術(shù)應(yīng)用探討
圖像識(shí)別在物聯(lián)網(wǎng)上的應(yīng)用
圖像識(shí)別在水質(zhì)檢測(cè)中的應(yīng)用
廣義標(biāo)準(zhǔn)自動(dòng)機(jī)及其商自動(dòng)機(jī)
基于內(nèi)存的地理信息訪問(wèn)技術(shù)
模糊自動(dòng)機(jī)的強(qiáng)連通性及群自動(dòng)機(jī)
太和县| 都兰县| 剑河县| 金川县| 尤溪县| 武清区| 龙岩市| 石渠县| 特克斯县| 山东省| 中方县| 山丹县| 五原县| 于都县| 无为县| 桦南县| 阳高县| 宁蒗| 纳雍县| 余干县| 包头市| 潼关县| 黄石市| 宿松县| 延安市| 政和县| 荃湾区| 樟树市| 牟定县| 清水河县| 常德市| 达日县| 额尔古纳市| 营口市| 图们市| 贵州省| 阿克陶县| 凌源市| 察雅县| 师宗县| 蒲江县|