Google の画像認識APIであるGoogle Cloud Visionが使えるようになりましたので、少しいじってみました。
Google Cloud Visonは、物体検知、有害コンテンツ検知、ランドマーク検知、OCR、顔検知など画像の情報を抜き出すことが可能です。REST APIでGoogleサイドと通信していると想定される。
Vision用のService Accountを作成し、credentialsの設定をするしておく必要があります。
export GOOGLE_APPLICATION_CREDENTIALS=deeplearning-environment-78bacd3d4b5b.json
Google APIにアクセスするのに、API discovery documentをベースとしたservice objectを作成する。GAリリースしたものは自動でfetchされるのだが、Vision APIは、alphaリリースなので、下記よりダウンロードする必要があります。
https://cloud.google.com/vision/docs/vision_discovery_v1alpha1.json
def get_vision_service(): credentials = GoogleCredentials.get_application_default() with open(API_DISCOVERY_FILE, 'r') as f: doc = f.read() return discovery.build_from_document( doc, credentials=credentials, http=httplib2.Http())
LABEL_DETECTION | ラベル |
FACE_DETECTION | 顔認識 |
LANDMARK_DETECTION | ランドマーク認識 |
TEXT_DETECTION | OCR |
LOGO__DETECTION | ロゴ |
SAFE_SEARCH__DETECTION | 有害情報検知 |
SUGGESTION_DETECTION |
以下ランドマーク認識の例です。以下で画像データをbase64にエンコードし、Vison APIに渡しています。
with open(photo_file, 'rb') as image: image_content = image.read() batch_request = [{ 'image': { 'content': base64.b64encode(image_content) }, 'features': [{ 'type': 'LANDMARK_DETECTION', 'maxResults': 4, }] }]
service = get_vision_service() request = service.images().annotate(body={ 'requests': batch_request, }) response = request.execute()
過去デジカメで撮影した写真を解析すると大阪城(Osaka Castle)として認識されています。位置情報もばっしり。
{u'responses': [{u'landmarkAnnotations': [{u'locations': [{u'latLng': {u'latitude': 34.686777, u'longitude': 135.525799}}], u'score': 0.613115, u'mid': u'/m/024b_g', u'boundingPoly': {u'vertices': [{u'y': 955, u'x': 1545}, {u'y': 955, u'x': 2411}, {u'y': 1346, u'x': 2411}, {u'y': 1346, u'x': 1545}]}, u'description': u'Osaka Castle'}]}]}
TEXT_DETECTIONを使うと、ちらし画像から文字情報を取り出す(OCR)することもできます。
顔認識は、認識したポリゴン点の座標(fdBoundingPoly)を返してくれます。ただ、画像の中のすべての顔を認識してくれない、顔認識に失敗するケースがあるようです。