[Azure] Hit Custom Vision Service avec Python

introduction

«Custom Vision Service» est un service de reconnaissance d'image fourni comme l'un des produits de Microsoft Azure.

image.png

C'est un service qui vous indique à quel point une image est proche de quelle balise en téléchargeant une balise indiquant le type d'image et certaines images qui lui sont associées et en l'apprenant ainsi.

image.png

Dans l'exemple ci-dessus, après avoir appris le violon, le hautbois et le tubercule et téléchargé une photo d'un violon avec une composition légèrement différente, il est reconnu qu'il y a 99,9% de chances qu'il s'agisse d'une photo d'un violon.

Cette fois, je vais essayer d'exécuter (l'une des) API de ce service depuis Python.

Flux global

Le flux général d'utilisation de ce service est

  1. Enregistrez des images pour apprendre avec des balises
  2. Effectuer l'apprentissage
  3. Téléchargez l'image à identifier et obtenez le résultat

C'est une chose très simple, et même une personne comme moi qui ne fait pas du tout d'apprentissage automatique ou de traitement d'image peut facilement la déplacer. Parmi ceux-ci, les articles suivants ont été très utiles pour savoir comment exécuter 1, 2 et 3 sur le navigateur, veuillez donc vous y référer.

J'ai essayé d'utiliser Custom Vision Service --Qiita

Cet article décrit comment effectuer la troisième partie en Python.

Sujet principal

Cependant, en gros, vous écrivez et exécutez simplement le programme conformément à la référence.

Overview - Custom Vision Service

Si vous ouvrez le menu de gauche «Référence»> «Référence de l'API Custom Vision Prediction» sur cette page, vous verrez la console de test et la page avec un exemple de code pour chaque langage de programmation, ainsi que les spécifications de l'API.

Cette fois, sélectionnez Python.

image.png

La moitié supérieure du code affiché est le code 2.X et la moitié inférieure est le code 3.x. Créez un fichier python en copiant celui qui convient à votre environnement. (Cette fois, nous allons procéder avec 3.x)

customvisionapi.py


import io, http.client, urllib.request, urllib.parse, urllib.error, base64

headers = {
    # Request headers
    'Content-Type': 'multipart/form-data',
    'Prediction-key': 'xxxxxxxxxxxxxxxxxxxxxxxx',
}

params = urllib.parse.urlencode({
    # Request parameters
    'iterationId': 'xxxxxxxxxxxxxxxxxxxxxxxx',
})

try:
    conn = http.client.HTTPSConnection('southcentralus.api.cognitive.microsoft.com')
    f = open("violin_a.jpg ", "rb", buffering=0)
    conn.request("POST", "/customvision/v1.0/Prediction/xxxxxxxxxxxxxxxxxxxxxxxx/image?%s" % params, f.readall(), headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    # print("[Errno {0}] {1}".format(e.errno, e.strerror))
    print(e)

Ici, chaque paramètre décrit dans «xxxxxxxxxxxxxxxxxxxxxxxx» peut être confirmé à partir de ce qui suit.

Il y a peut-être une meilleure façon de le rechercher, mais celui que j'ai trouvé était celui ci-dessus.

Après avoir défini chaque valeur, tout ce que vous avez à faire est de placer le fichier de comparaison dans le même répertoire que le fichier Python et de l'exécuter.

$ python customvisionapi.py
b'{"Id":"bxxxxxxxxxxxxxxxxxxxxxxxx","Project":"xxxxxxxxxxxxxxxxxxxxxxxx","Iteration":"xxxxxxxxxxxxxxxxxxxxxxxx","Created":"2017-06-06T13:59:23.5590916Z","Predictions":[{"TagId":"8fe34be4-eeff-495b-a83f-2a74bd25f035","Tag":"instrument","Probability":0.9999934},{"TagId":"bd2281d4-e4ff-48f1-a9ab-d525277479f9","Tag":"violin","Probability":0.9987756},{"TagId":"f33cdfdd-7eb2-47a2-8a30-2162a8f9e7fa","Tag":"oboe","Probability":3.22442238E-22},{"TagId":"b1490919-c0ab-4771-9564-13752bcfb96c","Tag":"tuba","Probability":7.720858E-24}]}'

Vous avez le résultat. C'est un peu difficile à comprendre tel quel, mais vous pouvez voir que les données «Probabilité» sont renvoyées pour chaque balise et que la «Probabilité» de la balise «Violin» est aussi élevée que «0,9999934».

Vous pouvez maintenant faire reconnaître l'image par le programme! Vous pouvez élargir vos rêves en l'incorporant dans un appareil IoT ou en le combinant avec une application Web telle que Django.

J'obtiens BadRequestImageFormat!

Eh bien, c'est la fin de la procédure, mais quand j'ai essayé cela, j'ai été troublé par le phénomène selon lequel BadRequestImageFormat est apparu et que le résultat n'a pas pu être obtenu pendant environ une heure, donc je vais écrire la solution. (La cause n'est pas claire ...)

$ python customvisionapi.py
b'{"Code":"BadRequestImageFormat","Message":""}'

Au fait, même si j'ai interrogé un enseignant de Google à ce sujet, on m'a juste dit que je n'en savais rien.

image.png

Voici donc la solution.

Bien qu'il s'agisse de l'exemple de code ci-dessus, en fait, le code pour coller le fichier image dans le corps de la requête est omis dans le document uniquement en écrivant «{body}».

conn.request("POST", "/customvision/v1.0/Prediction/{projectId}/image?%s" % params, "{body}", headers)

Au début cette partie

imagefile = open("./violin_a.jpg ", "rb")
conn.request("POST", "/customvision/v1.0/Prediction/{projectId}/image?%s" % params, imagefile, headers)

J'ai essayé d'utiliser la méthode ʻopen () `, mais cela n'a tout simplement pas fonctionné.

Ainsi, tout en regardant référence du module io et en faisant des essais et des erreurs, faites attention à ce qui suit. J'ai trouvé que je pouvais accéder à l'API sans aucune erreur.

__ (Corrigé le 25 juin 2017) Ce qui ne fonctionnait pas bien avec les images PNG était un problème avec le fichier PNG lui-même que j'utilisais pour vérifier l'opération. Avec le même code source, nous avons confirmé que les résultats peuvent être obtenus même avec des images PNG, nous allons donc le corriger. (/ Correct) __

Je ne connais la signification d'aucun d'entre eux, mais je mentionnerai simplement que cela a fonctionné pour le moment. (Dans le cas de Python2.x, cela fonctionnait indépendamment de tout autre chose que le troisième jpg. Quel gâchis.)

En conséquence, le programme qui a fonctionné est tel que publié dans le texte.

Résumé

c'est tout. Bien que chaque service Azure présente quelques inconvénients avec peu d'informations, j'ai l'impression qu'il fournit un certain nombre d'API qui pourraient être utilisées pour quelque chose. Il y a aussi un cadre gratuit pour 20 000 yens, je vais donc continuer à essayer diverses choses à l'avenir.

Recommended Posts

[Azure] Hit Custom Vision Service avec Python
Utilisez Python / Django avec Windows Azure Cloud Service!
Code Python pour former et tester avec Custom Vision of Cognitive Service
Extraction de texte (API de lecture) avec l'API Azure Computer Vision (Python3.6)
Accédez à l'API Etherpad-lite avec Python
Utilisez des scripts personnalisés Python avec StackStorm
[GUI avec Python] PyQt5-Widget personnalisé-
Service Python
Utilisation de Python et MeCab avec Azure Databricks
Utiliser Amazon Simple Notification Service avec Python
Manipulation d'Azure CosmosDB à partir de Python Part.2
Modèle Infer Custom Vision avec Raspeye
Utiliser Python et MeCab avec Azure Functions
Statistiques avec python
Extraction de texte avec l'API GCP Cloud Vision (Python3.6)
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Utiliser Python et word2vec (appris) avec Azure Databricks
[Azure Functions / Python] Fonctions de chaîne avec liaison de stockage de file d'attente
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Créez un modèle de classification d'images de manière explosive avec Azure Custom Vision et implémentez-le avec Flask
Apprenez la file d'attente Service Bus avec Azure SDK pour Go (1)
Entrez facilement des textes d'apprentissage Azure LUIS avec des scripts Python
Utilisation d'Azure CosmosDB à partir de Python (démarrage rapide de l'exploration)
Mémo d'entrée / sortie de stockage par Python dans Azure Functions
E-mail hipchat avec postfix, fluentd et python sur Azure
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Communication série avec python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS