[PYTHON] Versuchen Sie, Lebensmittelfotos mithilfe der Google Cloud Vision-API zu beurteilen

Dieser Artikel ist der 12. Tagesartikel des Fujitsu Systems Web Technology Adventskalenders. (Versprechen) Der Inhalt dieses Artikels ist meine eigene Meinung und repräsentiert nicht die Organisation, zu der ich gehöre.

Einführung

Dieser Artikel fasst die Mindestschritte zur Verwendung der Bilderkennungs-API "Cloud Vision API" von Google zusammen. Schließlich versuche ich, das Lebensmittelfoto zu beurteilen.

Beiseite

Mein persönliches Hobby ist Mesitello [^ 1], und ich veröffentliche Food-Fotos auf der LINE-Timeline, um mich denken zu lassen, dass ich hungrig bin. Ich habe mich gefragt, ob ich mit der Bilderkennungs-API etwas tun kann, um köstlichere Bilder aufzunehmen und die Qualität von Mesitello zu verbessern. Deshalb habe ich diesmal zunächst die Google Cloud Vision-API ausprobiert.

Was ich diesmal benutzt habe

Vorbereitung für die Verwendung der API

Registrierung für die Google Cloud Platform

Registrieren Sie sich zunächst, um die Google Cloud Platform für die Verwendung der Cloud Vision-API zu verwenden.

Klicken Sie auf der folgenden Website auf "Kostenlos starten", um den Registrierungsvorgang zu starten. Verfügbar mit einem Google-Konto.

Cloud Computing-Dienst | Google Cloud

Ein Projekt erstellen

Nach Abschluss der Registrierung wird ein Bildschirm wie dieser angezeigt und das Standardprojekt wurde erstellt. Sie können ein neues Projekt aus dem roten Rahmen erstellen. Die API ist auch im Standardprojekt verfügbar, aber hier habe ich ein "Meshitero" -Projekt erstellt.

コンソールトップ.PNG

Aktivieren Sie die Cloud Vision-API

Wenn Sie im Suchformular "Viso in API" eingeben, wird die Cloud Vision-API aufgerufen. Klicken Sie also darauf. Wählen Sie nach dem Übergang "Aktivieren" auf dem Bildschirm.

コンソールトップ_検索.png

Vision_API_トップ.PNG

Nebenbei: Wenn Sie "Diese API testen" auswählen, können Sie die Demo auf dem Bildschirm ausprobieren.

Wenn diese Option aktiviert ist, wird ein Bildschirm wie dieser angezeigt.

vision_API_on_top.PNG

Ausgabe des API-Schlüssels

Dieses Mal werden wir es in Python aufrufen, also erstellen Sie die Anmeldeinformationen. Klicken Sie im Cloud Vision-API-Bildschirm auf "Anmeldeinformationen erstellen", um zur Seite "Anmeldeinformationen für APIs und Dienste" zu gelangen. Wenn Sie im Pulldown-Menü "Anmeldeinformationen erstellen" die Option "API-Schlüssel" auswählen, wird ein API-Schlüssel ausgegeben.

APIキー.PNG

APIキー作成.PNG

Beschränken Sie die Schlüssel, um eine unbefugte Verwendung zu vermeiden. Wenn Sie im obigen Bildschirm auf "Schlüssel einschränken" klicken, gelangen Sie zu einem Bildschirm, in dem Sie Schlüssel einschränken können. Legen Sie nach Bedarf Einschränkungen fest. Dieses Mal haben wir die Verwendung nach IP-Adresse und einmal die APIs, die für die Cloud Vision-API verwendet werden können, eingeschränkt.

キーを制限.PNG

Damit sind die Einstellungen für die Verwendung der API abgeschlossen.

API-Aufruf

Installation von Anaconda

So rufen Sie die API in Python auf Ich habe Anaconda unter Bezugnahme auf Folgendes installiert.

Anaconda (Windows) installieren

Eine Quelle erstellen

Erstellen Sie die Quelle unter Bezugnahme auf den Inhalt von Referenz der API.

Erstellung von Anforderungsdaten, die an die API übergeben werden sollen

Es scheint, dass die Bilddaten als base64-codierte Zeichenfolge übergeben werden müssen. Geben Sie außerdem die Art der Bildanalyse und die maximale Anzahl der Ergebnisse an, die in "Features" zurückgegeben werden sollen. Geben Sie diesmal die Etikettenerkennung an (LABEL_DETECTION).

Wenn es an die API übergeben wird, wird es im Json-Format codiert, sodass es im Json-Format vorliegt.

img_request = []
with open(filename, 'rb') as f:
    ctxt = b64encode(f.read()).decode()
    img_requests.append({
            'image': {'content': ctxt},
            'features': [{
                'type': 'LABEL_DETECTION',
                'maxResults': 10
            }]
    })
request_data = json.dumps({"requests": img_request }).encode()

API-Aufrufteil

Geben Sie die Anforderungsdaten und die API-Schlüsselausgabe in der vorherigen Phase an und senden Sie die API-Anforderung.

API_URL = 'https://vision.googleapis.com/v1/images:annotate'

response = requests.post(API_URL,
                         data=request_data ,
                         params={'key': api_key},
                         headers={'Content-Type': 'application/json'})

Ergebnisausgabe

Gibt die von der API zurückgegebenen Daten aus.

for resp in enumerate(response.json()['responses']):
            print (json.dumps(resp, indent=2))

Lauf

Übergeben Sie den von GCP ausgegebenen API-Schlüssel und den Pfad des Bildes an die erstellte Quelle und führen Sie ihn aus. Probieren Sie einige Lebensmittelbilder.

$ Python Meshitero.py [API-Schlüssel] [Bildpfad]
Ganze Quelle (Meshitero.py)

Meshitero.py


from base64 import b64encode
from sys import argv
import json
import requests

API_URL = 'https://vision.googleapis.com/v1/images:annotate'

if __name__ == '__main__':
    api_key = argv[1]
    filename = argv[2]
    
    img_request = []
    with open(filename, 'rb') as f:
        ctxt = b64encode(f.read()).decode()
        img_request.append({
                'image': {'content': ctxt},
                'features': [{
                    'type': 'LABEL_DETECTION',
                    'maxResults': 10
                }]
        })

    request_data = json.dumps({"requests": img_request }).encode()
    
    response = requests.post(API_URL,
                            data=request_data,
                            params={'key': api_key},
                            headers={'Content-Type': 'application/json'})

    if response.status_code != 200 or response.json().get('error'):
        print(response.text)
    else:
        for resp in enumerate(response.json()['responses']):
            print (json.dumps(resp, indent=2))

DSC_1113.PNG
Ausführungsergebnis (Auster)
 {
    "labelAnnotations": [
      {
        "mid": "/m/0_cp5",
        "description": "Oyster",
        "score": 0.9910632,
        "topicality": 0.9910632
      },
      {
        "mid": "/m/02wbm",
        "description": "Food",
        "score": 0.9903261,
        "topicality": 0.9903261
      },
      {
        "mid": "/m/06nwz",
        "description": "Seafood",
        "score": 0.9609892,
        "topicality": 0.9609892
      },
      {
        "mid": "/m/01cqy9",
        "description": "Bivalve",
        "score": 0.9138548,
        "topicality": 0.9138548
      },
      {
        "mid": "/m/02q08p0",
        "description": "Dish",
        "score": 0.8472096,
        "topicality": 0.8472096
      },
      {
        "mid": "/m/01ykh",
        "description": "Cuisine",
        "score": 0.811229,
        "topicality": 0.811229
      },
      {
        "mid": "/m/07xgrh",
        "description": "Ingredient",
        "score": 0.8011539,
        "topicality": 0.8011539
      },
      {
        "mid": "/m/088kg2",
        "description": "Oysters rockefeller",
        "score": 0.70525026,
        "topicality": 0.70525026
      },
      {
        "mid": "/m/0fbdv",
        "description": "Shellfish",
        "score": 0.6510715,
        "topicality": 0.6510715
      },
      {
        "mid": "/m/0ffhy",
        "description": "Clam",
        "score": 0.6364975,
        "topicality": 0.6364975
      }
    ]
  }
DSC_1052.PNG
Ausführungsergebnis (Sushi)
  {
    "labelAnnotations": [
      {
        "mid": "/m/02q08p0",
        "description": "Dish",
        "score": 0.9934035,
        "topicality": 0.9934035
      },
      {
        "mid": "/m/01ykh",
        "description": "Cuisine",
        "score": 0.9864208,
        "topicality": 0.9864208
      },
      {
        "mid": "/m/02wbm",
        "description": "Food",
        "score": 0.97343695,
        "topicality": 0.97343695
      },
      {
        "mid": "/m/048wsd",
        "description": "Gimbap",
        "score": 0.96859926,
        "topicality": 0.96859926
      },
      {
        "mid": "/m/07030",
        "description": "Sushi",
        "score": 0.9650486,
        "topicality": 0.9650486
      },
      {
        "mid": "/m/0cjyd",
        "description": "Sashimi",
        "score": 0.9185767,
        "topicality": 0.9185767
      },
      {
        "mid": "/m/04q6ng",
        "description": "Comfort food",
        "score": 0.8544887,
        "topicality": 0.8544887
      },
      {
        "mid": "/m/07xgrh",
        "description": "Ingredient",
        "score": 0.8450334,
        "topicality": 0.8450334
      },
      {
        "mid": "/m/05jrv",
        "description": "Nori",
        "score": 0.8431285,
        "topicality": 0.8431285
      },
      {
        "mid": "/m/027lnr6",
        "description": "Sakana",
        "score": 0.8388547,
        "topicality": 0.8388547
      }
    ]
  }
DSC_0883.PNG
Ausführungsergebnis (Hamburger)
 {
    "labelAnnotations": [
      {
        "mid": "/m/02q08p0",
        "description": "Dish",
        "score": 0.9934035,
        "topicality": 0.9934035
      },
      {
        "mid": "/m/02wbm",
        "description": "Food",
        "score": 0.9903261,
        "topicality": 0.9903261
      },
      {
        "mid": "/m/01ykh",
        "description": "Cuisine",
        "score": 0.9864208,
        "topicality": 0.9864208
      },
      {
        "mid": "/m/0h55b",
        "description": "Junk food",
        "score": 0.9851551,
        "topicality": 0.9851551
      },
      {
        "mid": "/m/01_bhs",
        "description": "Fast food",
        "score": 0.97022384,
        "topicality": 0.97022384
      },
      {
        "mid": "/m/0cdn1",
        "description": "Hamburger",
        "score": 0.9571771,
        "topicality": 0.9571771
      },
      {
        "mid": "/m/0cc7bks",
        "description": "Buffalo burger",
        "score": 0.94575346,
        "topicality": 0.94575346
      },
      {
        "mid": "/m/03f476",
        "description": "Veggie burger",
        "score": 0.9283731,
        "topicality": 0.9283731
      },
      {
        "mid": "/m/0bp3f6m",
        "description": "Fried food",
        "score": 0.9257971,
        "topicality": 0.9257971
      },
      {
        "mid": "/m/02y6n",
        "description": "French fries",
        "score": 0.92217153,
        "topicality": 0.92217153
      }
    ]
  }
DSC_1050.PNG
Ausführungsergebnis (Shrimp Fly)
  {
    "labelAnnotations": [
      {
        "mid": "/m/02q08p0",
        "description": "Dish",
        "score": 0.9934035,
        "topicality": 0.9934035
      },
      {
        "mid": "/m/02wbm",
        "description": "Food",
        "score": 0.9903261,
        "topicality": 0.9903261
      },
      {
        "mid": "/m/01ykh",
        "description": "Cuisine",
        "score": 0.9864208,
        "topicality": 0.9864208
      },
      {
        "mid": "/m/0g9vs81",
        "description": "Steamed rice",
        "score": 0.9271187,
        "topicality": 0.9271187
      },
      {
        "mid": "/m/07xgrh",
        "description": "Ingredient",
        "score": 0.9207317,
        "topicality": 0.9207317
      },
      {
        "mid": "/m/0bp3f6m",
        "description": "Fried food",
        "score": 0.9098738,
        "topicality": 0.9098738
      },
      {
        "mid": "/m/0dxjn",
        "description": "Deep frying",
        "score": 0.9049985,
        "topicality": 0.9049985
      },
      {
        "mid": "/m/0f99t",
        "description": "Tonkatsu",
        "score": 0.901048,
        "topicality": 0.901048
      },
      {
        "mid": "/m/0krfg",
        "description": "Meal",
        "score": 0.81980187,
        "topicality": 0.81980187
      },
      {
        "mid": "/m/04q6ng",
        "description": "Comfort food",
        "score": 0.8160322,
        "topicality": 0.8160322
      }
    ]
  }

Ergebnisse der Beurteilung von Lebensmittelfotos mit der Cloud Vision API

Es werden nicht nur Austern, Sushi und Hamburger angeboten, sondern auch die Arten. Es kann festgestellt werden, dass das gebratene Garnelenfutter gebraten ist, aber es scheint, dass nicht festgestellt werden kann, dass es sich um ein "gebratenes Garnelenfutter" handelt. Ich habe es mit den Fotos versucht, die in diesem Artikel nicht erwähnt wurden, aber im Grunde schien es in der Lage zu sein, die Art des Lebensmittels zu identifizieren. Obwohl das Genre der frittierten Lebensmittel leicht zu verstehen ist, scheint es schwierig zu sein, die Art der Fotos unter den gleichen Bedingungen wie bei gebratenen Garnelen zu identifizieren, bei denen die Elemente der Garnelen auf dem Bild schwer zu verstehen sind.

Schließlich

Diesmal habe ich versucht, Etiketten zu erkennen, aber es scheint, dass die Cloud Vision-API auch den Farbton des Bildes erkennen kann. Wenn Sie die Tendenz des Schattens von Lebensmittelfotos erfassen können, können Sie möglicherweise verstehen, welche Art von Schatten köstlich aussieht. Die Bilderkennungs-API selbst wird von anderen Anbietern als Google bereitgestellt. Ich denke, wir müssen dies auch in Zukunft versuchen.

[^ 1]: Der Vorgang, das, was Sie sehen, hungrig zu machen, indem Sie Fotos von köstlichen Mahlzeiten hochladen, beispielsweise um Mitternacht

Recommended Posts

Versuchen Sie, Lebensmittelfotos mithilfe der Google Cloud Vision-API zu beurteilen
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Google Cloud Vision API-Beispiel für Python
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Sprachtranskriptionsverfahren mit der Google Cloud Speech API
Verwenden Sie die Google Cloud Vision-API von Python
Verwendung der Cloud Vision API von GCP
Bei der Einführung der Google Cloud Vision-API in Schienen habe ich die Dokumentation befolgt.
[Rails] Erkennen radikaler Bilder durch Analysieren von Bildern mithilfe der Cloud Vision API
So zeigen Sie eine Karte mit der Google Map API (Android) an
Verwendung der Google Cloud Translation API
[GoogleCloudPlatform] Verwenden Sie die Google Cloud-API mit der API-Clientbibliothek
Versuchen Sie, Tweets mithilfe der Twitter-API in großen Mengen zu löschen
Analysieren mit Google Colaboratory mithilfe der Kaggle-API
Sprachtranskriptionsverfahren mit Python und Google Cloud Speech API
Ich habe versucht, mit der Cloud Vision API von GCP automatisch erotische Bilder von Twitter zu sammeln
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
Ich habe die Google Cloud Vision-API zum ersten Mal ausprobiert
Lassen Sie uns die Super Resolution API mithilfe der Google Cloud Platform veröffentlichen
Versuchen Sie, eine lineare Regression mit Pytorch mit Google Colaboratory zu implementieren
Streamen Sie die Spracherkennung mithilfe der gRPC-API von Google Cloud Speech mit Python3 auf dem Mac!
Versuchen Sie es mit der Admin-API von Janus Gateway
Drucken Sie PDF mit Google Cloud Print. (GoogleAPI)
[Python3] Google übersetzt Google Übersetzung ohne Verwendung von API
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Versuchen Sie, Nagios mit pynag zu konfigurieren
Versuchen Sie, Statistiken mit e-Stat abzurufen
Versuchen Sie es mit der Aktions-API von Python argparse
Python ruft die Google Cloud Vision API von LINE BOT über AWS Lambda auf
Erhalten Sie Tweets mit der Google Cloud-Funktion und speichern Sie Bilder automatisch in Google Fotos
Erkennen Sie japanische Zeichen anhand von Bildern mithilfe der Cloud Vision-API von Google mit Python
Regelmäßiger Export von Google Analytics-Rohdaten nach BigQuery mithilfe von Cloud-Funktionen
Verwenden Sie Cloud Composer, um regelmäßig auf die Youtube-API zuzugreifen und eine Pipeline zum Speichern der Ergebnisse in Bigquery zu erstellen
Google Cloud Speech API im Vergleich zu Amazon Transcribe
Versuchen Sie es mit der Wunderlist-API in Python
Streaming-Spracherkennung mit der Google Cloud Speech API
Versuchen Sie, die Kraken-API mit Python zu verwenden
Massenposting an Qiita: Team mit Qiita API
Versuchen Sie, Excel mit Python (Xlwings) zu betreiben.
Bildersammlung mit der benutzerdefinierten Such-API von Google
Erstellen einer Google-Tabelle mit der Python / Google Data-API
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Fordern Sie die Herausforderungen von Cyma weiterhin mit dem OCR-Dienst der Google Cloud Platform heraus