web-dev-qa-db-fra.com

Comment former un réseau neuronal artificiel pour jouer à Diablo 2 en utilisant une entrée visuelle?

J'essaie actuellement d'obtenir un ANN pour jouer à un jeu vidéo et j'espérais obtenir de l'aide de la merveilleuse communauté ici.

Je me suis installé sur Diablo 2. Le jeu se fait donc en temps réel et d'un point de vue isométrique, le joueur contrôlant un seul avatar sur lequel la caméra est centrée.

Pour concrétiser les choses, la tâche consiste à obtenir des points d'expérience de votre personnage x sans que sa santé tombe à 0, où des points d'expérience sont gagnés en tuant des monstres. Voici un exemple de gameplay:

here

Maintenant, comme je veux que le réseau fonctionne uniquement sur la base des informations qu'il obtient des pixels de l'écran, il doit apprendre une représentation très riche pour jouer efficacement, car cela nécessiterait vraisemblablement qu'il sache (implicitement au moins) comment divisez le monde du jeu en objets et comment interagir avec eux.

Et toutes ces informations doivent être transmises au net ... d'une manière ou d'une autre. Je ne peux pas pour la vie de moi penser à comment entraîner cette chose. Ma seule idée est d'avoir un programme séparé pour extraire visuellement quelque chose de naturellement bon/mauvais dans le jeu (par exemple la santé, l'or, l'expérience) de l'écran, puis utiliser cette statistique dans une procédure d'apprentissage par renforcement. Je pense que ce sera partie de la réponse, mais je ne pense pas que ce sera suffisant; il y a tout simplement trop de niveaux d'abstraction, de l'entrée visuelle brute au comportement axé sur les objectifs pour que ces commentaires limités entraînent un réseau au cours de ma vie.

Donc, ma question: à quelles autres façons pouvez-vous penser pour former un filet à faire au moins une partie de cette tâche? de préférence sans faire des milliers d'exemples étiquetés ...

Juste pour un peu plus de direction: je cherche d'autres sources d'apprentissage par renforcement et/ou des méthodes non supervisées pour extraire des informations utiles dans ce cadre. Ou un algorithme supervisé si vous pouvez penser à un moyen d'extraire des données étiquetées d'un monde de jeu sans avoir à l'étiqueter manuellement.

MISE À JOUR (27/04/12):

Étrangement, je travaille toujours là-dessus et semble progresser. Le plus grand secret pour faire fonctionner un contrôleur ANN est d'utiliser les architectures ANN les plus avancées adaptées à la tâche. Par conséquent, j'utilise un filet de croyance profond composé de machines Boltzmann conditionnelles restreintes que j'ai entraîné sans surveillance (sur une vidéo de moi jouant au jeu) avant réglage fin avec rétropropagation de la différence temporelle (c'est-à-dire apprentissage par renforcement avec des ANN à action directe standard).

Toujours à la recherche de données plus utiles, en particulier sur le problème de la sélection des actions en temps réel et sur la façon d'encoder les images en couleur pour le traitement ANN: -)

MISE À JOUR (21/10/15):

Je me souviens juste d'avoir posé cette question dans la journée et j'ai pensé que je devrais mentionner que ce n'était plus une idée folle. Depuis ma dernière mise à jour, DeepMind a publié leur nature article sur l'obtention de réseaux neuronaux pour jouer à des jeux atari à partir d'entrées visuelles . En effet, la seule chose qui m'empêche d'utiliser leur architecture pour jouer, un sous-ensemble limité, de Diablo 2 est le manque d'accès au moteur de jeu sous-jacent. Le rendu à l'écran, puis sa redirection vers le réseau est tout simplement trop lent pour s'entraîner dans un délai raisonnable. Ainsi, nous ne verrons probablement pas ce type de bot jouer à Diablo 2 de sitôt, mais uniquement parce qu'il jouera quelque chose soit open-source soit avec un accès API à la cible de rendu. (tremblement peut-être?)

130
zergylord

Je peux voir que vous êtes inquiet sur la façon de former l'ANN, mais ce projet cache une complexité que vous pourriez ne pas connaître. Reconnaissance d'objets/de caractères sur les jeux informatiques à travers traitement d'image c'est une tâche très difficile (pas dire fou pour les jeux FPS et RPG). Je ne doute pas de vos compétences et je ne dis pas non plus que cela ne peut pas être fait, mais vous pouvez facilement passer 10 fois plus de temps à reconnaître des choses qu'à implémenter l'ANN lui-même (en supposant que vous avez déjà de l'expérience avec traitement d'image numérique techniques).

Je pense que votre idée est très intéressante et également très ambitieuse . À ce stade, vous voudrez peut-être le reconsidérer. J'ai l'impression que ce projet est quelque chose que vous planifiez pour l'université, donc si l'objectif du travail est vraiment ANN, vous devriez probablement choisir un autre jeu, quelque chose de plus simple.

Je me souviens que quelqu'un d'autre est venu chercher des conseils sur un projet différent mais en quelque sorte similaire il n'y a pas si longtemps. Cela vaut la peine de le vérifier.

D'un autre côté, il pourrait y avoir des approches meilleures/plus faciles pour identifier les objets dans le jeu si vous acceptez des suggestions. Mais d'abord, appelons ce projet pour ce que vous voulez qu'il soit: un smart-bot .

Une méthode pour implémenter les bots accède à la mémoire du client du jeu pour trouver des informations pertinentes, telles que l'emplacement du personnage sur l'écran et sa santé. La lecture de la mémoire de l'ordinateur est triviale, mais il n'est pas possible de savoir exactement où chercher dans la mémoire. Les scanners de mémoire comme Cheat Engine peuvent être très utiles pour cela.

Une autre méthode , qui fonctionne sous le jeu, consiste à manipuler les informations de rendu. Tous les objets du jeu doivent être rendus à l'écran. Cela signifie que les emplacements de tous les objets 3D seront éventuellement envoyés à la carte vidéo pour traitement. Soyez prêt pour un débogage sérieux.

Dans cette réponse, j'ai brièvement décrit 2 méthodes pour accomplir ce que vous voulez grâce au traitement d'image. Si vous êtes intéressé par eux, vous pouvez en trouver plus sur Exploiting Online Games (chapitre 6), un excellent livre sur le sujet.

51
karlphillip

MISE À JOUR 2018-07-26: C'est tout! Nous approchons maintenant du point où ce type de jeu sera résolu! En utilisant OpenAI et basé sur le jeu DotA 2, une équipe pourrait faire une IA qui peut battre des joueurs semi-professionnels dans un jeu 5v5 . Si vous connaissez DotA 2, vous savez que ce jeu est assez similaire aux jeux de type Diablo en termes de mécanique, mais on pourrait dire qu'il est encore plus compliqué à cause du jeu en équipe.

Comme prévu, cela a été réalisé grâce aux dernières avancées de l'apprentissage par renforcement avec l'apprentissage en profondeur, et en utilisant des cadres de jeu ouverts comme OpenAI qui facilitent le développement d'une IA car vous obtenez une API soignée et aussi parce que vous pouvez accélérer le jeu (l'IA jouée l'équivalent de 180 ans de gameplay contre lui-même tous les jours!).

Le 5 août 2018 (dans 10 jours!) , il est prévu de confronter cette IA aux meilleurs joueurs de DotA 2. Si cela fonctionne, attendez-vous à une grande révolution, peut-être pas aussi médiatisée que la résolution du jeu Go, mais ce sera néanmoins une étape importante pour les jeux AI!

MISE À JOUR 2017-01: Le domaine évolue très rapidement depuis le succès d'AlphaGo, et il existe de nouveaux cadres pour faciliter le développement d'algorithmes d'apprentissage automatique sur les jeux presque tous les mois. Voici une liste des derniers que j'ai trouvés:

  • OpenAI's Universe : une plateforme pour jouer à pratiquement n'importe quel jeu en utilisant l'apprentissage automatique . L'API est en Python, et elle exécute les jeux derrière un environnement de bureau à distance VNC, afin qu'elle puisse capturer les images de n'importe quel jeu! Vous pouvez probablement utiliser Univers pour jouer à Diablo II grâce à un algorithme d'apprentissage automatique!
  • OpenAI's Gym : Similaire à Univers mais ciblant spécifiquement les algorithmes d'apprentissage par renforcement (c'est donc une sorte de généralisation du cadre utilisé par AlphaGo mais avec beaucoup plus de jeux). Il y a n cours sur Udemy couvrant l'application du machine learning à des jeux comme breakout ou Doom utilisant OpenAI Gym.
  • TorchCraft : un pont entre Torch (framework d'apprentissage automatique) et StarCraft: Brood War.
  • pyGTA5 : un projet de construction de voitures autonomes dans GTA5 en utilisant uniquement des captures d'écran (avec beaucoup de vidéos en ligne ).

Des moments très excitants!

MISE À JOUR IMPORTANTE (2016-06): Comme indiqué par OP, ce problème de formation des réseaux artificiels à jouer à des jeux utilisant uniquement des entrées visuelles est maintenant abordé par plusieurs des institutions sérieuses, avec des résultats assez prometteurs, comme DeepMind Deep-Qlearning-Network (DQN) .

Et maintenant, si vous voulez relever le défi de niveau suivant, vous pouvez utiliser l'une des différentes plates-formes de développement de jeux de vision AI telles que - ViZDoom , une plateforme hautement optimisée (7000 ips) pour entraîner les réseaux à jouer à Doom en utilisant uniquement des entrées visuelles:

ViZDoom permet de développer des robots IA qui jouent à Doom en utilisant uniquement les informations visuelles (le tampon d'écran). Il est principalement destiné à la recherche en apprentissage visuel machine, et en particulier à l'apprentissage par renforcement profond. ViZDoom est basé sur ZDoom pour fournir la mécanique du jeu.

Et les résultats sont assez étonnants, voir les vidéos sur leur page web et le Tutoriel sympa (en Python) ici!

Il existe également un projet similaire pour Quake 3 Arena, appelé Quagents , qui fournit également un accès API facile aux données de jeu sous-jacentes, mais vous pouvez le supprimer et utiliser des captures d'écran et l'API uniquement pour contrôler votre agent.

Pourquoi une telle plateforme est-elle utile si nous n'utilisons que des captures d'écran? Même si vous n'accédez pas aux données de jeu sous-jacentes, une telle plateforme fournit:

  • haute performance implémentation de jeux (vous pouvez générer plus de données/jeux/générations d'apprentissage avec moins de temps pour que vos algorithmes d'apprentissage puissent converger plus rapidement!).
  • une API simple et réactive pour contrôler vos agents (par exemple, si vous essayez d'utiliser des entrées humaines pour contrôler un jeu, certaines de vos commandes peuvent être perdues, de sorte que vous feriez également face à la non-fiabilité de vos sorties ...).
  • configuration facile de scénarios personnalisés .
  • rendu personnalisable (peut être utile pour "simplifier" les images que vous obtenez pour faciliter le traitement)
  • lecture synchronisée ("tour par tour") (donc vous n'avez pas besoin que votre algorithme fonctionne en temps réel au début, c'est une énorme réduction de complexité ).
  • fonctionnalités de commodité supplémentaires telles que la compatibilité multiplateforme, la rétrocompatibilité (vous ne risquez plus que votre bot ne fonctionne plus avec le jeu lors d'une nouvelle mise à jour du jeu), etc.

Pour résumer, le grand avantage de ces plates-formes est qu'elles elles atténuent une grande partie des problèmes techniques précédents auxquels vous avez dû faire face (comment manipuler les entrées du jeu, comment pour configurer des scénarios, etc.) afin que vous n'ayez plus qu'à gérer l'algorithme d'apprentissage lui-même.

Alors maintenant, mettez-vous au travail et faites de nous le meilleur robot visuel d'IA de tous les temps;)


Ancien article décrivant les problèmes techniques du développement d'une IA reposant uniquement sur des entrées visuelles:

Contrairement à certains de mes collègues ci-dessus, je ne pense pas que ce problème soit insoluble. Mais c'est sûrement difficile!

Le premier problème comme indiqué ci-dessus est celui de la représentation de l'état du jeu : vous ne pouvez pas représenter l'état complet avec une seule image , vous devez maintenir une sorte de mémorisation (santé mais aussi objets équipés et objets disponibles à utiliser, quêtes et objectifs, etc.). Pour récupérer ces informations, vous avez deux possibilités: soit en accédant directement aux données du jeu, qui sont les plus fiables et les plus faciles; ou bien vous pouvez créer une représentation abstraite de ces informations en mettant en œuvre des procédures simples (ouvrir l'inventaire, faire une capture d'écran, extraire les données). Bien sûr, extraire des données d'une capture d'écran vous obligera à mettre en place une procédure supervisée (que vous définissez complètement) ou sans supervision (via un algorithme d'apprentissage automatique, mais cela augmentera considérablement la complexité ...). Pour un apprentissage automatique non supervisé, vous devrez utiliser un type assez récent d'algorithmes appelés algorithmes d'apprentissage structurel (qui apprennent la structure des données plutôt que la façon de les classer ou de prédire une valeur). Un tel algorithme est le réseau neuronal récursif (à ne pas confondre avec le réseau neuronal récurrent) de Richard Socher: http://techtalks.tv/talks/54422/

Ensuite, un autre problème est que même lorsque vous avez récupéré toutes les données dont vous avez besoin, le jeu n'est que partiellement observable . Ainsi, vous devez injecter un modèle abstrait du monde et le nourrir avec des informations traitées du jeu, par exemple l'emplacement de votre avatar, mais également l'emplacement des objets de quête, des objectifs et des ennemis en dehors de l'écran. Vous pouvez peut-être vous renseigner sur les filtres à particules pour mélanges de Vermaak 2003.

De plus, vous devez disposer d'un agent autonome , avec objectifs générés dynamiquement . Une architecture bien connue que vous pouvez essayer est l'agent BDI, mais vous devrez probablement la modifier pour que cette architecture fonctionne dans votre cas pratique. Comme alternative, il y a aussi le filet de Petri récursif, que vous pouvez probablement combiner avec toutes sortes de variations des réseaux de Petri pour obtenir ce que vous voulez car c'est un cadre très bien étudié et flexible, avec une grande formalisation et des procédures de preuve.

Et enfin, même si vous faites tout ce qui précède, vous devrez trouver un moyen d'émuler le jeu en vitesse accélérée (l'utilisation d'une vidéo peut être Bien, mais le problème est que votre algorithme ne spectera que sans contrôle, et pouvoir essayer par lui-même est très important pour l'apprentissage). En effet, il est bien connu que l'algorithme de pointe actuel prend beaucoup plus de temps pour apprendre la même chose qu'un humain peut apprendre (encore plus avec l'apprentissage par renforcement), donc s'il ne peut pas accélérer le processus ( c'est-à-dire, si vous ne pouvez pas accélérer le temps de jeu), votre algorithme ne convergera même pas en une seule vie ...

Pour conclure, ce que vous voulez atteindre ici est à la limite (et peut-être un peu au-delà) des algorithmes de pointe actuels . Je pense que cela peut être possible, mais même si c'est le cas, vous allez passer beaucoup de temps , car ce n'est pas un problème théorique mais un problème pratique que vous approchez ici, et donc vous devez implémenter et combiner de nombreuses approches d'IA différentes afin de le résoudre.

Plusieurs décennies de recherche avec une équipe entière travaillant dessus pourraient ne pas suffire, donc si vous êtes seul et travaillez dessus à temps partiel (comme vous avez probablement un travail pour vivre), vous pouvez passer toute une vie sans atteindre n'importe où près une solution de travail.

Donc, mon conseil le plus important ici serait que vous réduisez vos attentes et essayez de réduire la complexité de votre problème en utilisant toutes les informations que vous pouvez, et évitez autant que possible de vous fier aux captures d'écran (c'est-à-dire, essayez de vous connecter directement au jeu, recherchez DLL injection), et simplifiez certains problèmes en mettant en œuvre des procédures supervisées, ne laissez pas votre algorithme apprendre tout (c.-à-d., abandonner le traitement d'image pour l'instant autant que possible et s'appuyer sur les informations internes du jeu, plus tard si votre algorithme fonctionne bien, vous pouvez remplacer certaines parties de votre programme d'IA par un traitement d'image, atteignant ainsi progressivement votre objectif complet, par exemple si vous pouvez faire fonctionner quelque chose assez bien, vous pouvez essayer de complexifier votre problème et remplacer les procédures supervisées et les données de jeu de mémoire par des algorithmes d'apprentissage automatique non supervisés sur les captures d'écran).

Bonne chance, et si cela fonctionne, assurez-vous de publier un article, vous pouvez sûrement être réputé pour résoudre un problème pratique aussi difficile!

41
gaborous

Le problème que vous poursuivez est insoluble dans la façon dont vous l'avez défini. C'est généralement une erreur de penser qu'un réseau de neurones apprendrait "par magie" une riche représentation d'un problème. Un bon fait à garder à l'esprit pour décider si ANN est le bon outil pour une tâche est qu'il s'agit d'une méthode d'interpolation. Réfléchissez, si vous pouvez définir votre problème comme une approximation d'une fonction, où vous avez de nombreux points de cette fonction et beaucoup de temps pour concevoir le réseau et le former.

Le problème que vous proposez ne passe pas ce test. Le contrôle du jeu n'est pas une fonction de l'image à l'écran. Il y a beaucoup d'informations que le joueur doit garder en mémoire. Pour un exemple simple, il est souvent vrai que chaque fois que vous entrez dans une boutique dans un jeu, l'écran a la même apparence. Cependant, ce que vous achetez dépend des circonstances. Peu importe la complexité du réseau, si les pixels de l'écran sont son entrée, il effectuerait toujours la même action lors de son entrée dans le magasin.

D'ailleurs, il y a le problème de l'échelle. La tâche que vous proposez est tout simplement trop compliquée à apprendre dans un délai raisonnable. Vous devriez voir aigamedev.com pour savoir comment fonctionne l'IA de jeu. Les réseaux de neurones artificiels ont été utilisés avec succès dans certains jeux, mais de manière très limitée. L'IA de jeu est difficile et souvent coûteuse à développer. S'il y avait une approche générale de la construction de réseaux de neurones fonctionnels, l'industrie l'aurait très probablement saisie. Je vous recommande de commencer avec des exemples beaucoup plus simples, comme tic-tac-toe.

26
Don Reba

Il semble que le cœur de ce projet explore ce qui est possible avec un ANN, je suggère donc de choisir un jeu où vous n'avez pas à traiter avec le traitement d'image (qui, d'après les réponses des autres ici, semble être un vraiment tâche difficile dans un jeu en temps réel). Vous pouvez utiliser l'API Starcraft pour créer votre bot, ils vous donnent accès à tous les états de jeu pertinents.

http://code.google.com/p/bwapi/

17
tstramer

En supposant à tout moment que vous pourriez générer un ensemble de "résultats" (pouvant impliquer des probabilités) à partir d'un ensemble de tous les "mouvements" possibles, et qu'il existe une certaine notion de cohérence dans le jeu (par exemple, vous pouvez jouer le niveau X encore et encore) à nouveau), vous pouvez commencer avec N réseaux de neurones avec des poids aléatoires, et demander à chacun d'eux de jouer au jeu de la manière suivante:

1) Pour chaque "mouvement" possible, générez une liste de "résultats" possibles (avec probabilités associées) 2) Pour chaque résultat, utilisez votre réseau neuronal pour déterminer la "valeur" (score) associée du "résultat" (par exemple, un nombre compris entre -1 et 1, 1 étant le meilleur résultat possible, -1 étant le pire) 3) Choisissez le "coup" menant au score prob * le plus élevé 4) Si le coup a mené à une "victoire" ou à une "perte", arrêter, sinon revenir à l'étape 1.

Après un certain temps (ou une "victoire"/"perte"), évaluez la proximité du réseau neuronal avec le "but" (cela impliquera probablement une certaine connaissance du domaine). Ensuite, jetez les 50% (ou un autre pourcentage) des NN les plus éloignés de l'objectif, effectuez un croisement/une mutation des 50% supérieurs et exécutez à nouveau le nouvel ensemble de NN. Continuez à courir jusqu'à ce qu'un NN satisfaisant sorte.

1
tstramer

Je pense que votre meilleur pari serait une architecture complexe impliquant quelques réseaux/peut-être: c'est-à-dire un qui reconnaît et répond aux objets, un pour la boutique, un pour le combat (peut-être ici vous en aurez besoin d'un pour la reconnaissance de l'ennemi, un pour les attaques), etc. .

Essayez alors de penser au gameplay le plus simple possible de Diablo II, probablement un Barbare. Ensuite, restez simple au début, comme pour l'acte I, première zone uniquement.

Ensuite, je suppose que des "objectifs" précieux seraient la disparition d'objets ennemis et la diminution de la barre de santé (notée inversement).

Une fois que vous avez pris en charge ces tâches distinctes "plus simples", vous pouvez utiliser un ANN "maître" pour décider quel sous-ANN activer.

En ce qui concerne la formation, je ne vois que trois options: vous pouvez utiliser la méthode évolutive décrite ci-dessus, mais vous devez ensuite sélectionner manuellement les `` gagnants '', sauf si vous codez un programme distinct pour cela. Vous pourriez demander aux réseaux de "regarder" quelqu'un jouer. Ici, ils apprendront à imiter le style d'un joueur ou d'un groupe de joueurs. Le réseau essaie de prédire la prochaine action du joueur, se renforce pour une estimation correcte, etc. Si vous obtenez réellement l'ANN que vous voulez, cela pourrait être fait avec un gameplay vidéo, pas besoin de gameplay en direct réel. Enfin, vous pouvez laisser le réseau jouer le jeu, avoir des morts ennemies, des augmentations de niveau, des points de vie retrouvés, etc. comme renforcement positif et des décès de joueurs, des pertes de santé, etc. comme renforcement négatif. Mais vu que même un simple réseau nécessite des milliers d'étapes de formation concrètes pour apprendre des tâches même simples, vous auriez besoin de beaucoup de patience pour celui-ci.

Dans l'ensemble, votre projet est très ambitieux. Pour ma part, je pense que cela pourrait "en théorie être fait", avec suffisamment de temps.

J'espère que ça aide et bonne chance!

1

Dans un premier temps, vous pourriez examiner la différence d'images consécutives. Vous devez faire la distinction entre les sprites d'arrière-plan et les monstres réels. Je suppose que le monde peut également contenir des animations. Afin de trouver ceux-ci, je voudrais que le personnage se déplace et recueille tout ce qui bouge avec le monde dans une grande image/animation de fond.

Vous pouvez détecter et identifier les ennemis avec corrélation (en utilisant FFT). Cependant, si les animations se répètent au pixel près, il sera plus rapide de ne regarder que quelques valeurs de pixels. Votre tâche principale sera d'écrire un système robuste qui identifiera quand un nouvel objet apparaît à l'écran et va progressivement tous les cadres du cadre Sprite dans une base de données. Vous devrez probablement également créer des modèles d'effets d'arme. Ceux-ci doivent être soustraits afin de ne pas encombrer votre base de données adversaire.

1
whoplisp