TechRoomage

連AI都在看《英雄聯盟》遊戲直播

0 1

原標題:連AI都在看《英雄聯盟》遊戲直播

原作:Robert Hunt(FormDs創始人)

李林 問耕 編譯整理

打遊戲和看人打遊戲,都是一種樂趣。

最近,吃雞主播約戰的事情峰迴路轉,最終還是沒能上演。不光有人在遊戲里使用外掛,看遊戲直播的也有「外掛」,你信不信?這是真的。

觀看遊戲直播的群里體,現在多了一個特殊觀眾:AI。

AI在看哪個遊戲的直播?不是最近大熱的吃雞,而是吃雞製作人一直想要超越的巔峰:《英雄聯盟》。

AI怎麼看?以及為什麼要看呢?

連AI都在看《英雄聯盟》遊戲直播

Part I:為什麼?

為什麼一個人工智慧要看遊戲直播?實際上,直播背後是這樣一種挑戰——讓AI實時理解影片中正在發生什麼,以及預測未來會發生什麼。

而遊戲是最好的訓練場之一。因為在遊戲環境中,可以生成大量的訓練數據,既容易又便宜。所以AI研究人員非常喜歡在遊戲領域搞事情。

你應該知道,所謂影片,不過是快速變化的一組圖片。速度大約是每秒顯示30或者60幀畫面。在《英雄聯盟》這款遊戲中,畫面上有隊友也有對手,每個玩家控制的遊戲角色都不一樣。對於一個看遊戲直播的AI來說,起碼要搞懂這幾件事:

英雄是誰?出現在哪?他們攻擊力有多強,以及如何攻擊對手。

比方對於下面這麼畫面。

連AI都在看《英雄聯盟》遊戲直播

要能像下面這樣提取出核心資訊。

連AI都在看《英雄聯盟》遊戲直播

Part II: 如何做到?

怎麼才能做到?先來看看整個流程。

首先引入一個直播影片流,抽出每一幀畫面,然後用AI進行逐一分析。這裡,通常使用OBS把捕捉的RTMP流,發送到我們的伺服器上。

接著一個運行RTMP模塊的Nginx伺服器,會收集這些數據流。

然後一幀幀的畫面被餵給AI,然後神經網路在每一幀畫面上完成標註,抽取出遊戲對戰資訊。這個AI運行在GPU伺服器上。

簡單來說,整個流程就是下面這張圖。

連AI都在看《英雄聯盟》遊戲直播

Part III: AI的任務

在《英雄聯盟》中,有上百種不同類型的英雄,AI需要能夠認出他們。

連AI都在看《英雄聯盟》遊戲直播

四中不同的英雄

此外每個英雄都是一個能夠全方位移動的3D模型,而且每個英雄都有不同的動作,AI需要在各種情況下認出對應的英雄,即便是亂戰的背景下。

連AI都在看《英雄聯盟》遊戲直播

畫面中的英雄會有各種變化

而且AI還需要搞清楚對手的位置。原因很簡單,距離跟戰鬥息息相關。

由於是處理實時遊戲直播,所以AI的處理速度得非常快,至少得能做到每秒處理60幀畫面,也就是說每一幀的處理時間要在16毫秒之內。

這中間有些處理技巧,比方你可以投入更多的伺服器來處理每幀畫面。而且最近幾年出現了很多處理實時影片的神經網路,直接從中選一個最好的來用就行。

Part IV:YOLO網路

YOLO是一個縮寫,代表You Only Look Once。顧名思義,這個演算法只看一眼,就知道一幀畫面里都有什麼(分類)以及都在哪裡(定位)。之前的網路都是分兩步完成,先進性分類,再進行定位。使用YOLO網路,兩步變一步。

下面這個影片中,借用一段007影片,展示了YOLO如何工作。

YOLO網路是由一個傳統的卷積神經網路,以及一個非常不同的最後一層以及損失函數組成。在最後一層中,YOLO網路需要包含分類和位置資訊。

連AI都在看《英雄聯盟》遊戲直播

YOLO網路還需要進一步把輸入分割成n×n個網格來描述位置,並在每一個單元上計算輸出。

連AI都在看《英雄聯盟》遊戲直播

提高YOLO網路位置精度的訣竅是,僅對處於單元中間位置的對象進行預測。由於包含高度和寬度兩個參數,所以對象可以跨越多個單元格。這種方法的缺點是,YOLO網路得想辦法解決一個網格內的多個對象。解決的辦法是複製每個網格中的輸出層,這會導致非常大的輸出層,參考如下公式:

n×n×m×(4+1+C)

關於YOLO,網上有很多相關資料可以進一步學習。

Part V:訓練AI

想讓AI幹什麼,就得用相應的數據訓練。上文中的007影片是用現實世界中人和物的數據集訓練的,想讓AI理解電子競技的影片流,我們需要用電子競技影片流中的畫面來訓練它。

YOLO網路很有意思的一點是,由於它對每個網格都獨立進行預測,我們可以用一個英雄來訓練網路,當一幀畫面中有多個英雄時,只要它們在不同的網格里,網路的操作是類似的。

這大大地簡化了訓練問題,因為我們我們只需要記錄遊戲中任何時間點,螢幕上只有一個已知英雄的畫面。細節不重要,不過遊戲支持訓練模式,我們可以指定哪個英雄出現。

我們可以錄製一個影片,然後從中提取圖像。我們知道有一個已知的英雄,但在做更多工作之前,並不知道英雄出現在畫面的什麼位置。

輸入畫面看起來是這樣的:

連AI都在看《英雄聯盟》遊戲直播

為了獲取英雄的位置,我們可以利用它頭上有個形狀固定且不旋轉的紅條,也就是血槽這一事實。英雄可以在3D空間移動,但它頭頂的紅色血槽和他自己的相對位置總是固定的。

但還有一個要注意的小問題,不同畫面上的血槽可能看起來不太一樣,他可能是空的,也可能是滿的,還有一些其他的視覺差異,比如說上面出現的數字。

連AI都在看《英雄聯盟》遊戲直播

所以,當我們尋找血槽時,需要一個無論它是滿的還是空的,上面數字是什麼,都能和它匹配上的特徵。

很幸運,血槽周圍區域和遮罩(mask)組合起來識別它。遮罩去除了有差異的區域,讓一直不變的區域顯示出來。

連AI都在看《英雄聯盟》遊戲直播

在OpenCV的程式碼里,就是這樣:

cv2.matchTemplate(frame, template, cv2.TM_CCORR_NORMED, mask=mask)

由於影片有壓縮,這種匹配永遠不能達到完美,但只要我們能讓匹配度維持在90%,就能從每一幀畫面獲取可靠的位置。

找到血槽的位置之後,我們可以斷定英雄就在血槽下邊。在一幀原始畫面上運行圖像分析,我們就得到了需要訓練AI去識別的位置。

連AI都在看《英雄聯盟》遊戲直播

我們在一個小程式中運行圖像匹配h器時,能以每秒60次的頻率提取輸入影片的幀,然後標記出角色和位置。這樣,就能很快生成大量的訓練數據。

實際上,我們還會選擇以慢一點的速度來生成訓練數據,每秒忽略一部分圖像,這樣能讓圖像之間差異更大。

最後,我們需要用這些輸入圖像和生成出來的角色、位置標籤來訓練AI。

我先嘗試了用Inception v3模型進行遷移學習,來訓練YOLO網路。網路在亞馬遜AWS雲p2.xlarge機器上,用每一類英雄1000張圖的訓練數據集訓練48小時。

我想說,AWS的AI類服務還是挺貴的,每小時90美分,48小時的訓練花了我40美元,幾乎是普通伺服器成本的10倍。

Part VI:AI表現如何?

我們用一些錄製好的影片,試試看效果如何。首先,測試只有一個英雄的畫面。

YOLO在這段影片中表現良好。英雄出現在畫面中時,能被正確識別身份和位置。沒有英雄出現的時候,網路也能正確對待。不錯!

不過涉及到多個英雄時,效果就沒那麼好了。比方下面這段影片,畫面中有兩個英雄,開始他們相互接近,然後又各自逃開。

當兩個英雄重疊時,AI有時只能辨認出一個英雄,而不是兩個。坦白說這也不奇怪,畢竟人眼可能都很難弄清楚實際情況。比方下面這幀畫面中,應該有兩個英雄:牛頭酋長(Ali)和蓋倫(garen),但AI只能正確認出一個。

連AI都在看《英雄聯盟》遊戲直播

還有一個問題。當兩個英雄重疊時,AI有可能會把他們認成一個完全不同的英雄。這顯然是一個不好的結果。比方下面這幀畫面中,雖然只是一秒鐘,但AI既沒有認出Ali,也沒有認出garen,卻認為畫面中是特蘭德爾(trundle)。

連AI都在看《英雄聯盟》遊戲直播

當兩個英雄分開,識別又正常了。

連AI都在看《英雄聯盟》遊戲直播

未來,我們可以有針對性的用重疊的英雄來訓練AI。

Part VII:總結和後續 好的一面

  • 追蹤英雄表現良好。大多數情況下,AI都能判斷英雄的角色和位置。

  • 速度很快,每幀的處理時間為50毫秒。

  • AI可以在一幀內識別多個英雄,即便訓練基於單個英雄完成。

  • 只在標準的雲平台上就能做到這些。

差的一面

  • 還處理不好位置重疊的英雄。

  • 現在速度雖然不慢了,但想要達到每秒60幀的標準,必須使用多個GPU交錯輸出。

接下來,還想嘗試不同的網路,不同類型的遊戲。關鍵的是,想找到一個真實世界的案例,可以圍繞直播影片用AI搭建一個產品。

好吧,今天就說到這裡。

大吉大利,中午吃雞。

Leave A Reply

Your email address will not be published.