給大家科普一下富達(dá)娛樂囟*83334(2022已更新(今日/知乎)
原作:Robert Hunt(FormDs創(chuàng)始人)
李林 問耕 編譯整理
量子位 出品 | 公眾號(hào) QbitAI打游戲和看人打游戲,都是一種樂趣。
最近,吃雞主播約戰(zhàn)的事情峰回路轉(zhuǎn),最終還是沒能上演。不光有人在游戲里使用外掛,看游戲直播的也有“外掛”,你信不信?這是真的。
觀看游戲直播的群里體,現(xiàn)在多了一個(gè)特殊觀眾:AI。
AI在看哪個(gè)游戲的直播?不是最近大熱的吃雞,而是吃雞制作人一直想要超越的巔峰:《英雄聯(lián)盟》。
AI怎么看?以及為什么要看呢?

Part I:為什么?
為什么一個(gè)人工智能要看游戲直播?實(shí)際上,直播背后是這樣一種挑戰(zhàn)——讓AI實(shí)時(shí)理解視頻中正在發(fā)生什么,以及預(yù)測(cè)未來會(huì)發(fā)生什么。
而游戲是最好的訓(xùn)練場(chǎng)之一。因?yàn)樵谟螒颦h(huán)境中,可以生成大量的訓(xùn)練數(shù)據(jù),既容易又便宜。所以AI研究人員非常喜歡在游戲領(lǐng)域搞事情。
你應(yīng)該知道,所謂視頻,不過是快速變化的一組圖片。速度大約是每秒顯示30或者60幀畫面。在《英雄聯(lián)盟》這款游戲中,畫面上有隊(duì)友也有對(duì)手,每個(gè)玩家控制的游戲角色都不一樣。對(duì)于一個(gè)看游戲直播的AI來說,起碼要搞懂這幾件事:
英雄是誰?出現(xiàn)在哪?他們攻擊力有多強(qiáng),以及如何攻擊對(duì)手。
比方對(duì)于下面這么畫面。

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

Part II: 如何做到?
怎么才能做到?先來看看整個(gè)流程。
首先引入一個(gè)直播視頻流,抽出每一幀畫面,然后用AI進(jìn)行逐一分析。這里,通常使用OBS把捕捉的RTMP流,發(fā)送到我們的服務(wù)器上。
接著一個(gè)運(yùn)行RTMP模塊的Nginx服務(wù)器,會(huì)收集這些數(shù)據(jù)流。
然后一幀幀的畫面被喂給AI,然后神經(jīng)網(wǎng)絡(luò)在每一幀畫面上完成標(biāo)注,抽取出游戲?qū)?zhàn)信息。這個(gè)AI運(yùn)行在GPU服務(wù)器上。
簡(jiǎn)單來說,整個(gè)流程就是下面這張圖。

Part III: AI的任務(wù)
在《英雄聯(lián)盟》中,有上百種不同類型的英雄,AI需要能夠認(rèn)出他們。

△ 四中不同的英雄
此外每個(gè)英雄都是一個(gè)能夠全方位移動(dòng)的3D模型,而且每個(gè)英雄都有不同的動(dòng)作,AI需要在各種情況下認(rèn)出對(duì)應(yīng)的英雄,即便是亂戰(zhàn)的背景下。

△ 畫面中的英雄會(huì)有各種變化
而且AI還需要搞清楚對(duì)手的位置。原因很簡(jiǎn)單,距離跟戰(zhàn)斗息息相關(guān)。
由于是處理實(shí)時(shí)游戲直播,所以AI的處理速度得非???,至少得能做到每秒處理60幀畫面,也就是說每一幀的處理時(shí)間要在16毫秒之內(nèi)。
這中間有些處理技巧,比方你可以投入更多的服務(wù)器來處理每幀畫面。而且最近幾年出現(xiàn)了很多處理實(shí)時(shí)視頻的神經(jīng)網(wǎng)絡(luò),直接從中選一個(gè)最好的來用就行。
Part IV:YOLO網(wǎng)絡(luò)
YOLO是一個(gè)縮寫,代表You Only Look Once。顧名思義,這個(gè)算法只看一眼,就知道一幀畫面里都有什么(分類)以及都在哪里(定位)。之前的網(wǎng)絡(luò)都是分兩步完成,先進(jìn)性分類,再進(jìn)行定位。使用YOLO網(wǎng)絡(luò),兩步變一步。
下面這個(gè)視頻中,借用一段007影片,展示了YOLO如何工作。

YOLO網(wǎng)絡(luò)是由一個(gè)傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò),以及一個(gè)非常不同的最后一層以及損失函數(shù)組成。在最后一層中,YOLO網(wǎng)絡(luò)需要包含分類和位置信息。

YOLO網(wǎng)絡(luò)還需要進(jìn)一步把輸入分割成n×n個(gè)網(wǎng)格來描述位置,并在每一個(gè)單元上計(jì)算輸出。

提高YOLO網(wǎng)絡(luò)位置精度的訣竅是,僅對(duì)處于單元中間位置的對(duì)象進(jìn)行預(yù)測(cè)。由于包含高度和寬度兩個(gè)參數(shù),所以對(duì)象可以跨越多個(gè)單元格。這種方法的缺點(diǎn)是,YOLO網(wǎng)絡(luò)得想辦法解決一個(gè)網(wǎng)格內(nèi)的多個(gè)對(duì)象。解決的辦法是復(fù)制每個(gè)網(wǎng)格中的輸出層,這會(huì)導(dǎo)致非常大的輸出層,參考如下公式:
n×n×m×(4+1+C)
關(guān)于YOLO,網(wǎng)上有很多相關(guān)資料可以進(jìn)一步學(xué)習(xí)。
Part V:訓(xùn)練AI
想讓AI干什么,就得用相應(yīng)的數(shù)據(jù)訓(xùn)練。上文中的007視頻是用現(xiàn)實(shí)世界中人和物的數(shù)據(jù)集訓(xùn)練的,想讓AI理解電子競(jìng)技的視頻流,我們需要用電子競(jìng)技視頻流中的畫面來訓(xùn)練它。
YOLO網(wǎng)絡(luò)很有意思的一點(diǎn)是,由于它對(duì)每個(gè)網(wǎng)格都獨(dú)立進(jìn)行預(yù)測(cè),我們可以用一個(gè)英雄來訓(xùn)練網(wǎng)絡(luò),當(dāng)一幀畫面中有多個(gè)英雄時(shí),只要它們?cè)诓煌木W(wǎng)格里,網(wǎng)絡(luò)的操作是類似的。
這大大地簡(jiǎn)化了訓(xùn)練問題,因?yàn)槲覀兾覀冎恍枰涗浻螒蛑腥魏螘r(shí)間點(diǎn),屏幕上只有一個(gè)已知英雄的畫面。細(xì)節(jié)不重要,不過游戲支持訓(xùn)練模式,我們可以指定哪個(gè)英雄出現(xiàn)。
我們可以錄制一個(gè)視頻,然后從中提取圖像。我們知道有一個(gè)已知的英雄,但在做更多工作之前,并不知道英雄出現(xiàn)在畫面的什么位置。
輸入畫面看起來是這樣的:

為了獲取英雄的位置,我們可以利用它頭上有個(gè)形狀固定且不旋轉(zhuǎn)的紅條,也就是血槽這一事實(shí)。英雄可以在3D空間移動(dòng),但它頭頂?shù)募t色血槽和他自己的相對(duì)位置總是固定的。
但還有一個(gè)要注意的小問題,不同畫面上的血槽可能看起來不太一樣,他可能是空的,也可能是滿的,還有一些其他的視覺差異,比如說上面出現(xiàn)的數(shù)字。

所以,當(dāng)我們尋找血槽時(shí),需要一個(gè)無論它是滿的還是空的,上面數(shù)字是什么,都能和它匹配上的特征。
很幸運(yùn),血槽周圍區(qū)域和遮罩(mask)組合起來識(shí)別它。遮罩去除了有差異的區(qū)域,讓一直不變的區(qū)域顯示出來。

在OpenCV的代碼里,就是這樣:
由于視頻有壓縮,這種匹配永遠(yuǎn)不能達(dá)到完美,但只要我們能讓匹配度維持在90%,就能從每一幀畫面獲取可靠的位置。
找到血槽的位置之后,我們可以斷定英雄就在血槽下邊。在一幀原始畫面上運(yùn)行圖像分析,我們就得到了需要訓(xùn)練AI去識(shí)別的位置。

我們?cè)谝粋€(gè)小程序中運(yùn)行圖像匹配h器時(shí),能以每秒60次的頻率提取輸入視頻的幀,然后標(biāo)記出角色和位置。這樣,就能很快生成大量的訓(xùn)練數(shù)據(jù)。
實(shí)際上,我們還會(huì)選擇以慢一點(diǎn)的速度來生成訓(xùn)練數(shù)據(jù),每秒忽略一部分圖像,這樣能讓圖像之間差異更大。
最后,我們需要用這些輸入圖像和生成出來的角色、位置標(biāo)簽來訓(xùn)練AI。
我先嘗試了用Inception v3模型進(jìn)行遷移學(xué)習(xí),來訓(xùn)練YOLO網(wǎng)絡(luò)。網(wǎng)絡(luò)在亞馬遜AWS云p2.xlarge機(jī)器上,用每一類英雄1000張圖的訓(xùn)練數(shù)據(jù)集訓(xùn)練48小時(shí)。
我想說,AWS的AI類服務(wù)還是挺貴的,每小時(shí)90美分,48小時(shí)的訓(xùn)練花了我40美元,幾乎是普通服務(wù)器成本的10倍。
Part VI:AI表現(xiàn)如何?
我們用一些錄制好的視頻,試試看效果如何。首先,測(cè)試只有一個(gè)英雄的畫面。

YOLO在這段視頻中表現(xiàn)良好。英雄出現(xiàn)在畫面中時(shí),能被正確識(shí)別身份和位置。沒有英雄出現(xiàn)的時(shí)候,網(wǎng)絡(luò)也能正確對(duì)待。不錯(cuò)!
不過涉及到多個(gè)英雄時(shí),效果就沒那么好了。比方下面這段視頻,畫面中有兩個(gè)英雄,開始他們相互接近,然后又各自逃開。

當(dāng)兩個(gè)英雄重疊時(shí),AI有時(shí)只能辨認(rèn)出一個(gè)英雄,而不是兩個(gè)。坦白說這也不奇怪,畢竟人眼可能都很難弄清楚實(shí)際情況。比方下面這幀畫面中,應(yīng)該有兩個(gè)英雄:牛頭酋長(zhǎng)(Ali)和蓋倫(garen),但AI只能正確認(rèn)出一個(gè)。
還有一個(gè)問題。當(dāng)兩個(gè)英雄重疊時(shí),AI有可能會(huì)把他們認(rèn)成一個(gè)完全不同的英雄。這顯然是一個(gè)不好的結(jié)果。比方下面這幀畫面中,雖然只是一秒鐘,但AI既沒有認(rèn)出Ali,也沒有認(rèn)出garen,卻認(rèn)為畫面中是特蘭德爾(trundle)。
當(dāng)兩個(gè)英雄分開,識(shí)別又正常了。
未來,我們可以有針對(duì)性的用重疊的英雄來訓(xùn)練AI。
Part VII:總結(jié)和后續(xù)
好的一面
追蹤英雄表現(xiàn)良好。大多數(shù)情況下,AI都能判斷英雄的角色和位置。速度很快,每幀的處理時(shí)間為50毫秒。AI可以在一幀內(nèi)識(shí)別多個(gè)英雄,即便訓(xùn)練基于單個(gè)英雄完成。只在標(biāo)準(zhǔn)的云平臺(tái)上就能做到這些。差的一面
還處理不好位置重疊的英雄?,F(xiàn)在速度雖然不慢了,但想要達(dá)到每秒60幀的標(biāo)準(zhǔn),必須使用多個(gè)GPU交錯(cuò)輸出。接下來,還想嘗試不同的網(wǎng)絡(luò),不同類型的游戲。關(guān)鍵的是,想找到一個(gè)真實(shí)世界的案例,可以圍繞直播視頻用AI搭建一個(gè)產(chǎn)品。
好吧,今天就說到這里。
大吉大利,中午吃雞。
— 完 —
歡迎大家關(guān)注我們的專欄:量子位 - 知乎專欄
誠(chéng)摯招聘
量子位正在招募編輯/記者,工作地點(diǎn)在北京中關(guān)村。期待有才氣、有熱情的同學(xué)加入我們!相關(guān)細(xì)節(jié),請(qǐng)?jiān)诹孔游还娞?hào)(QbitAI)對(duì)話界面,回復(fù)“招聘”兩個(gè)字。
?? ? 追蹤AI技術(shù)和產(chǎn)品新動(dòng)態(tài)
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。