[PYTHON] J'ai capturé le projet Toho avec Deep Learning ... je le voulais.

(PostScript 16/08/2017)

Cet article est basé sur cette connaissance de l'époque. Il contient des erreurs évidentes, j'espère donc que vous pourrez vous y référer modérément.


Il est encore un peu tôt à la mi-février, mais c'est une température à deux chiffres chaque jour et c'est le printemps. Je pense que les nouvelles de "Sakurasaku" ont commencé à atteindre les gens qui regardent ici. ~~ D'un autre côté, j'ai perdu 5 emplois consécutifs. ~~

À propos, il y a environ trois semaines, "Google's Go AI'AlphaGo' remporte le joueur de jeu professionnel pour la première fois de l'histoire" Des nouvelles choquantes sont arrivées. Le Go est considéré comme un problème non résolu, et je venais de parler de «cela pourrait être utilisé pour l'évaluation» l'autre jour, j'ai donc été très surpris d'apprendre qu'il avait déjà été réglé en octobre de l'année dernière. Et en même temps, j'y ai pensé.

«N'y a-t-il pas beaucoup de problèmes qui ont déjà été résolus simplement parce que nous ne savons pas? 』\

Cela peut paraître surprenant, mais en fait, certains jeux ont déjà apprendre un meilleur comportement que les humains. .. (Ici est très détaillé) Le Deep Q-Network utilisé dans cette vidéo est une méthode de 2013, et le document à l'époque utilisait un modèle très simple. En revanche, dans le domaine du traitement d'images, les recherches ont progressé ces dernières années, et l'efficacité d'un modèle bien plus difficile que celui utilisé dans le Deep Q-Network a été reconnue. Le résultat d'AlphaGo est également la rétroaction d'un tel traitement d'image. Donc, «Si vous apportez une technologie de traitement d'image comme AlphaGo, ou même plus avancée qu'AlphaGo, il peut être possible de capturer des jeux d'action compliqués qui n'ont pas été essayés sans utiliser d'informations privilégiées. J'ai pensé.

Il s'agit d'une trajectoire de deux semaines d'un étudiant qui a réfléchi à cela et a agi.

Contexte

Deep Q-Network et des études similaires utilisent principalement le jeu Atari 2600 sorti en 1977 comme référence. C'est en partie parce que la bibliothèque est complète, mais la raison principale est qu'il est difficile de capturer des jeux plus complexes que l'Atari 2600. Les jeux d'action 3D sont considérés comme difficiles, notamment en raison de la difficulté du traitement de l'information en trois dimensions.

Par conséquent, je me suis concentré sur les jeux de tir 2D comme étant plus difficiles qu'Atari 2600, plus faciles et plus appropriés que la 3D. Les jeux de tir 2D sont en 2D et ne nécessitent pas autant d'informations que la 3D, mais ils nécessitent plus de complexité et de vitesse que les jeux Atari 2600. Parmi eux, cette fois, la version d'essai est publiée gratuitement et est facile à obtenir Toho Konjuden ~ Legacy of Lunatic Kingdom. A été ciblé pour la capture.

~~ En fait, la raison pour laquelle j'aime le projet Toho est plus grande ~~

conception

image.png

En gros, il s'agit d'un mécanisme qui échange des captures d'écran de l'écran de jeu entre Windows et Ubuntu et renvoie l'opération au jeu.

Exemple de fonctionnement réel

Simple video est disponible sur Twitter.

programme

Les principaux programmes hors modèle sont publiés sur github ... Cependant, il est toujours dans le cadre de pointe à l'état de prototype. Je ne pense pas qu'il soit approprié d'écrire quelque chose sur cette base.

Description du programme

Le client prend une capture d'écran avec PIL, la numpy et envoie l'image avec socket.

Lorsque le serveur le reçoit avec socket, il le formate avec numpy et OpenCV, et Chainer prend un jugement de mort et une décision d'action. Si aucune mort n'est déterminée, l'action sera retournée avec socket. Si une décision de mort est prise, une méta-phrase est renvoyée et l'épisode se termine. De plus, selon le cas, nous commencerons à apprendre avec Chainer.

En réponse à la réponse, le client envoie une action correspondant à Direct Input (système d'entrée de jeu DirectX) avec Send Input. Lorsque la méta-déclaration du jugement de mort est renvoyée, l'opération est mise en pause et attend. Il attend toujours si l'apprentissage a lieu et reprend le fonctionnement dans le cas contraire.

Jugement de mort

img0006010.jpg

Dans Toho Konjuden, les mots «Échec de capture» sont affichés au moment de la mort. Par conséquent, cela est utilisé pour déterminer la mort. Plus précisément, le côté serveur spécifie que la zone où ce personnage est affiché est découpée, et que ce soit une image de jeu ou non est jugé par un modèle simple à trois couches. Cela pourrait être jugé avec une performance de 99% ou plus. (Cependant, c'est une balle qui fonctionne parfois mal)

Décision d'action

img0000012.jpg

Sélectionnez l'action avec la note la plus élevée pour une seule image, comme indiqué ci-dessus. Il existe au total 18 modèles de comportement, et ils sont les suivants.

z (bouton de prise de vue) z (bouton de prise de vue) + 8 directions z (bouton de prise de vue) + SHIFT (mouvement lent) z (bouton de prise de vue) + SHIFT (mouvement lent) + 8 directions

De plus, l'évaluation a pris la forme d'un apprentissage et d'une estimation en combinant le comportement et le temps de survie.

Alors, comment était la performance?

J'ai essayé différentes combinaisons basées sur Lunatic (difficulté la plus élevée), mais je n'ai pas pu passer le premier chapitre.

Comme vous pouvez le voir sur la Simple video, si ce n'est pas RANDOM, l'action est décidée de manière unique. Avec cela, il est inévitable d'attaquer le personnage opérationnel et vous mourrez. Cela est probablement dû à un mauvais apprentissage.

Dans la vidéo ci-dessus, j'ai essayé d'apprendre l'évaluation en prenant en sandwich l'apprentissage chaque fois que j'ai terminé l'action dans une certaine mesure. Ce qui précède est le résultat de l'apprentissage en utilisant en fait environ 2000 images 5 fois chacune. C'est une quantité qui ne peut pas être considérée comme un apprentissage suffisant, même dans le traitement d'image général.

Cependant, une quantité considérable de calculs est nécessaire pour s'entraîner avec le modèle de 100 couches ou plus actuellement utilisé dans le traitement d'image. Dans mon environnement, il a fallu près d'une heure pour traiter toutes les images une fois, même s'il n'y en avait que quelques milliers. Cependant, même si vous le gérez une fois, vous pouvez le résoudre suffisamment s'il s'agit d'un simple problème de classification, mais pour autant que j'ai essayé cette fois, il semble que ce n'était pas si facile.

Alors, comment puis-je capturer le projet Toho! ??

Pour approfondir vos connaissances, utilisez une bibliothèque de calcul GPU parallèle telle que "Distributed TensorFlow" qui sera bientôt disponible. Je pense que c'est nécessaire. Dans l'article ci-dessus, un exemple de réalisation de 300 fois plus de traitement parallèle avec 500 unités est présenté. Si ce traitement de 300 fois peut être utilisé, le problème ci-dessus peut être résolu. (Si vous l'utilisez réellement, AlphaGo, qui nécessite près de 700 jours de calcul, peut être appris en seulement 2 jours.) [^ 1]

[^ 1]: J'avais un peu de temps, donc je vérifiais divers documents, mais j'étais sceptique sur le fait que "c'était un malentendu, et cela faisait deux ans que j'étais dispersé au départ". Je le posterai dans le texte original pendant un moment jusqu'à ce que je puisse le confirmer. (Ajouté le 2016/3/13)

Cependant, si vous achetez 500 TitanX, les GPU les plus puissants du marché aujourd'hui, cela dépassera à lui seul 70 millions. Ce n'est pas un montant qui peut être payé aux étudiants pauvres, mais ce montant de calcul n'est-il pas gérable?

~~ Je veux trouver un emploi avant cela, mais je me demande si cela peut être fait ... ~~

Les références

Histoire de DQN + Deep Q-Network écrite dans Chainer Prendre une capture d'écran avec Pillow pour Python Transférer des images de Raspberry Pi avec OpenCV Simulate Python keypresses for controlling a game

Correction et excuses (ajouté le 18 février 2016)

AlphaGo utilise une technique appelée Deep Q-Network.

Dans le premier projet, la phrase ci-dessus a été publiée au début. Cependant, on m'a fait remarquer que "bien que l'apprentissage par renforcement soit effectué dans le processus d'optimisation du modèle, Deep Q-Network n'est pas utilisé et c'est une erreur évidente", et je l'ai corrigée.

Nous aimerions profiter de cette occasion pour nous excuser d'avoir publié des informations incorrectes.

Recommended Posts

J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
Je voulais jouer avec la courbe de Bézier
J'ai essayé d'écrire dans un modèle de langage profondément appris
Je voulais résoudre le problème ABC164 A ~ D avec Python
Je voulais résoudre ABC160 avec Python
Je voulais résoudre ABC172 avec Python
Je voulais vraiment copier avec du sélénium
J'ai essayé de mettre en œuvre un apprentissage en profondeur qui n'est pas profond avec uniquement NumPy
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
L'histoire de l'apprentissage profond avec TPU
Je voulais résoudre NOMURA Contest 2020 avec Python
J'ai essayé de sauvegarder les données avec discorde
Je voulais installer Python 3.4.3 avec Homebrew + pyenv
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
J'ai essayé d'implémenter Cifar10 avec la bibliothèque SONY Deep Learning NNabla [Nippon Hurray]
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker 2 Multi-host edition
J'ai essayé le deep learning
[Deep Learning from scratch] J'ai implémenté la couche Affine
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
Je voulais aussi vérifier les indices de type avec numpy
J'ai installé et utilisé la bibliothèque Deep Learning Chainer
Je veux escalader une montagne avec l'apprentissage par renforcement
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Je voulais utiliser la bibliothèque Python de MATLAB
Je veux hériter de l'arrière avec la classe de données python
J'ai essayé de résoudre le problème avec Python Vol.1
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
Je t'ai écrit pour regarder le signal avec Go
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 16) J'ai essayé de créer SimpleConvNet avec Keras
"Deep Learning from scratch" Mémo d'auto-apprentissage (n ° 17) J'ai essayé de créer DeepConvNet avec Keras
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
Essayez l'apprentissage en profondeur avec TensorFlow
Essayez de créer un réseau de neurones / d'apprentissage en profondeur avec scratch
[Partie 1] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
Je voulais faire fonctionner le moteur avec une tarte à la râpe, alors j'ai essayé d'utiliser la carte de commande du moteur de Waveshare
[Partie 3] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Evangelion] Essayez de générer automatiquement des lignes de type Asuka avec Deep Learning
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de notifier les informations de retard de train avec LINE Notify
Une histoire à laquelle j'ai pensé en essayant d'identifier les informations de plénitude du parking en utilisant l'image obtenue par la caméra Web et Razpai et le deep learning.
Apprentissage profond du noyau avec Pyro
[Deep Learning from scratch] J'ai essayé d'expliquer la confirmation du gradient d'une manière facile à comprendre.
Essayez le Deep Learning avec FPGA
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
Reconnaissez votre patron avec Deep Learning et masquez l'écran
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
"Copie profonde" et "Copie superficielle" à comprendre avec le plus petit exemple
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
Je n'arrive pas à me connecter à la page d'administration avec Django 3
Introduction au Deep Learning ~ Règles d'apprentissage ~
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
Apprentissage par renforcement profond 1 Introduction au renforcement de l'apprentissage