閱讀918 返回首頁    go 英雄聯盟


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

原作:Robert Hunt(FormDs創始人)

李林 問耕 編譯整理

量子位 出品 | 公眾號 QbitAI

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

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

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

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

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

Part I:為什麼?

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

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

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

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

比方對於下麵這麼畫麵。

要能像下麵這樣提取出核心信息。

Part II: 如何做到?

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

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

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

然後一幀幀的畫麵被喂給AI,然後神經網絡在每一幀畫麵上完成標注,抽取出遊戲對戰信息。這個AI運行在GPU服務器上。

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

Part III: AI的任務

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

四中不同的英雄

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

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

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

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

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

Part IV:YOLO網絡

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

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

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

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

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

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

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

Part V:訓練AI

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

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

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

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

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

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

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

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

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

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

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

找到血槽的位置之後,我們可以斷定英雄就在血槽下邊。在一幀原始畫麵上運行圖像分析,我們就得到了需要訓練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既沒有認出Ali,也沒有認出garen,卻認為畫麵中是特蘭德爾(trundle)。

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

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

Part VII:總結和後續

好的一麵

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

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

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

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

差的一麵

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

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

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

好吧,今天就說到這裏。

大吉大利,中午吃雞。

活動報名

加入社群

量子位AI社群8群開始招募啦,歡迎對AI感興趣的同學,加小助手微信qbitbot3入群;

此外,量子位專業細分群(自動駕駛、CV、NLP、機器學習等)正在招募,麵向正在從事相關領域的工程師及研究人員。

進群請加小助手微信號qbitbot3,並務必備注相應群的關鍵詞~通過審核後我們將邀請進群。(專業群審核較嚴,敬請諒解)

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界麵,回複“招聘”兩個字。

量子位QbitAI

վ ᴗ ի 追蹤AI技術和產品新動態

最後更新:2017-10-18 09:24:37

  上一篇:go 《英雄聯盟玩很6》即將來襲PDD、大司馬等主播辣眼走紅地毯
  下一篇:go 英雄聯盟是我玩的最差的一個遊戲,韋神如是說!