«Custom Vision Service» est un service de reconnaissance d'image fourni comme l'un des produits de Microsoft Azure.
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.
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.
Le flux général d'utilisation de ce service est
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.
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.
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
.
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.
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.
buffering = 0
dans le troisième argument de ʻopen ()`readall ()
de l'objet fichier au corps de la requêtejpg
au lieu de ~~ png
(!) ~~__ (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.
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