Googleの画像認識API「Cloud Vision API」を使って画像判定をしてみた

    itouhirotaka

    こんにちは、ロボホンに興味がある中村です。

    ロボホンを始め、巷では人工知能や機械学習というワードが非常に騒がれています。

    世の中の流れに取り残されないように機械学習について最近勉強しています。

    今回そんな機械学習系サービスのひとつであるGoogle社の画像認識APIサービス「Cloud Vision API」を使ってみました。

    ■VisionAPIの概要

    これはどんなサービスかというと、画像認識を自動で行ってくれるサービスです。

    APIリクエスト時にどのような方法で画像分析して欲しいかリクエストすれば、それに関する情報をレスポンスしてくれます。
    例えば指定の画像を文字情報を自動で検出(OCR)することができます。
    これだけでもかなり有用性がありそうです。

    他にも顔のある画像の場合、顔座標の位置判別や、悲しみや怒りの度合いを5段階で判定してくれたり、その画像がどのようなカテゴリか(「人」「犬」「食べ物」など)を自動で判定してくれたり、その画像は暴力的な画像かアダルトコンテンツなのかなども自動で判定してくれたり、などなど。
    とにかく機能が満載です。

    ■VisionAPIの使い方

    ではどうやってこれを使うのでしょうか?
    かなり簡易ですが、必要なステップは以下になります。
    1.goolgeアカウントの作成をし、APIキーを発行
    google公式サイト(https://cloud.google.com/)でプロジェクトを作成し、visionAPIを登録します。
    アカウントがない場合は、アカウント登録も必要です。
    visionAPI
    この画面からAPIを登録すればOKです。
    これでvisonAPIが使えます。
    ※従量課金なので注意が必要

    2.APIキーを設定し、VisionAPIを実行
    以下APIのURLを指定することで実行ができます。
    URL)
    https://vision.googleapis.com/v1/images:annotate?key=xxxx

    このURLに対して、post形式で、必要なパラメータ送信すれば実行できます。

    詳しくは公式ドキュメントを参照してください。
    https://cloud.google.com/vision/docs/reference/rest/v1/images/annotate

    簡単そうですね。

    ■VisionAPIを実際に使ってみた

    ということで、このAPIを試しに使ってみました。
    サンプルにさせていただいたのは、弊社フロントエンジニアの伊藤ひろたかさんです。
    オフィシャルサイトの画像を使わせていただきました。
    ※本人から快く了承をいただいております
    itouhirotaka

    ・実行
    実行してみます。
    以下リクエスト時のパラメータ情報です。
    //URL
    https://vision.googleapis.com/v1/images:annotate?key=xxxx
    //リクエストパラメータ
    "requests": [
    {
    "image": {"content": [[base64でエンコードした画像ファイル]]},
    "features": [
    {"type": "FACE_DETECTION",},
    {"type": "LABEL_DETECTION","maxResults": 1},
    {"type": "SAFE_SEARCH_DETECTION"}
    ]
    }
    ]

    ※実行はphpでしています
    今回実行してみたリクエスト種別は以下3つです。

    ・FACE_DETECTION(顔検出)

    顔座標の位置や傾き度合い、楽しみの感情などを検出します。
    複数の顔があったらその数だけ検出可能。

    ・LABEL_DETECTION(画像のカテゴリの検出)

    送信した画像がどのような種類なのかを検出してくれます。
    候補の数も指定できるので、5種類で指定しました。

    ・SAFE_SEARCH_DETECTION(有害画像検出)

    暴力性があるか、アダルトかなどを5段(Likelihoodという指標)で評価してくれます。
    UNLIKELYだと度合いが低く、LIKELYだと高いという意味です。
    あまり馴染みがない表現ですね。

    ・結果
    "responses": [
    {
    "faceAnnotations": [
    {
    "boundingPoly": {
    "vertices": [
    { "x": 122, "y": 58},
    { "x": 308, "y": 58},
    {"x": 308,"y": 274},
    { "x": 122, "y": 274}
    ]
    },
    //------省略----
    "rollAngle": 13.699316,
    "panAngle": 20.595034,
    "tiltAngle": -9.924839,
    "detectionConfidence": 0.99293435,
    "landmarkingConfidence": 0.7031865,
    //------省略----
    "labelAnnotations": [
    {
    "mid": "/m/09j2d",
    "description": "clothing",
    "score": 0.9022423
    },
    //------省略----
    {
    "mid": "/m/0h8nvk9",
    "description": "dishware",
    "score": 0.54732513
    }
    ],
    "safeSearchAnnotation": {
    "adult": "VERY_UNLIKELY",
    "spoof": "VERY_UNLIKELY",
    "medical": "VERY_UNLIKELY",
    "violence": "VERY_UNLIKELY"
    }
    }
    ]

    ■VisionAPIの結果の確認方法

    上記のようにjson形式でデータを取得できました。
    一部抜粋しながら、読み解きます。

    ・faceAnnotationsの結果について

    FACE_DETECTION(顔検出)に対する結果です。
    ”boundingPoly": {"vertices": [{ "x": 122,"y": 58 },{ "x": 308, "y": 58}, {"x": 308,"y": 274},{"x": 122,"y": 274}]}→x、yで顔のパーツごとの配置を返しています。
    “boundingPoly”は顔の輪郭の範囲を示すのですが、それがx、y座標で示されています。(ピクセル)
    他にもlandmarksというプロパティ情報には目や鼻など各パーツごとにすべての座標があります。
    ”panAngle": 20.595034→顔の左右の傾きの割合を示しています。20度ほど傾いていると判定されています。
    "joyLikelihood": "VERY_LIKELY"→楽しみの感情の度合いを示しています。
    VERY_LIKELY=とてもレベルが高い
    ということなので、googleにとても楽しんでいると判断されています。

    ・labelAnnotationsの結果について

    LABEL_DETECTION(ラベル検出)に対する結果です。
    ”description": "clothing”,”score": 0.9022423→画像は洋服(clothing)のカテゴリに属すると判定されています。
    scoreは検出の信頼度なので、0.9はかなり高い信頼度に部類するとのことです。
    帽子がそう検出されたようです。
    ”description": "dishware","score": 0.54732513→画像は食器(dishware)のカテゴリに属すると判定されています。
    score0.5なので信頼度はそこまで高くないです。
    ちょっと食器はおかしいですね。

    ・SafeSearchAnnotationの結果

    SAFE_SEARCH_DETECTION(有害画像検出)に対する結果です。
    全項目が
    VERY_UNLIKELY=とてもレベルが低い
    とのことなので、有害要素は全然ない、とgoogleに判定されています。
    素晴らしいです。

    ■まとめ

    簡単ですが、visionAPIの使い方を理解できた気がします。
    他の画像でもいろいろ試しましたが、期待する結果が返ってきており、かなり信頼度はありそうです。(顔が食器に判定されたりと、稀に違和感のある結果も出るようになっていましたが、、)

    VisionAPI以外にもgoogleでは機械学習系のAPIは沢山出しており、使い方次第では面白いサービスが簡単にできそうです。

    いいアイデアあるという人がいましたら中村にも声かけてもらえたら嬉しいです。
    ではでは。