Article pratique pour regarder en arrière et corriger les connaissances acquises en développant Serverless Web App Mosaic / 87b57dfdbcf218de91e2), et je prévois un total de 17 articles, actuellement 13 articles et 4 autres, mais j'en ai un peu marre. J'en ai marre, ou je veux commencer à implémenter de nouvelles fonctionnalités. C'est pourquoi j'ai commencé. Pour ajouter une fonction de détection de caractère.
Détection de personnage? Reconnaissance de caractère? Cela ressemble à l'OCR (Optical Character Recognition). Il semble que les caractères puissent être détectés même avec AWS Rekognition, mais malheureusement, il ne semble pas prendre en charge le japonais. (En janvier 2020. Je ne l'ai pas essayé, mais il semble qu'il ne soit pas encore pris en charge.) Cependant, l'API Cloud Vision de Google prend également en charge le japonais, j'ai donc décidé de l'utiliser.
Alors faisons-le tout de suite. Accédez à Google Cloud Platform ou Google Developpers Console> API et services. https://console.cloud.google.com/apis https://console.developers.google.com/apis
Appuyez sur le bouton "+ Activer l'API et les services" en haut de l'écran.
Recherchez et activez l'API Cloud Vision.
Un compte de service sera ajouté en tant qu'informations d'authentification, mais il sera omis ici car il chevauche cet article.
Pour importer la bibliothèque requise pour appeler l'API de Google avec un compte de service, veuillez consulter cet article comme précédemment.
Le code qui transmet le fichier image local à l'API Vision et détecte le visage et le texte ressemble à ceci:
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)
Dans cet exemple de code, «FACE_DETECTION» et «TEXT_DETECTION» sont spécifiés.
En plus de cela, vous pouvez spécifier LABEL_DETECTION
, LANDMARK_DETECTION
, LOGO_DETECTION
, etc., mais si vous le spécifiez, la charge sera ajoutée en conséquence. Par conséquent, si le but est uniquement la détection de caractères, il est préférable de spécifier uniquement TEXT_DETECTION
.
Je n'entrerai pas dans les détails de ce qui peut être spécifié pour les fonctionnalités et le json renvoyé. Consultez la documentation de l'API Cloud Vision (https://cloud.google.com/vision/docs?hl=ja). Cliquez ici pour obtenir des informations sur les tarifs (https://cloud.google.com/vision/pricing?hl=ja).
Mais je ne pouvais pas.
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()
Je pensais que ce serait cool comme ça, mais j'ai eu l'erreur suivante, et j'ai essayé diverses choses, mais je ne pouvais pas le faire après tout.
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."}}]}
Je peux appeler Vision, mais il semble que je ne puisse pas accéder à l'image (imageUri) sur le Web à partir de Vision. Cela ne fonctionnait pas même si je spécifiais le lien direct de l'image sur le compartiment public de S3. Le mystère est. S'il vous plaît, faites-moi savoir.
TEXT_DETECTION vous donne deux éléments: textAnnotations
et fullTextAnnotation
.
Le résultat de l'inclusion de la zone détectée par textAnnotations en bleu et de la zone détectée par fullTextAnnotation en vert était le suivant.
Je pense que les résultats sont raisonnables, mais j'ai l'impression que la plage d'un caractère est légèrement différente pour le bleu, probablement parce qu'il est japonais.
En outre, il semble faible lorsque chaque personnage est indépendant comme le montre l'image ci-dessous. Que ce soit aussi un problème propre aux japonais, qu'il puisse être détecté s'il s'agit d'une caractéristique différente, ou s'il peut être ajusté avec d'autres paramètres, je ne l'ai pas approfondi, mais je n'ai quand même pas obtenu le résultat attendu. Il est difficile d'espérer que l'apprentissage de l'API progressera à l'avenir et que les caractères de cette image pourront être détectés sans omission. Quand Akatsuki, dont AWS Rekognition prend en charge le japonais pour la détection des caractères, je pense d'abord évaluer cette image!
Je sais qu'il est important et nécessaire de le rassembler sous forme d'article, mais c'est le plus amusant lorsque je crée quelque chose de nouveau. Avec ce flux, j'ai pu écrire cet article sur l'API Vision en douceur. Ce serait compliqué d'écrire un article plus tard, alors j'ai pensé qu'il serait peut-être important de l'écrire rapidement alors que j'étais nouveau dans ma mémoire et que j'étais en pleine tension.
J'utilise Mosaic, une application Web sans serveur que je crée, essentiellement l'infrastructure AWS, mais j'aimerais finalement créer la même chose avec GCP. D'ici la fin de 2020. Je pense qu'il serait préférable de construire l'infrastructure de manière unifiée, mais pour les services d'API Web tels que Rekognition et Vision API, soit l'un d'eux convient, soit celui qui peut réaliser ce que vous voulez faire sera sélectionné. Les deux appellent simplement l'API, donc ce n'est pas un gros problème, et cela peut être la même chose pour n'importe quel système après tout, mais cela donne l'impression d'un modèle en plastique fabriqué en combinant des pièces plus fortes. Je ne pense pas que vous ayez besoin de tout savoir, mais je ne pense pas qu'il soit bon de trop s'en tenir à un.
C'est bien d'avoir un service de haute précision appris par machine si facile à utiliser, mais c'est pénible de rester bloqué s'il ne donne pas les résultats escomptés. Cependant, je ne peux rien faire dans mon futur domaine de recherche, donc je ne peux que m'asseoir et attendre les résultats que j'attends de sortir un jour.