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.
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.
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.
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'}]}
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.
https://gist.github.com/TakesxiSximada/ca1b5aac871ec7167ff9
https://gist.github.com/TakesxiSximada/996dbbfae5fa3bbab61d
https://gist.github.com/TakesxiSximada/d451221dc2a280b7e35d
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