Das Erkennen eines Objekts aus einem Bild wird als Objekterkennung bezeichnet. Dieses Mal verwenden wir Visual Recognition, einen der von IBM Watson Developer Cloud bereitgestellten Services, um die Objekterkennung durchzuführen.
Sie benötigen einen Benutzernamen und ein Kennwort, um die Visual Recognition-Web-API verwenden zu können.
Erstellen Sie eine Anwendung über den IBM Bluemix-Verwaltungsbildschirm und fügen Sie Visual Recognition hinzu, indem Sie der Anwendung einen Service hinzufügen.
Klicken Sie nach dem Hinzufügen für diesen Dienst auf "Anmeldeinformationen anzeigen", um Ihren Benutzernamen und Ihr Kennwort anzuzeigen.
Das Ergebnis der Objekterkennung ist eine Reihe von Beschriftungen und Beschriftungswerten. Holen Sie sich das zu diesem Zeitpunkt verwendete Etikett.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Abrufen von Etiketteninformationen mit Visual Recognition in der 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)
Das Ergebnis ist JSON zurückgegeben. label_groups ist eine Liste von Label-Gruppen und label ist eine Liste von Labels.
Die Objekterkennungs-API erfordert das Senden von Bildern in mehreren Teilen. Es scheint, dass das Bild png, jpg oder zip komprimiert sein kann. Das Folgende ist ein Beispiel für das Senden eines PNG-Bildes.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Führen Sie die Objekterkennung mit der visuellen Erkennung der IBM Watson Developer Cloud durch
"""
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)
Analysieren Sie ein Bild. Das Ausgabeergebnis ist wie folgt.
$ 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
Die zurückgegebenen Daten lauten wie folgt.
{'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'}]}
Durch Erhöhen der Anzahl der mehrteilig gesendeten Dateien können mehrere Dateien mit einer Anforderung analysiert werden.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""Führen Sie die Objekterkennung mit der visuellen Erkennung der IBM Watson Developer Cloud durch
Fügen Sie 3 Dateien in 1 Anfrage ein
"""
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)
Der zurückgegebene JSON ist eine Liste von Elementen für den Schlüssel "images", die die Elemente für die Anzahl der von Ihnen eingegebenen Bilder enthält. Das Ausführungsergebnis ist wie folgt.
$ 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
Selbst wenn ich 30 Dateien in eine Anfrage aufgenommen habe, wurden sie normal verarbeitet. Vielleicht kann ich mehr gehen.
https://gist.github.com/TakesxiSximada/ca1b5aac871ec7167ff9
https://gist.github.com/TakesxiSximada/996dbbfae5fa3bbab61d
https://gist.github.com/TakesxiSximada/d451221dc2a280b7e35d
Dieses Mal verwende ich ein Python-Paket eines Drittanbieters namens pit, um den Benutzernamen und das Kennwort aus der Konfigurationsdatei abzurufen. Ab dem 12. April 2015 unterstützt pit Python3 jedoch nicht. Selbst wenn Sie pit normal mit Python3 installieren, tritt ein Fehler auf. Fork das Pit Repository und es gibt einen Zweig, der Python3 unterstützt. Bitte installieren und verwenden Sie Pit von dort.
https://github.com/TakesxiSximada/pit/archive/fix/sximada/py3k.zip https://github.com/TakesxiSximada/pit/tree/fix/sximada/py3k
... oder besser gesagt, eine Pull-Anfrage stellen, ohne> I zu überspringen