よしたく blog

ほぼ週刊で記事を書いています

Google Cloud Vision APIのウェブ検出機能を使ったら自分の想定と違った話

自分は安住紳一郎アナウンサーに似てるってよく言われます(立ち居振る舞い含めて)。メガネをかけるとおぎやはぎの小木さんに似てるとも言われます。上記の二人同士が似てるとあまり思わないです。そこで自分がどちらに似ているのか、はたまた他に似ている芸能人がいるのか機械学習的なやつでハッキリさせてやろうと思いました。

数年ぶりに会った失礼な友人からです。

と思ったら、便利な世の中でして、GoogleAPIで画像を投げたらそれにちかしいものを返してくれるものが既にありました。 https://cloud.google.com/vision/docs/detecting-web?hl=ja

このAPIを使って自分の画像を投げたら似ている芸能人を教えてくれることを期待しています。

ソースコードはこんな感じ

get_env.pyファイル

dotenvについての使い方はこちら APIキーを見せずにpushできるpython-dotenvを使ってみた https://yoshitaku.net/2018/03/31/396/

import os
import os.path
import dotenv

dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
dotenv.load_dotenv(dotenv_path)

API_KEY = os.environ.get("ENV_KEY")

vision.pyファイル

import base64
import json
import requests

import get_env

bin_captcha = open("yoshitaku.jpg", 'rb').read()
str_encode_file = base64.b64encode(bin_captcha).decode('ascii')
str_url = "https://vision.googleapis.com/v1/images:annotate?key="
str_api_key = get_env.API_KEY
str_headers = {'Content-Type': 'application/json'}
str_json_data = {
    'requests': [
        {
            'image': {
                'content': str_encode_file
            },
                'features': [
                    {
                        'type': "WEB_DETECTION"
                    }
                ]
            }
    ]
}
response = requests.post(str_url + str_api_key,
    data=json.dumps(str_json_data),
    headers=str_headers
)
json_response = json.loads(response.text)
print(json_response["responses"][0]["webDetection"])

送った画像はこちら(白枠はなし)

返ってきたのはこちら

{'webEntities': [{'entityId': '/m/06ntj', 'score': 0.8901126, 'description': 'Sport'}, {'entityId': '/m/03x045', 'score': 0.7374585, 'description': 'Team sport'}, {'entityId': '/t/29syjjvbyn_rl', 'score': 0.7067}, {'entityId': '/m/0gl2ny2', 'score': 0.64155483, 'description': 'Football player'}, {'entityId': '/m/02vx4', 'score': 0.6196, 'description': 'Football'}, {'entityId': '/t/21vq7mhwrfsty', 'score': 0.5768}, {'entityId': '/m/02vzx9', 'score': 0.5675505, 'description': 'Player'}, {'entityId': '/m/018tl7', 'score': 0.5451121, 'description': 'Competition'}, {'entityId': '/m/011l78', 'score': 0.5430361, 'description': 'Team'}, {'entityId': '/m/020m7t', 'score': 0.5402399, 'description': 'Ball game'}], 'visuallySimilarImages': [{'url': 'https://www.gannett-cdn.com/-mm-/d6aadd8065c265d807c7d2692cc635d7e35332c0/c=0-235-1360-2048&r=537&c=0-0-534-712/local/-/media/2018/04/13/TennGroup/JacksonTN/636592306429549551-Paige-Hampton.JPG'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/3/3f/Cech_-_2015_Emirates_Cup.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/24/Conor_O%27Brien_%28soccer_player%29.jpg/220px-Conor_O%27Brien_%28soccer_player%29.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Kara_Mbodj.jpg/220px-Kara_Mbodj.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Youssef_Toutouh.JPG/220px-Youssef_Toutouh.JPG'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Kingsley_Coman_Training_2017-03_FC_Bayern_Muenchen-2.jpg/220px-Kingsley_Coman_Training_2017-03_FC_Bayern_Muenchen-2.jpg'}, {'url': 'https://www.irishtimes.com/polopoly_fs/1.3319494.1512678148!/image/image.jpg_gen/derivatives/box_620_330/image.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Sean_Murray_watford_2014.jpg/220px-Sean_Murray_watford_2014.jpg'}, {'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Carl_Ikeme.jpg/200px-Carl_Ikeme.jpg'}, {'url': 'https://media.npr.org/assets/img/2015/11/25/cam-ron-12_sq-e466054e25e80550d4f73f281348433f7567a1e3-s300-c85.jpg'}], 'bestGuessLabels': [{'label': 'player'}]}

画像のURLはvisuallySimilarImagesに入ってるっぽいですね! これらが似ているやつかぁ

なんか思っていたのと違う

ちゃんとドキュメントを読みました。

ウェブ エンティティ検出ベータ版機能  |  Google Cloud Vision API ドキュメント  |  Google Cloud

最良の推測ラベル: ウェブ エンティティ検出リクエストには bestGuessLabels リストが含まれ、画像の内容を最もよく表すラベルを提供します。

確かにレスポンスの最後にラベルがありました。'bestGuessLabels': [{'label': 'player'}]という記述が。自分の画像を送って、一番特徴あるもの・こと(今回はplayer)を抜き出して、その特徴に近い画像を取ってきてくれるんですね。勉強になりました。

しかし、ブラウザのGoogleから「player」「Sport」「Football Player」を調べても

「player」の結果

「Sport」の結果

「Football Player」の結果

同じものは出てきません。このあたりどうなっているか気になりました… あとは、この機能はどういうことを想定して作られたんだ?自分の想像力が足りない…


本題に戻すと、自分が誰に似ているのかはAutoML Visionを使うと良さそうです。
https://cloud.google.com/automl/ http://www.atmarkit.co.jp/ait/articles/1801/30/news020.html

2018/4/22時点で日本では展開されていないようです。AutoML Visionは自分でテストデータを用意して、Google上で学習させて機械学習によるオリジナル識別器を作れるようです。 下のURLはラーメン二郎41店舗を機械学習し、どの店舗で作られたラーメンなのか見分けられるようです。精度は94.5%。す、すごい…
ラーメン二郎とブランド品で AutoML Vision の認識性能を試す

Googleで検索したところ、似ている芸能人を探すアプリってあまり良いのが無いようで、AutoMLを使って作ってみようかなと思いました。

たまには、やってみたけど失敗・うまくいかなかったネタでした。