王 靖
(云南大學數(shù)學與統(tǒng)計學院,云南 昆明 650504)
圖像采集以及預處理是計算機視覺技術(shù)的基礎,其目的是通過目標與背景分離使得處理之后的圖像更方便進行特征提取。采集和預處理的方法將會極大地影響計算機對數(shù)據(jù)的識別能力以及后續(xù)模型訓練效果。通常來說,計算機視覺技術(shù)不僅能夠描述具體的圖象,同時還能夠按照所描述的具體事物,對圖象的代表進行分析,對圖象的具體內(nèi)容進行決定。基于人工智能技術(shù)的視覺研究,要對控制系統(tǒng),及其圖象等描述的更多內(nèi)容進行初期景物的分析,以強調(diào)二維圖象信息,三維景物之間的關系等,圖象的理解要將物理規(guī)律與景物內(nèi)容及其相關知識進行有效地聯(lián)系。
1.1.1 圖像采集原理
由于計算機系統(tǒng)對畫面的繪制是通過圖形接口實現(xiàn)的,所以我們在編程實現(xiàn)自動獲取大量圖像時,不可避免地要調(diào)用系統(tǒng)的接口,對于用于測試的Windows NT系統(tǒng),使用的接口為DirectX系列,所以我們需要調(diào)用相關的動態(tài)鏈接dll庫,找到用于截圖的接口(即Direct3D11CaptureFrame)實現(xiàn)編程截圖。由于高分辨率的圖片會導致數(shù)據(jù)過大,會極其嚴重地加大計算機的計算量,所以在測試時應該使用窗口模式的低分辨率游戲畫面(800×600)來運行,并調(diào)高游戲亮度,降低光照特效以免對人物圖像產(chǎn)生干擾。在記錄下截圖的同時,也應該記錄下玩家此時的按鍵,作為訓練集的Label[1]。
1.1.2 計算機環(huán)境以及軟件選擇
本文使用Itel Core i7 CPU,使用NVIDIA GTX 1050Ti GPU進行模型訓練,軟件環(huán)境為Windows10下的Python3.10環(huán)境,編程工具主要為Visual Studio Code,Tensorflow版本為2.x,游戲版本為Steam平臺重制版的最新版本。下文編程環(huán)境與此一致,不再贅述。
1.2.1 圖片的裁剪與邊緣檢測算法
由于我們需要獲取人物HP(血量),所以我們需要裁減得到游戲的血條UI部分(即整個像素矩陣的400×150部分),并利用邊緣檢測算法得到剩余血量占比。在邊緣檢測算法中,常見的有整體嵌套邊緣檢測,快速邊緣結(jié)構(gòu)森林等,但基于計算量和性能的考慮,使用的是下面介紹的Canny算子?;贑anny算子的邊緣進行檢測分析,共涉及5個基本步驟,依次包含有高斯濾波、像素梯度計算模式和孤立弱邊緣的抑制等。
(1)高斯濾波:其中對于高斯核來說主要具有x和y兩個基本的梯度,對應高斯函數(shù)如下所示:
高斯濾波,即可利用一個尺寸型的二維高斯核心進行圖像的卷積累分析,結(jié)合數(shù)字化的圖像分析內(nèi)容,實現(xiàn)離散矩形分析,這樣連續(xù)性的高斯函數(shù)就變?yōu)殡x散近似型的,通過離散數(shù)據(jù)的采樣,完成歸一分析。
(2)使用Sobel算子計算像素梯度,Sobel算子是兩個3×3的矩陣,分別為Sx和Sy。前者用于計算圖像x方向像素梯度矩陣Gx,后者用于計算圖像y方向像素梯度矩陣Gy。具體形式為
式中,*為互相關運算;I為圖像灰度矩陣。需要說明的是,圖像矩陣坐標系原點在左上角,且x正方向為從左到右,y正方向為從上到下。則有
可以得到梯度強度矩陣Gxy。
(3)非極大值像素梯度抑制。對應的非極大像素梯度抑制分析,消除對應邊緣檢測所帶來的雜散響應,并具有邊緣性的“瘦身”作用,其基本處理方法是基于目前像素強度與沿著正負梯度的正向強度進行比較和分析的,則可保留對應的像素邊緣點,若不是最大,則可進行抑制,不可作為抑制點,為了更加精確的分析,可按照跨越的梯度方向進行相鄰像素點的線性位置的比較和分析。
(4)閾值滯后處理。梯度的強度要低于低閾值,像素點才能夠被抑制,不可作為邊緣點使用。
(5)孤立弱邊緣抑制。通常而言,由真實邊緣引起的弱邊緣像素點將被連接到強邊緣像素點,而噪聲響應則未連接。通過查看弱邊緣像素及其8個鄰域像素,可根據(jù)其與強邊緣的連接情況來進行判斷。一般可定義只要鄰域像素其中一個為強邊緣像素點,則該弱邊緣就可以保留為強邊緣,即真實邊緣點。
1.2.2 顏色空間扁平化
由于三色RGB顏色空間在計算時會形成三維張量,會加大處理機的壓力,所以我們需要通過色彩空間扁平化將RGB空間變換為灰度信息A,這個灰度值介于[0, 255]之間。使用公式A=0.299R+0.587G+0.11B即可完成變換,隨后我們加大每一個像素相對于整個畫面平均灰度的標準差,從而加大圖片對比圖以突出主體,變換公式為A*=A±1.3σ。
1.2.3 采用Grab Cut算法提取圖像主體
GrabCut該算法利用了圖像中的紋理(顏色)信息和邊界(反差)信息,只要小量的用戶交互操作即可得到比較好的分割效果。其核心思想是把圖像轉(zhuǎn)化為對應的網(wǎng)絡加權(quán)圖后,把圖像問題轉(zhuǎn)化為求解圖的最小割。
Adam算法,即一種對隨機目標函數(shù)執(zhí)行一階梯度優(yōu)化的算法,該算法基于適應性低階矩估計。Adam算法很容易實現(xiàn),并且有很高的計算效率和較低的內(nèi)存需求。Adam算法梯度的對角縮放具有不變性,因此很適合求解帶有大規(guī)模數(shù)據(jù)或參數(shù)的問題。該算法同樣適用于解決大噪聲和稀疏梯度的非穩(wěn)態(tài)問題。超參數(shù)可以很直觀地解釋,并只需要少量調(diào)整。Adam算法與其他一些相類似的算法,其收斂速度在在線凸優(yōu)化框架下達到了最優(yōu)。經(jīng)驗結(jié)果也展示了Adam算法在實踐上比得上其他隨機優(yōu)化方法。Adam是一種有效的隨機優(yōu)化方法,它只需要一階的梯度,并且只需要很小的內(nèi)存。該方法通過第一,第二梯度的估計,計算不同參數(shù)的自適應學習速率。
基于這些原因,本文在優(yōu)化損失函數(shù)時候使用的優(yōu)化器為Adam,下面是該優(yōu)化算法的具體運行過程。
(1)給定超參數(shù),α作為學習率,β1、β2作為矩估計,記f(θ)為待優(yōu)化的函數(shù),ε為一個很小的數(shù)。
(2)隨機初始化θ的初始值θ0,一階矩m0,二階矩m1,時間步t初始化為0。
(3)更新時間步,也就是t←t+1。
(4)求出f(θ)在θ處的梯度gt,記作gt=▽θf(θt-1)。
(5)更新mt,更新公式為mt←β1mt-1+(1-β1)gt。
(6)更新vt,更新公式為vt←β2vt-1+(1-β2)gt2。
(9)更新θt,θt←θt-1-α。
(10)不斷重復(3)~(9)的步驟直到收斂。
我們將游戲角色的行為簡化分為如表1所示四種,是把這組向量當作整個卷積神經(jīng)網(wǎng)絡輸入灰度矩陣后的輸出。
表1 游戲角色行為
然后選定Adam優(yōu)化器進行訓練。在20個epoch里選擇100個batch進行迭代,可以看到隨著訓練次數(shù)的下降,Lose Function的值不斷下降。這里選擇的Lose Function是整個分類的交叉熵,這個值可以反映Shannon信息論中兩個概率分布間的差異性信息。公式如下:
式中,p(x)為真實概率分布,也就是Label中相應分量的值的值;q(x)則是我們估計的結(jié)果相應分量的值。
在游戲過程中,我們可以通過不斷獲取截圖,讓之前訓練的模型進行預測從而給出此時應該做出的操作,并通過Python語言編程實現(xiàn)模擬鍵盤相應的按鍵按下操作,即可測試我們的游戲AI的實際效果。
圖1 AI的舉盾防御
我們在游戲的初始地區(qū)羅德蘭,通過敵人“游魂”進行測試??梢园l(fā)現(xiàn),在模型捕捉到畫面中的敵人有攻擊趨勢時按照一定的概率讓玩家采取了防御或向后翻滾的躲避策略。
我們在游戲的初始地區(qū)羅德蘭,通過敵人“游魂”進行測試??梢园l(fā)現(xiàn),在模型捕捉到畫面中的敵人在非防御狀態(tài)下會主動對敵人進行攻擊。
圖2 AI的攻擊行為
近年來,GPU處理速度的極大提高,機器學習和深度學習算法可獲取的巨大數(shù)據(jù)量。機器學習對游戲的開發(fā)方式產(chǎn)生巨大影響,視頻游戲開發(fā)越來越多地將機器學習作為游戲開發(fā)中的有用武器來智能地動態(tài)地響應玩家的動作。本文以《黑暗之魂》為例,展示如何利用深度學習技術(shù)讓角色實現(xiàn)自動化和自適應的攻擊與防御,塑造更加接近于人類行為的虛擬角色。研究之中的主要研究結(jié)果如下:一是通過Canny算子邊緣檢測方法,實現(xiàn)了將游戲UI變?yōu)榫唧w數(shù)值。并通過顏色空間的壓縮,對比度提高,將圖像所占用內(nèi)存大幅度降低,并更利于特征提取。使用Grab Cut方式實現(xiàn)了交互式的圖片主體提取。此步的主要意義在于為模型的訓練得到了大量數(shù)據(jù)。二是構(gòu)建了卷積神經(jīng)網(wǎng)絡,在基于深度學習的模型研究中,選擇AlexNet作為基礎模型,微調(diào)模型的超參數(shù),最終實現(xiàn)了誤差函數(shù)的顯著下降。三是將程序放在實際游戲環(huán)境中進行測試,展現(xiàn)了本論文提出的游戲AI確實可以模擬玩家在游戲中的部分行為。