[PYTHON] Une histoire sur l'automatisation du mahjong en ligne (Jakutama) avec OpenCV et l'apprentissage automatique

Aperçu

En utilisant la correspondance de modèle OpenCV et le module d'opération GUI de python BOT a pu reconnaître et cliquer sur les tuiles de mahjong sur le navigateur Web, et la lecture a été automatisée. De plus, l'apprentissage automatique a été utilisé pour la partie logique de la tuile de mahjong sur laquelle cliquer.

Si vous remplacez l'image de recherche de correspondance de modèle, vous pouvez l'utiliser non seulement dans l'âme du moineau, mais également dans d'autres jeux de mahjong en général, et si vous modifiez la partie d'apprentissage automatique, dans tous les jeux où la sélection rationnelle est requise à plusieurs reprises dans des conditions spécifiques. Il peut être appliqué.

  • Des images en jeu de Jakutama sont utilisées tout au long de l'article pour aider à comprendre le contenu, mais elles sont fortement floues du point de vue de la protection des droits d'auteur.

Public cible

(J'aime le mahjong) Les gens qui veulent toucher à l'apprentissage automatique Les personnes intéressées par l'automatisation des opérations Windows et GUI mais qui se demandent ce qu'est OpenCV

Une personne qui aime l'âme d'un moineau mais qui a le cœur brisé parce qu'il est trop difficile d'organiser un événement d'essai J'ai écrit dans un laboratoire de traitement d'image d'une université dans le passé ~~ Killing time ~~ Les gens qui s'intéressent aux scripts

Ma ~~ impure ~~ motivation

L'autre jour, j'étais accro à l'âme du moineau. J'en ai marre ces derniers temps.

Si vous jouez contre plusieurs stations quotidiennement ou participez à un événement, vous pourrez atteindre la récompense gacha, alors continuez à jouer au jeu ~~ et prenez une jolie fille ~~

Mais je ne peux pas m'entendre avec un inconnu sur le net qui connaît même les règles ~~ comme le travail ~~ mahjong. (Surtout, l'événement correspond à d'autres joueurs, quelle que soit leur capacité, et il est trop difficile de jouer sérieusement car le classement et la récompense après avoir joué ne correspondent pas)

D'un autre côté, si vous ne faites que déplacer le simple BOT Tsumo-kiri, vous serez jugé éloigné de votre bureau et le pire compte sera banni. (J'ai été surpris de cela. Ne le faites pas.)

Alors

--Faites fonctionner le navigateur en simulant les clics de souris --Choisissez une tuile et jetez-la et vous pouvez agresser

J'ai décidé de faire un BOT.

Composant

Acquisition des informations sur les tuiles main + Tsumo

Aperçu

J'ai utilisé un mécanisme appelé correspondance de modèles dans OpenCV.

OpenCV (Open Source Computer Vision Library) ... Une bibliothèque pour la vision par ordinateur open source développée et publiée par Intel. Une bibliothèque onirique qui peut réaliser diverses fonctions nécessaires au traitement d'images et de vidéos sur un ordinateur.

Correspondance de modèle ... Un processus de rêve qui recherche dans l'image d'entrée la partie la plus similaire à l'image du modèle (image partielle).

J'aurais pu en faire une application Windows en C #, mais ~~ C'est plus rapide de charger l'âme du moineau directement que de dépenser autant d'efforts ~~ Cette fois, j'ai choisi python, qui permet un accès rapide à OpenCV.

Après avoir installé python

$ pip install opencv-python

Vous pouvez utiliser OpenCV simplement en l'utilisant. Autrefois, il était difficile de faire des tutoriels ... Je pense que vous devriez vous référer ici pour la construction de l'environnement

Installer OpenCV avec pip https://qiita.com/fiftystorm36/items/1a285b5fbf99f8ac82eb

Préparez à l'avance toutes les images de mosaïque de motif, découpez 13 mosaïques à partir de la capture d'écran de lecture réelle et recherchez les images de mosaïque correspondantes pour acquérir les informations de mosaïque.

Attention de la capture d'écran

Veuillez noter que la taille du navigateur = la taille de l'écran de l'application ne tient pas.

Vous pouvez voir que Jakutama transforme beaucoup le navigateur, mais c'est une application Web conçue pour que le rapport hauteur / largeur corresponde à toutes les résolutions. [^ 1] En d'autres termes, la zone de dessin qui est déformée par le navigateur et qui ne correspond pas au rapport hauteur / largeur d'origine du jeu est affichée sous la forme d'une zone noire.

Ici, la correspondance de modèle est vulnérable aux cibles de détection dont la taille s'est agrandie ou contractée, il est donc important d'acquérir la taille de l'écran (capture) au début du processus, puis d'ajouter un traitement d'ajustement pour correspondre à la taille de l'image du modèle de tuile préparée. est. (Si vous jouez au jeu avec un environnement d'affichage fixe + une taille de navigateur à chaque fois, ce processus est inutile car la taille de l'image capturée et celle du modèle correspondent à chaque fois)

image.png Les éléments d'image situés en deux points dans la mesure du possible sont extraits à l'avance sous forme d'images de modèle afin qu'il y ait moins d'erreur lors du calcul de l'échelle. C'est une bonne idée de sélectionner une image qui ne change pas en fonction de la situation et qui n'a pas de caractéristiques similaires à l'écran (caractéristique ≈ qui est facile à identifier).

En outre, à ce stade, il est nécessaire de préparer environ 3 à 5 types d'images modèles (ou de les mettre à l'échelle pendant le traitement) et d'adopter l'image modèle avec le plus haut degré de correspondance et son échelle. .. [^ 2](Étant donné que la taille de l'image préparée comme modèle et l'image capturée réelle sont différentes, l'ensemble du processus devient instable si la détection de la zone d'écran échoue)

En mesurant à l'avance la taille de l'image extraite en tant qu'image modèle et la distance entre les deux points à ce moment-là et en la conservant comme données, il est possible d'obtenir la position relative de l'endroit où les objets artisanaux sont alignés même si l'environnement d'affichage change. Devenir. Lorsque j'ai découpé les tuiles de la main une par une (cv2.crop) en fonction de l'un des modèles, l'image pouvait être extraite comme indiqué ci-dessous. (Depuis que j'ai collecté les données d'image artisanales par capture manuelle, c'est un peu cliquetis. C'était correct car cela n'avait pas un grand effet sur la précision de la reconnaissance)

image.png

Dora 牌 a toujours un effet brillant à l'écran, mais en termes de traitement d'image, j'ai une sensation très désagréable (rires)

Reconnaissance de l'artisanat

Par ailleurs, afin de reconnaître la tuile elle-même, chacune des images de tuiles extraites est mise en correspondance avec un modèle à partir de "l'image de liste de tuiles" suivante.

image.png (* L'image Kuman d'entrée correspond à une partie de l'image de la liste de tuiles en tant que modèle)

Vous pouvez créer des données dans lesquelles les tuiles sont alignées sur une ligne horizontale, et les coordonnées x de l'image détectée vous diront ce que sont les tuiles. (Il était difficile de faire toutes ces données côte à côte de tuiles de mahjong ...) image.png Le processus semble bien, mais il a fallu 2,7 secondes jusqu'à présent. .. .. Puisque l'âme du moineau a un temps de maintien de 5 secondes, le temps qui peut être passé par traitement peut aller jusqu'à 5 secondes. Pour le dire un peu plus, on ne peut pas dire que le début du traitement de la boucle = le moment où il frappe, donc la boucle de surveillance au moins toutes les 2,5 secondes (début du tour → début du traitement (après que Max 2.5s est passé) → fin du traitement (2.5s) → Il est nécessaire de terminer le tour), donc cela semble gênant (; '∀') Même si la partie apprentissage automatique prend également du temps de traitement ... Eh bien, refactorisons-la plus tard![^ 3]

Problème "Que couper"

Aperçu et précédents

13 J'ai recherché un programme qui génère les tuiles à jeter en saisissant les tuiles main et les tuiles Tsumo. Il n'y en a pas. Au contraire, la zone de jeu de mahjong + IA était en pleine compétition pour cette zone. Je suis désolé les seniors.

De plus, mon but n'est pas "l'IA majan la plus puissante à laquelle j'ai pensé", mais un BOT qui continue à jouer si humide que la gestion de l'âme du moineau ne peut pas être déterminée en tant que robot, donc je vais faire cette zone de manière appropriée.

J'ai essayé de le diviser en le célèbre Amazon nommé github avec le mot-clé "mahjong"

"Combien de coupes" partie de jugement de l'application de mahjong "Denno Masho" qui fonctionne sur HTML5 + JavaScript https://github.com/kobalab/Majiang [Démo de l'opération] http://kobalab.net/majiang/dapai.html

Cela avait l'air plutôt bien. L'auteur a laissé un journal des difficultés liées à la logique de jugement «couper quoi» sur son blog, donc je pense que cela sera très utile pour ceux qui visent l'IA la plus forte.

Cependant, comme il s'agit de javascript, il est un peu gênant de connecter les données d'entrée / sortie de python. .. .. Je cherchais quelque chose qui pourrait être utilisé tel quel en python.

Adoption de l'apprentissage automatique

Combien d'IA de mahjong par deep learning https://github.com/hogeki/dlmahjong

Pour ceux qui n'ont jamais touché à l'apprentissage automatique, readme est un peu difficile d'accès, donc la procédure après le clonage de git au travail est décrite ci-dessous.

Premièrement, nous allons introduire TensorFlow [^ 4] avec pip, mais ici, ce sera plus heureux si les versions correspondent exactement. sérieusement. Vous devriez écouter l'histoire du pilier humain (vrai visage)

pip tensorflow==1.70 (2020.8.5 Suivez le contenu du référentiel git actuel)

Heureusement, les données de score de Tenho (.txt) sont également incluses, vous pouvez donc les apprendre telles quelles et les enregistrer en tant que paramètre.

python mahjong_ai.py --train --save

Les paramètres des résultats d'entraînement doivent maintenant être enregistrés en tant que données externes (modèle entraîné / modèle entraîné). À l'avenir, en utilisant ce modèle comme argument, il sera possible d'effectuer un traitement de jugement.

Étant donné que la fonction de "transmettre les données de 13 + 1 tuiles en tant qu'informations et dire quoi couper" n'est pas implémentée dans le script git correspondant (seuls les tests continus et son évaluation des performances sont décrits plus loin) Vous devez créer la pièce vous-même. Le code est ci-dessous.

Si vous entrez les informations de la tuile main + tuile Tsumo comme argument avec la chaîne de caractères de la spécification Tenho, il vous dira quoi couper. (Le modèle d'entraînement ci-dessus est l'argument par défaut)

Script d'implémentation

mahjong_ai.py(Partie supplémentaire)


#calc_Puisque la fonction dahai est censée être appelée à partir d'un fichier externe
#Mahjong le fichier d'accompagnement_ai.Reportez-vous au fichier joint à py avec import
import mahjong_common as mjc
import mahjong_loader as mjl

#Ajout d'import en raison de l'ajout de fonction
import unicodedata
import re

def init_sess():

    #calc_Puisque la fonction dahai est censée être appelée à partir d'un fichier externe
    #Faites de la partie qui définit sess une fonction et enregistrez-la globalement.
    # (Mahjong sur ce qu'est la sess_common.Peut être lu à partir de py)
    global sess
    
    make_model()
    saver = tf.train.Saver()
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    sess.run(tf.local_variables_initializer())
    saver.restore(sess, "ckpt/my_model")

def calc_dahai(hands_str,tsumo_str):

    #Exemple d'entrée du premier argument
    #hands_str="6p6p7p8p3s4s5s5s7s8s Est Est Est"

    #Exemple d'entrée du 2ème argument
    #tsumo_str="6s"

    #Init avant l'exécution_sess()Si tu ne le fais pas, ça ne marchera pas
    global sess

    #Convertir une chaîne de caractères artisanaux en un tableau de chaînes de caractères pour chaque artisanat
    tehai_tmp=[]

    #Étant donné que les caractères de 1 octet et les caractères de 2 octets sont mélangés et difficiles à traiter, convertir des caractères de 2 octets en caractères de 1 octet
    #(C'est une spécification de merde, mais elle ne peut pas être aidée car les données d'entrée de Tenho sont de cette façon.)
    hands_str = hands_str.replace('est', 'HI')
    hands_str = hands_str.replace('Sud', 'MI')
    hands_str = hands_str.replace('Ouest', 'NI')
    hands_str = hands_str.replace('Nord', 'KI')
    hands_str = hands_str.replace('blanc', 'SI')
    hands_str = hands_str.replace('Départ', 'HA')
    hands_str = hands_str.replace('Pendant ~', 'NA')
        
    #Stocker dans un tableau tous les 2 caractères
    tehai_str_list_by_2char = re.split('(..)',hands_str)[1::2]

    #Annuler les personnages
    tehai_str_list_by_2char = [s.replace('HI', 'est') for s in tehai_str_list_by_2char]
    tehai_str_list_by_2char = [s.replace('MI', 'Sud') for s in tehai_str_list_by_2char]
    tehai_str_list_by_2char = [s.replace('NI', 'Ouest') for s in tehai_str_list_by_2char]
    tehai_str_list_by_2char = [s.replace('KI', 'Nord') for s in tehai_str_list_by_2char]
    tehai_str_list_by_2char = [s.replace('SI', 'blanc') for s in tehai_str_list_by_2char]
    tehai_str_list_by_2char = [s.replace('HA', 'Départ') for s in tehai_str_list_by_2char]
    tehai_str_list_by_2char = [s.replace('NA', 'Pendant ~') for s in tehai_str_list_by_2char]

    #Mahjong une gamme de cordes artisanales_common.Convertir en un tableau de nombres déterminés par py
    for tehai_one in tehai_str_list_by_2char:#tehai_tmp:
        h = mjc.get_hai_number(tehai_one)
        tehai_num_array[h] += 1
    
    print("--------Résultat du jugement Mahjong AI--------")

    tstr = mjc.get_string_from_tehai(tehai_num_array)
    print("Artisanat:" + tstr)

    tsumo = mjc.get_hai_number(tsumo_str)
    print("L'autonomie:" + mjc.get_hai_string(tsumo))

    tehai_num_array[tsumo] += 1

    #Puisqu'il y a aussi une fonction qui détermine si oui ou non il a été tourné
    #Il est également possible de collecter des notes ou de les faire traiter individuellement
    #if mjc.is_agari(tehai_num_array):
    #    print("Achèvement")
    
    #Traitement des jugements par apprentissage automatique
    ai_outs = sess.run(out, feed_dict={x:[tehai_num_array]})

    dahai = get_ai_dahai(tehai_num_array, ai_outs[0])
    #print("Frappé:" + mjc.get_hai_string(dahai))

    return(mjc.get_hai_string(dahai))

De plus, en dehors de l'objectif principal de cet article, en tant que fonction qui est l'objectif initial de ce dépôt git, en utilisant le modèle qui a été appris et complété, un simulateur de tuiles de mahjong aléatoire est mis en boucle et le nombre d'essais est suffisant. Il permet de tester le taux de tempai, etc. en.

python mahjong_ai.py --run

image.png [Résultat de la simulation 1 000 fois]

Si vous souhaitez améliorer les fonctionnalités de l'IA, vous pouvez collecter plus de données de score pour l'apprentissage, ou former des professionnels et de bonnes personnes. C'est intéressant car la modification des données d'entraînement modifiera les résultats du test.

Je n'entrerai pas dans la description de l'apprentissage automatique ici, mais je vous ai demandé de brièvement aborder les bases de l'apprentissage automatique, alors veuillez jouer avec. ~~ Et si vous avez une bonne IA, merci de me la donner ~~ À propos, il semble un peu difficile de collecter une grande quantité de données de score de Tenho à ce stade. S'il existe un bon script capable de collecter des données, merci de le partager dans les commentaires, et tous les êtres humains ~~ et principalement moi ~~ seront sauvés.

Simulation de souris

J'ai essayé différentes choses, mais le tutoriel suivant était facile à comprendre. Une fois que vous avez pip le module requis, vous pouvez le copier.

Laisser Python faire un travail itératif avec PyAutoGui https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3

L'application calculatrice démarre devant vous et vous pouvez faire glisser la souris sans autorisation. Au premier coup d'œil, j'ai même applaudi "Oh".

Si vous copiez et collez uniquement la partie nécessaire au clic de la souris et cliquez sur la position des coordonnées calculée par l'opération ci-dessus, c'est OK.

Pétrir et mélanger les trois éléments jusqu'à présent pour terminer. La description du code n'est plus omise. S'il y a une demande, je l'élèverai à git.

État de fonctionnement (vidéo)

Jantama Play Video Cliquez sur la vignette pour accéder au lien vers youtube

C'est un jeu à odeur moyenne, mais il semble que vous ayez fait un choix de tuiles vers Agari.

Mechanko C'est l'un des points forts de la machine que la sélection de tuiles simple et la sélection de tuiles un peu déroutante pour les humains puissent être traitées en même temps.

En observant, les problèmes actuels sont les suivants.

(1) J'ai réussi à faire 18 coups pour ne pas pouvoir utiliser les 20 secondes de mon temps, mais selon la situation, je pourrais dépasser mon temps.

Il y a de la place pour la refactorisation dans cette partie, mais je m'en fiche car c'est normal de perdre à cause du temps mort.

Après tout, je ne m'attends pas à éclater ou à faire du bruit, il semble donc que le traitement sera plus stable si vous sélectionnez toujours l'option "Pas de cri" lorsque vous jouez à un jeu.

(2) Étant donné que les données au moment de l'apprentissage n'incluent pas les informations sur les tuiles abandonnées d'autres familles et Dora, les hits ne trembleront pas même si l'autre famille atteint comme dans la vidéo, et les tuiles Dora seront jetées sans s'en soucier ( Lol)

Si vous êtes intéressé par l'apprentissage automatique et que vous souhaitez améliorer cette fonctionnalité, l'étape suivante consiste à apprendre les informations Dora et les informations d'auto-vent / froid sur le terrain. Il est important d'étendre la fonctionnalité afin que les données de différentes dimensions (c'est-à-dire la signification des données) soient formées comme un paramètre d'entrée. (Le côté Mahjong_common.py doit être réparé)

(Cependant, si les informations sur la rivière et les informations sur les accès d'autres familles sont incluses dans l'apprentissage, les paramètres d'entrée deviendront énormes, et si vous ne les concevez pas correctement, un fonctionnement stable lui-même sera difficile.)

③ Il ne prend pas en charge Damaten, Hearing et Dark Can.

Du concept lui-même, c'est une machine qui vise Tsumoagari en ligne droite.

ensuite

C'était interdit (rires)

C'est une blague, j'ai donc remanié le nombre et la fréquence de correspondance des modèles et la procédure de traitement afin de ne pas manquer de temps, et j'ai essayé de l'utiliser dans les matchs de championnat.

Vous pouvez gagner, perdre ou perdre, mais après tout, la machine ne se fatigue pas, donc elle continue de jouer tout le temps. (Actuellement en cours, uniquement lorsque mon ordinateur est en marche ...)

Je voudrais mesurer la capacité du modèle qui a simplement entraîné les données Tenho incluses dans git introduit au début pour déterminer dans quelle ligue il finira par se stabiliser.

Je voudrais l'ajouter à nouveau à une date ultérieure, alors attendez-le avec impatience.

◆ À propos de la peur de la violation des droits du côté de l'âme du moineau dans l'article

Cette fois, j'ai posté une vidéo de Jakutama dans l'utilisation en service de BOT et dans l'article que la direction de Jakutama n'avait peut-être pas voulu, mais elle est utilisée dans une plage qui n'est pas en conflit avec les directives officielles, les droits d'auteur, etc. Nous avons déterminé que nous n'avons pas enfreint. Cependant, si vous faites la même chose en référence à cet article, veuillez le faire à vos risques et périls. Pour référence, nous présenterons les conditions d'utilisation de l'âme de moineau qui peuvent entrer en conflit avec les suivantes.

Directives pour la distribution de jeux en direct et la publication de vidéos (extraits d'articles interdits)

・ Utilisation à des fins autres que la diffusion du jeu en direct, telles que la politique, la religion, ** la promotion de croyances spécifiques ** ~~ (applicable w) ~~

Conditions d'utilisation de Jakutama, interdictions de l'article 11

(12) Le fait d'acquérir illégalement divers contenus fournis par la Société via ce service, ou l'acte d'en faire la promotion. ~~ (Obtenir des récompenses gacha grâce à l'opération BOT, etc.) ~~ (16) Actes qui interfèrent avec ou peuvent interférer avec le fonctionnement et l'utilisation de ce service. (21) Agit selon les éléments précédents et autres actes que la Société juge inappropriés.

[^ 1]: Une vérification ultérieure a révélé que le rapport hauteur / largeur a peut-être légèrement fluctué, mais qu'il semble se situer dans la plage d'erreur. Dans mon script, j'ai décidé de mesurer et de corriger séparément les échelles verticale et horizontale.

[^ 2]: Je pense qu'il existe différentes théories sur ce contenu, mais c'est ma meilleure pratique. C'est un problème qui se produit toujours lorsque vous adoptez une technique appelée correspondance de modèles, mais connaissez-vous une autre bonne méthode (en moins de temps)?

[^ 3]: Je n'ai pas essayé de refactoriser par la suite dans les projets auxquels j'ai participé jusqu'à présent. Principalement en raison d'un manque de ressources ou de motivation. .. ..

[^ 4]: TensorFlow ... Une bibliothèque de logiciels développée par Google et publiée en open source pour une utilisation dans l'apprentissage automatique.

Recommended Posts

Une histoire sur l'automatisation du mahjong en ligne (Jakutama) avec OpenCV et l'apprentissage automatique
Une histoire sur l'apprentissage automatique avec Kyasuket
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Histoire de l'analyse de données par apprentissage automatique
Une histoire de prédiction du taux de change avec Deep Learning
Créez un environnement d'apprentissage automatique scikit-learn avec VirtualBox et Ubuntu
(Remarque) Une histoire sur la création d'un système de questions et réponses à l'aide de Spring Boot et de l'apprentissage automatique (SVM).
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
Notes personnelles et liens sur l'apprentissage automatique ① (Machine learning)
Une histoire sur Python pop and append
Vulkan compute avec Python avec VkInline et pense à l'apprentissage automatique GPU et plus
Une histoire accro aux variables globales et à la portée de Go
Une histoire sur l'obtention d'un taux de récupération des courses de chevaux de plus de 100% grâce à l'apprentissage automatique
Une histoire sur l'implémentation d'un écran de connexion avec django
Une histoire sur la modification de Python et l'ajout de fonctions
Créer un environnement d'apprentissage automatique Python avec des conteneurs
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Étapes pour créer rapidement un environnement d'apprentissage en profondeur sur Mac avec TensorFlow et OpenCV
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez
Apprentissage automatique avec Raspberry Pi 4 et Coral USB Accelerator
Histoire de l'utilisation du jeton logiciel de Resona avec 1Password
Exécutez un pipeline de machine learning avec Cloud Dataflow (Python)
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
L'histoire de la création d'une partition de type Hanon avec Python
Sentons-nous comme un chercheur en matériaux avec l'apprentissage automatique
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Histoire autour de la maternelle, de l'école maternelle, du jardin d'enfants
Créer un environnement de développement d'applications d'apprentissage automatique avec Python
L'histoire de la gestion de theano avec TSUBAME 2.0
L'apprentissage automatique pratique avec Scikit-Learn et TensorFlow-TensorFlow a abandonné -
Créez un environnement d'apprentissage automatique à partir de zéro avec Winsows 10
Parlez de l'amélioration du goulot d'étranglement des algorithmes d'apprentissage automatique avec Cython
Apprentissage automatique sur le surapprentissage
Comment dessiner de manière interactive un pipeline d'apprentissage automatique avec scikit-learn et l'enregistrer au format HTML
L'histoire de la construction d'un serveur de cache PyPI (avec Docker) et de me rendre un peu heureux à nouveau
(Premier article) Une histoire sur le calcul numérique de la grippe et du nouveau coronavirus de la pneumonie avec Tensorflow
[Apprentissage automatique] Démarrez Spark avec iPython Notebook et essayez MLlib
Créer un environnement d'apprentissage automatique sur Mac (pyenv, deeplearning, opencv)
Créez une application d'apprentissage automatique avec ABEJA Platform + LINE Bot
Une histoire de compétition avec un ami dans Othello AI Preparation
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (4)
Une histoire sur l'installation de matplotlib à l'aide de pip avec une erreur
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Une histoire sur la façon de traiter le problème CORS
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
Apprentissage automatique pour apprendre avec Nogisaka 46 et Keyakizaka 46 Partie 1 Introduction
Une histoire sur la création d'une courte chanson par hasard avec Sudachi Py
L'histoire d'un ingénieur directeur de 40 ans qui réussit "Deep Learning for ENGINEER"
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
Une histoire sur la prédiction des préfectures à partir des noms de villes avec Jubatus
L'apprentissage automatique appris avec Pokemon
À propos de l'apprentissage avec Google Colab
Apprentissage automatique avec Python! Préparation
À propos de la matrice mixte d'apprentissage automatique
Démineur d'apprentissage automatique avec PyTorch