L'intelligenza artificiale nei videogames: analisi dei frame, Parte III

Vediamo come un algoritmo riesce a distinguere dei dati in un video, necessari per l'analisi che porterà all'individuazione delle meccaniche del gioco.

speciale L'intelligenza artificiale nei videogames: analisi dei frame, Parte III
Articolo a cura di

Nella prima parte di questo speciale abbiamo capito cos'è un'intelligenza artificiale distinguendola dai semplici bot o dalle CPU che si trovano in tutti i videogames attualmente sul mercato. In breve, un'AI è un algoritmo che può imparare dai dati che gli vengono forniti, rendendolo più ‘umano' ed imprevedibile degli script che conosciamo tutti. Nella seconda parte abbiamo approfondito il sistema di AI implementato nella ricerca del Georgia Institute of Technology che stiamo studiando, distinguendo l'Automated game playing dall'Automated game understanding: quest'ultimo è un caso di AI più recente che cerca di derivare tutte le meccaniche del gioco piuttosto che imparare a giocarlo per vincere, risultando quindi più generale. In questo speciale capiremo come l'algoritmo ideato dei ricercatori statunitensi riesce ad estrapolare informazioni dal gioco analizzando quello che accade a schermo prendendo come esempio Super Mario Bros.


Frame parsing

L'obiettivo dell'AI è capire come funziona il game engine, intenso come l'insieme di tutte le regole del videogame decise dagli sviluppatori: il salto di Mario deve essere compiuto da una superficie solida e non in aria, si interrompe quando incrontra un blocco o quando atterra su un piano, e via dicendo. L'AI, un algoritmo costituito da linee di codice, ha bisogno di un input, ovvero un ingresso, per avviare l'analisi necessaria a capire il game engine. L'input di un algoritmo può essere una stringa di caratteri (ad esempio la password che inserite quando avviate il vostro smartphone) o un segnale elettrico generico che ad esempio rappresenta un'immagine o un video. Nel nostro caso l'input è il video, che viene inviato dalla console allo schermo del televisore tramite un segnale elettrico che passa su un cavo (HDMI ad esempio) che contiene l'informazione per ogni pixel da riempire sul monitor in quel preciso istante. L'AI analizza questo segnale e quindi ogni singolo pixel in ogni singolo istante del gioco: se questo mostra 30 fps, ovvero 30 frame per secondo, l'algoritmo avrà a disposizione un certo numero di pixels per ogni immagine sullo schermo, moltiplicato per 30 ogni secondo. Il numero di dati da analizzare aumenta quanto più la sessione di gioco è lunga, dunque è necessaria una potenza computazionale non indifferente per studiare tutti gli input forniti dallo schermo. Questo limite impedisce a qualunque sviluppatore di implementare un'AI nei videogames, ma già stanno uscendo sul mercato esempi di elaboratori hardware dedicati come nel caso del SoC A11 di Apple.

Identificazione degli sprite in movimento

Per quanto il nome di questi algoritmi sia ‘intelligenza artificiale' purtroppo non sono così svegli come ci piace pensare. L'AI va aiutata nel suo processo di apprendimento, per evitare che questo duri un lasso di tempo troppo grande o che addirittura non riesca a capire cosa succeda a schermo. Nel nostro caso all'algoritmo è stato fornito un set di sprite usato dai programmatori di Super Mario Bros. per costruire i livelli di gioco. L'AI avrà a disposizione l'immagine di Mario, delle monete, dei blocchi distruttibili, dei nemici, delle nuvole, delle porzioni di sfondo, e via dicendo, tutti file .png: in poche parola, tutti gli oggetti sfruttati dai programmatori sono noti all'algoritmo e distinguibili l'uno dall'altro come entità diverse. Da qui il compito di identificare questi oggetti in movimento nei frame del gioco forniti come input è più rapido e semplice.

Per allenare l'AI oltre agli sprite è stato fornito un filmato di una sessione di gioco che parte dal primo livello fino ad arrivare alla fine del gioco stesso. Questo filmato permette al codice di effettuare la scansione di ogni frame all'interno del quale vengono identificati tutti gli sprite noti, così da collegarli nella successione di immagini che costituiscono quello che vediamo su schermo. Il codice riesce a capire la loro posizione perché i pixel sono disposti esattamente come una matrice, ovvero ognuno porta con sé il dato spaziale della riga e della colonna (esattamente come quando giocate a battaglia navale, ogni pixel ha un valore sull'asse orizzontale delle X e quello verticale delle Y). Dunque il codice deve, frame per frame, esaminare ogni singolo pixel riga per riga e i tutti i pixel vicini ad esso, per poi confrontarli con gli sprite dei modelli di Mario e tutti gli altri oggetti che ha in memoria. Affinché la relazione di uguaglianza tra i pixel su schermo e quelli che conosce l'AI sia soddisfatta i valori da confrontare devono essere numerici: infatti il pixel conterrà l'informazione sul colore da mostrare che di fatto è un numero (o più numeri se le informazioni sono RGB, rosso, verde e blu) e il codice stabilirà che questo è uguale al pixel in memoria se quest'informazione coincide a livello numerico.

Nel prossimo articolo faremo un passo avanti verso il concetto di comprensione del game engine, analizzando come l'algoritmo possa registrare un'animazione o capire la velocità di uno spostamento o ancora della visuale di gioco. Di fatto queste informazioni le scrivono i programmatori, perché ad oggi le intelligenze artificiali hanno bisogno di una programmazione molto guidata che gli suggerisca i concetti di base.