[PYTHON] Machen Sie Objekte mit IBM Watson Developer Cloud Visual Recognition erkennbar

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.

Holen Sie sich den Benutzernamen und das Passwort für die API

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.

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

Holen Sie sich das Etikett

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.

Analysieren Sie das Bild

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'}]}

Senden Sie mehrere Bilder in einer Anfrage und analysieren Sie sie alle gleichzeitig

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.

Schriftliches Skript

Bild ausschneiden

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

Erkennen Sie Objekte und speichern Sie die Ergebnisse in einer JSON-Datei

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

Geben Sie die resultierende JSON-Datei an csv aus

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

Hinweis

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

Recommended Posts

Machen Sie Objekte mit IBM Watson Developer Cloud Visual Recognition erkennbar
Streaming-Spracherkennung mit der Google Cloud Speech API