Hands-on-Artikel, um zurückzublicken und das durch die Entwicklung von Serverless Web App Mosaic gewonnene Wissen zu korrigieren. / 87b57dfdbcf218de91e2), und ich plane insgesamt 17 Artikel, derzeit 13 Artikel und 4 weitere, aber ich werde es ein wenig leid. Ich habe es satt oder möchte mit der Implementierung neuer Funktionen beginnen. Deshalb habe ich angefangen. Hinzufügen einer Zeichenerkennungsfunktion.
Zeichenerkennung? Zeichenerkennung? Es klingt wie OCR (Optical Character Recognition). Es scheint, dass Zeichen auch mit AWS Rekognition erkannt werden können, aber leider scheint es kein Japanisch zu unterstützen. (Stand Januar 2020. Ich habe es nicht ausprobiert, aber es scheint, dass es noch nicht unterstützt wird.) Die Cloud Vision-API von Google unterstützt jedoch auch Japanisch. Daher habe ich mich für diese entschieden.
Also machen wir es gleich. Gehen Sie zu Google Cloud Platform oder Google Developpers Console> APIs und Dienste. https://console.cloud.google.com/apis https://console.developers.google.com/apis
Klicken Sie oben auf dem Bildschirm auf die Schaltfläche "+ API und Dienste aktivieren".
Suchen und aktivieren Sie die Cloud Vision-API.
Ein Dienstkonto wird als Authentifizierungsinformation hinzugefügt, aber hier weggelassen, da es sich mit [diesem Artikel] überschneidet (https://qiita.com/w2or3w/items/b66a4a8e45e6001a9c46).
Informationen zum Importieren der Bibliothek, die zum Aufrufen der Google-API mit einem Dienstkonto erforderlich ist, finden Sie in diesem Artikel wie zuvor.
Der Code, der die lokale Bilddatei an die Vision-API übergibt und Gesicht und Text erkennt, sieht folgendermaßen aus:
lambda_function.py
:
def detectFacesByGoogleVisionAPIFromF(localFilePath, bucket, dirPathOut):
try:
keyFile = "service-account-key.json"
scope = ["https://www.googleapis.com/auth/cloud-vision"]
api_name = "vision"
api_version = "v1"
service = getGoogleService(keyFile, scope, api_name, api_version)
ctxt = None
with open(localFilePath, 'rb') as f:
ctxt = b64encode(f.read()).decode()
service_request = service.images().annotate(body={
"requests": [{
"image":{
"content": ctxt
},
"features": [
{
"type": "FACE_DETECTION"
},
{
"type": "TEXT_DETECTION"
}
]
}]
})
response = service_request.execute()
except Exception as e:
logger.exception(e)
def getGoogleService(keyFile, scope, api_name, api_version):
credentials = ServiceAccountCredentials.from_json_keyfile_name(keyFile, scopes=scope)
return build(api_name, api_version, credentials=credentials, cache_discovery=False)
In diesem Beispielcode werden "FACE_DETECTION" und "TEXT_DETECTION" angegeben.
Darüber hinaus können Sie "LABEL_DETECTION", "LANDMARK_DETECTION", "LOGO_DETECTION" usw. angeben. Wenn Sie dies jedoch angeben, wird die Gebühr entsprechend hinzugefügt. Wenn der Zweck nur die Zeichenerkennung ist, ist es daher besser, nur "TEXT_DETECTION" anzugeben.
Ich werde nicht auf die Details eingehen, die für Funktionen angegeben werden können, und der JSON wird zurückgegeben. Weitere Informationen finden Sie in der Dokumentation zur Cloud Vision-API (https://cloud.google.com/vision/docs?hl=ja). Klicken Sie hier, um Preisdetails anzuzeigen (https://cloud.google.com/vision/pricing?hl=ja).
Aber ich konnte nicht.
test.py
imageUri = "https://drive.google.com/uc?id=" + fileID
service_request = service.images().annotate(body={
"requests": [{
"image":{
"source":{
"imageUri": imageUri
}
},
"features": [
{
"type": "FACE_DETECTION"
},
{
"type": "TEXT_DETECTION"
}
]
}]
})
response = service_request.execute()
Ich dachte, es wäre so cool, aber ich habe den folgenden Fehler erhalten und verschiedene Dinge ausprobiert, aber ich konnte es doch nicht tun.
response.json
{"responses": [{"error": {"code": 7, "message": "We're not allowed to access the URL on your behalf. Please download the content and pass it in."}}]}
{"responses": [{"error": {"code": 4, "message": "We can not access the URL currently. Please download the content and pass it in."}}]}ass it in."}}]}
Ich kann Vision aufrufen, aber anscheinend kann ich von Vision aus nicht auf das Bild (imageUri) im Web zugreifen. Es hat nicht funktioniert, selbst wenn ich den direkten Link des Bildes im öffentlichen Bucket von S3 angegeben habe. Geheimnis ist. Lass es mich wissen, bitte.
TEXT_DETECTION enthält zwei Elemente: "textAnnotations" und "fullTextAnnotation".
Das Ergebnis des Einschließens des durch textAnnotations erkannten Bereichs in Blau und des durch fullTextAnnotation in Grün erkannten Bereichs war wie folgt.
Ich denke, dass die Ergebnisse vernünftig sind, aber ich habe den Eindruck, dass der Bereich eines Zeichens für das blaue etwas unterschiedlich ist, wahrscheinlich weil es japanisch ist.
Es scheint auch schwach zu sein, wenn jedes Zeichen unabhängig ist, wie in der Abbildung unten gezeigt. Ob dies auch ein japanisches Problem ist, ob es erkannt werden kann, wenn es sich um ein anderes Merkmal handelt, oder ob es mit anderen Parametern angepasst werden kann, habe ich nicht tief verfolgt, aber ich habe trotzdem nicht das erwartete Ergebnis erzielt.
Es ist schmerzlich zu hoffen, dass das API-Lernen in Zukunft Fortschritte macht und die Zeichen in diesem Bild ohne Auslassung erkannt werden können.
Wenn Akatsuki, dessen AWS-Erkennung Japanisch für die Zeichenerkennung unterstützt, denke ich daran, dieses Bild zuerst zu bewerten!
Ich weiß, dass es wichtig und notwendig ist, es als Artikel zusammenzustellen, aber es macht am meisten Spaß, wenn ich etwas Neues erstelle. Mit diesem Ablauf konnte ich diesen Vision-API-Artikel reibungslos schreiben. Es wäre mühsam, später einen Artikel zu schreiben, daher hielt ich es für wichtig, ihn schnell zu schreiben, während ich neu in meinem Gedächtnis war und unter Hochspannung stand.
Ich verwende Mosaic, eine serverlose Web-App, die ich mache, im Grunde die AWS-Infrastruktur, aber irgendwann möchte ich dasselbe mit GCP erstellen. Bis Ende 2020. Ich denke, es wäre besser, die Infrastruktur auf einheitliche Weise aufzubauen, aber für Web-API-Dienste wie Rekognition und Vision API ist entweder einer in Ordnung oder derjenige, der das erreichen kann, was Sie tun möchten, wird ausgewählt. Beide rufen nur die API auf, es ist also keine große Sache, und es mag zwar für jedes System gleich sein, aber es macht das Gefühl wie ein Plastikmodell, das durch das Kombinieren von Teilen hergestellt wird. Ich denke nicht, dass Sie alles wissen müssen, aber ich denke nicht, dass es gut ist, sich zu sehr an einen zu halten.
Ich bin froh zu sehen, wie einfach es ist, maschinell erlernte, hochpräzise Dienste zu nutzen, aber es ist schmerzhaft, stecken zu bleiben, wenn nicht die erwarteten Ergebnisse erzielt werden. In meinem zukünftigen Forschungsbereich kann ich jedoch nichts tun, sodass ich nur auf die Ergebnisse warten kann, die ich eines Tages erwarten werde.
Recommended Posts