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.
Dieser Artikel fasst die Mindestschritte zur Verwendung der Bilderkennungs-API "Cloud Vision API" von Google zusammen. Schließlich versuche ich, das Lebensmittelfoto zu beurteilen.
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.
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
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.
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.
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.
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.
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.
Damit sind die Einstellungen für die Verwendung der API abgeschlossen.
So rufen Sie die API in Python auf Ich habe Anaconda unter Bezugnahme auf Folgendes installiert.
Anaconda (Windows) installieren
Erstellen Sie die Quelle unter Bezugnahme auf den Inhalt von Referenz der API.
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()
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'})
Gibt die von der API zurückgegebenen Daten aus.
for resp in enumerate(response.json()['responses']):
print (json.dumps(resp, indent=2))
Ü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]
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))
{
"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
}
]
}
{
"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
}
]
}
{
"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
}
]
}
{
"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
}
]
}
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.
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