天天看點

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

本文來自AI新媒體量子位(QbitAI)

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

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

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

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

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

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

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

比方對于下面這麼畫面。

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

接着一個運作RTMP子產品的Nginx伺服器,會收集這些資料流。

然後一幀幀的畫面被喂給AI,然後神經網絡在每一幀畫面上完成标注,抽取出遊戲對戰資訊。這個AI運作在GPU伺服器上。

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

△ 四中不同的英雄

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

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

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

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

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

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

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

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

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

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

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

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

在OpenCV的代碼裡,就是這樣:

由于視訊有壓縮,這種比對永遠不能達到完美,但隻要我們能讓比對度維持在90%,就能從每一幀畫面擷取可靠的位置。

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

我們在一個小程式中運作圖像比對h器時,能以每秒60次的頻率提取輸入視訊的幀,然後标記出角色和位置。這樣,就能很快生成大量的訓練資料。

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

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

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

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

我們用一些錄制好的視訊,試試看效果如何。首先,測試隻有一個英雄的畫面。

YOLO在這段視訊中表現良好。英雄出現在畫面中時,能被正确識别身份和位置。沒有英雄出現的時候,網絡也能正确對待。不錯!

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

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

連AI都在看《英雄聯盟》遊戲直播Part I:為什麼?Part II: 如何做到?Part III: AI的任務Part IV:YOLO網絡Part V:訓練AIPart VI:AI表現如何?Part VII:總結和後續

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

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

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

AI可以在一幀内識别多個英雄,即便訓練基于單個英雄完成。

隻在标準的雲平台上就能做到這些。

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

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

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

好吧,今天就說到這裡。

大吉大利,中午吃雞。

— 完 —

本文作者:李林 問耕

原文釋出時間:2017-09-09 

繼續閱讀