[PYTHON] Rendre les objets reconnus avec IBM Watson Developer Cloud Visual Recognition

La détection d'un objet à partir d'une image s'appelle la reconnaissance d'objet. Cette fois, nous utiliserons la reconnaissance visuelle, l'un des services fournis par IBM Watson Developer Cloud, pour effectuer la reconnaissance d'objets.

Obtenez le nom d'utilisateur et le mot de passe pour l'API

Vous devez obtenir un nom d'utilisateur et un mot de passe pour utiliser l'API Web de reconnaissance visuelle.

Créez une application à partir de l'écran d'administration d'IBM Bluemix et ajoutez la reconnaissance visuelle en ajoutant un service à l'application.

Après l'ajout, cliquez sur "Afficher les informations d'identification" pour ce service et vous verrez votre nom d'utilisateur et votre mot de passe.

スクリーンショット 2015-04-12 22.46.03.png

Obtenez l'étiquette

Le résultat de la reconnaissance d'objets est un ensemble d'étiquettes et de scores d'étiquettes. Obtenez l'étiquette utilisée à ce moment-là.


#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Obtenez des informations d'étiquette avec la reconnaissance visuelle dans IBM Watson Developer Cloud
"""
import sys
import json
import requests
from pit import Pit

setting = Pit.get('iwdcat',
                  {'require': {'username': '',
                               'password': '',
                               }})

auth_token = setting['username'], setting['password']
url = 'https://gateway.watsonplatform.net/visual-recognition-beta/api/v1/tag/labels'
res = requests.get(url, auth=auth_token, headers={'content-type': 'application/json'})
if res.status_code == requests.codes.ok:
    labels = json.loads(res.text)
    print('label groups({}): {}'.format(len(labels['label_groups']), labels['label_groups']))
    print()
    print('labels({}): {}'.format(len(labels['labels']), labels['labels']))
else:  # error
    print('stauts_code: {} (reason: {})'.format(res.status_code, res.reason))
    sys.exit(1)

Le résultat est un retour JSON. label_groups est une liste de groupes d'étiquettes et les étiquettes est une liste d'étiquettes.

Analysez l'image

L'API de reconnaissance d'objets nécessite l'envoi d'images en plusieurs parties. Il semble que l'image soit au format png, jpg ou zip compressé. Voici un exemple d'envoi d'une image png.


#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Effectuer la reconnaissance d'objets avec la reconnaissance visuelle d'IBM Watson Developer Cloud
"""
import os
import sys
import json
import requests
from pit import Pit

setting = Pit.get('iwdcat',
                  {'require': {'username': '',
                               'password': '',
                               }})

auth_token = setting['username'], setting['password']
url = 'https://gateway.watsonplatform.net/visual-recognition-beta/api/v1/tag/recognize'

filepath = 'var/images/first/2015-04-12-11.47.01.png'  # path to image file
filename = os.path.basename(filepath)

res = requests.post(
    url, auth=auth_token,
    files={
        'imgFile': (filename, open(filepath, 'rb')),
        }
    )
if res.status_code == requests.codes.ok:
    data = json.loads(res.text)
    for img in data['images']:
        print('{} - {}'.format(img['image_id'], img['image_name']))
        for label in img['labels']:
            print('    {:30}: {}'.format(label['label_name'], label['label_score']))

else:  # error
    print('stauts_code: {} (reason: {})'.format(res.status_code, res.reason))
    sys.exit(1)

Analysez une image. Le résultat de sortie est le suivant.


$ python analyze_image.py
0 - 2015-04-12-11.47.01.png
    Outdoors                      : 0.714211
    Nature Scene                  : 0.671271
    Winter Scene                  : 0.669832
    Vertebrate                    : 0.635903
    Boat                          : 0.61398
    Animal                        : 0.610709
    Water Vehicle                 : 0.607173
    Placental Mammal              : 0.580503
    Snow Scene                    : 0.571422
    Fabric                        : 0.563129
    Gray                          : 0.56078
    Water Sport                   : 0.555034
    Person                        : 0.533461
    Mammal                        : 0.515725
    Surface Water Sport           : 0.511447

Les données renvoyées sont les suivantes.


{'images': [{'image_id': '0', 'labels': [{'label_score': '0.714211', 'label_name': 'Outdoors'}, {'label_score': '0.671271', 'label_name': 'Nature Scene'}, {'label_score': '0.669832', 'label_name': 'Winter Scene'}, {'label_score': '0.635903', 'label_name': 'Vertebrate'}, {'label_score': '0.61398', 'label_name': 'Boat'}, {'label_score': '0.610709', 'label_name': 'Animal'}, {'label_score': '0.607173', 'label_name': 'Water Vehicle'}, {'label_score': '0.580503', 'label_name': 'Placental Mammal'}, {'label_score': '0.571422', 'label_name': 'Snow Scene'}, {'label_score': '0.563129', 'label_name': 'Fabric'}, {'label_score': '0.56078', 'label_name': 'Gray'}, {'label_score': '0.555034', 'label_name': 'Water Sport'}, {'label_score': '0.533461', 'label_name': 'Person'}, {'label_score': '0.515725', 'label_name': 'Mammal'}, {'label_score': '0.511447', 'label_name': 'Surface Water Sport'}], 'image_name': '2015-04-12-11.47.01.png'}]}

Envoyez plusieurs images en une seule demande et analysez-les toutes à la fois

En augmentant le nombre de fichiers envoyés en plusieurs parties, plusieurs fichiers peuvent être analysés avec une seule demande.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Effectuer la reconnaissance d'objets avec la reconnaissance visuelle d'IBM Watson Developer Cloud

Inclure 3 fichiers dans 1 demande
"""
import os
import sys
import json
import requests
from pit import Pit

setting = Pit.get('iwdcat',
                  {'require': {'username': '',
                               'password': '',
                               }})

auth_token = setting['username'], setting['password']
url = 'https://gateway.watsonplatform.net/visual-recognition-beta/api/v1/tag/recognize'

filepaths = [
    'var/images/first/2015-04-12-11.47.01.png',
    'var/images/first/2015-04-12-11.44.42.png',
    'var/images/first/2015-04-12-11.46.11.png',
    ]
files = dict((os.path.basename(filepath), (os.path.basename(filepath), open(filepath, 'rb'))) for filepath in filepaths)

res = requests.post(
    url, auth=auth_token,
    files=files,
    )

for key, (filename, fp) in files.items():
    fp.close()

if res.status_code == requests.codes.ok:
    data = json.loads(res.text)
    for img in data['images']:
        print('{} - {}'.format(img['image_id'], img['image_name']))
        for label in img['labels']:
            print('    {:30}: {}'.format(label['label_name'], label['label_score']))

else:  # error
    print('stauts_code: {} (reason: {})'.format(res.status_code, res.reason))
    sys.exit(1)

Le JSON renvoyé est une liste d'éléments pour la clé "images", qui contient les éléments correspondant au nombre d'images que vous avez saisies. Le résultat de l'exécution est le suivant.


$ python analyze_image_multi.py
0 - 2015-04-12-11.44.42.png
    Gray                          : 0.735805
    Winter Scene                  : 0.7123
    Nature Scene                  : 0.674336
    Water Scene                   : 0.668881
    Outdoors                      : 0.658805
    Natural Activity              : 0.643865
    Vertebrate                    : 0.603751
    Climbing                      : 0.566247
    Animal                        : 0.537788
    Mammal                        : 0.518001
1 - 2015-04-12-11.46.11.png
    Gray                          : 0.719819
    Vertebrate                    : 0.692607
    Animal                        : 0.690942
    Winter Scene                  : 0.683918
    Mammal                        : 0.669149
    Snow Scene                    : 0.664266
    Placental Mammal              : 0.663866
    Outdoors                      : 0.66335
    Nature Scene                  : 0.656991
    Climbing                      : 0.645557
    Person                        : 0.557965
    Person View                   : 0.528335
2 - 2015-04-12-11.47.01.png
    Outdoors                      : 0.714211
    Nature Scene                  : 0.671271
    Winter Scene                  : 0.669832
    Vertebrate                    : 0.635903
    Boat                          : 0.61398
    Animal                        : 0.610709
    Water Vehicle                 : 0.607173
    Placental Mammal              : 0.580503
    Snow Scene                    : 0.571422
    Fabric                        : 0.563129
    Gray                          : 0.56078
    Water Sport                   : 0.555034
    Person                        : 0.533461
    Mammal                        : 0.515725
    Surface Water Sport           : 0.511447

Même si j'ai inclus 30 fichiers dans une seule demande, ils ont été traités normalement. Peut-être que je peux aller plus.

Script écrit

Couper l'image

https://gist.github.com/TakesxiSximada/ca1b5aac871ec7167ff9

Reconnaître les objets et enregistrer les résultats dans un fichier json

https://gist.github.com/TakesxiSximada/996dbbfae5fa3bbab61d

Exporte le fichier json résultant vers csv

https://gist.github.com/TakesxiSximada/d451221dc2a280b7e35d

Mise en garde

Cette fois, j'utilise un package tiers Python appelé pit pour obtenir le nom d'utilisateur et le mot de passe du fichier de configuration. Cependant, à compter du 12 avril 2015, pit ne prend pas en charge Python3, donc même si vous installez normalement pit avec Python3, une erreur se produira. Forkez le référentiel pit et il y a une branche qui supporte Python3. Veuillez installer et utiliser pit à partir de là.

https://github.com/TakesxiSximada/pit/archive/fix/sximada/py3k.zip https://github.com/TakesxiSximada/pit/tree/fix/sximada/py3k

... ou plutôt, émettez une pull request sans sauter> I

Recommended Posts

Rendre les objets reconnus avec IBM Watson Developer Cloud Visual Recognition
Reconnaissance vocale en streaming avec l'API Google Cloud Speech