Google Cloud Platform に登録してCloud Vision APIの画像認識機能をお試ししてみる①

Cloud Vision APIとは

参照:Vision API - 画像コンテンツ分析  |  Google Cloud Platform
Google Cloud Vision API は、使いやすい REST API にパワフルな機械学習モデルが
組み込まれており、画像の内容を認識するアプリケーションの開発を可能にします。
Google Cloud Vision API は、膨大な数のカテゴリ(「ヨット」や「ライオン」、
エッフェル塔」など)に各画像を素早く分類する機能や、画像内の個々の物体や
人の顔を検出する機能、画像内に含まれているテキストを検出して読み取る機能を備えています。

また、画像カタログのメタデータ作成、不適切なコンテンツの管理、画像の感情分析を通じた
新しいマーケティング手法の導入が可能になります。
リクエストでアップロードされた画像を分析することも、Google Cloud Storage の
画像ストレージに統合することもできます。


ざっくりいうと、画像をCloud Vision APIに送れば、画像内の情報を人工知能が読取り、結果を返しますよ~
という感じでしょうか。



何ができるのか?

Method: images.annotate  |  Google Cloud Vision API  |  Google Cloud Platformによると

機能 指定するタイプ 説明
ラベル検出 LABEL_DETECTION 乗り物や動物など、画像に写っているさまざまなカテゴリの物体を検出できます。
顔検出 FACE_DETECTION 画像に含まれる複数の人物の顔を検出できます。感情の状態や帽子の着用といった主要な顔の属性についても識別されます。 ただし、個人を特定する顔認識には対応していません。
有害コンテンツ検出 SAFE_SEARCH_DETECTION アダルト コンテンツや暴力的コンテンツなど、画像に含まれる有害コンテンツを検出できます。
画像特性 IMAGE_PROPERTIES ドミナント カラーなど、画像の一般的特性を検出できます。
ロゴ検出 LOGO_DETECTION 画像に含まれる一般的な商品ロゴを検出できます。
ランドマーク検出 LANDMARK_DETECTION 画像に含まれる一般的な自然のランドマークや人工建造物を検出できます。
光学式文字認識(OCR TEXT_DETECTION 画像内のテキストを検出、抽出できます。幅広い言語がサポートされ、言語の種類も自動で判別されます。

といった機能が使えるようです。

すごいですね~(*^^*)
これらの機能を手作業でプログラミングしようとすると、とてつもなく大変ですが、
Cloud Vision APIであれば、適当な画像とパラメータを渡してやるだけで実現できるんです。
人工知能やドローン、VRなどなど色んな用途が考えられます。

2017/05/16 追記
いろいろ試した結果をこちらに載せました。↓
puu-0328.hatenablog.com





事前準備
Googleアカウント
これがないと始まりません。
Googleアカウントをお持ちでない方は、下記のリンクからGoogleアカウントを作成してください。
Google アカウントの作成
クレジット(デビットカード
Google Cloud Platform を利用するにはクレジット(デビット)カードが必要です。
手作業で課金しなければ、勝手に引き落としされることはありませんが、クレカ情報を入力するのに抵抗がある方は諦めてください(T_T)




Google Cloud Platformの登録

下記リンクにアクセスし、画面右上の[無料トライアル]をクリックします。

Vision API - 画像コンテンツ分析  |  Google Cloud Platform
f:id:puu_0328:20170515130444p:plain


国:[日本]を選択し、受託:機能についてメールでお知らせを受け取りたい場合のみ[はい]を選択。
利用規約を確認したら、[はい]を選択して[同意して続行]をクリックします。
f:id:puu_0328:20170515131003p:plain


支払いの請求先とクレジットカードを登録します。

支払いを現在ログインしているアカウントに請求する場合は初期表示のまま、その他の必須項目に入力します。
f:id:puu_0328:20170515134823p:plain



その他の請求先にしたい場合は[お支払いプロファイルを作成]を選択して各入力項目に入力します。
f:id:puu_0328:20170515134511p:plain


クレジット(デビット)カードの情報まで入力します。
また、クレジットカードの情報を登録しても、自動的に請求されることはありません。
すべて入力できたら、[無料トライアルを開始]をクリックします。
f:id:puu_0328:20170515135132p:plain



このような画面に遷移したら、登録完了です。
f:id:puu_0328:20170515135652p:plain






Cloud Vision APIを試す

Google Cloud Platform の検索フォームに「Cloud Vision」と入力すると
候補に[Google Cloud Vision API]が表示されるので、[Google Cloud Vision API]をクリックします。
f:id:puu_0328:20170515181506p:plain


[▶有効にする]を押下します。
f:id:puu_0328:20170515165133p:plain




Cloud Vision APIが有効になったことを確認したら、[このAPIAPI Explorerで試す]をクリックします。
f:id:puu_0328:20170515140457p:plain


[vision.images.annotate]をクリックします。
f:id:puu_0328:20170515165511p:plain


パラメータを指定します。
ここでは、「OCRの(光学文字認識)機能(TEXT_DETECTION)」を用いて、画像にどのような物体が含まれているか認識してみます。


[Request body]にJSON形式でパラメータを渡します。
Cloud Vision API のリクエストとレスポンス  |  Google Cloud Vision API ドキュメント  |  Google Cloud Platform
を参照すると以下のような形式で渡せばよい事がわかります。

{
"requests":[
    {
      "image":{
        "content":"/9j/7QBEUGhvdG9...image contents...eYxxxzj/Coa6Bax//Z"(渡したい画像(BASE64形式))
      },
      "features":[
        {
          "type":"LABEL_DETECTION", (使いたい機能のタイプ)
          "maxResults":1 (APIから返ってくる結果の数)
        }
      ]
    }
  ]
}


"content"に設定する画像はBASE64形式に変換する必要があります。
私はこちらを使わせて頂きました。
syncer.jp


[Request body]のテキストボックスをクリックします。
[--add a property--]が表示されるので、「requests」を選択します。
f:id:puu_0328:20170515150147p:plain


"request"の{}の中で「image」を選択、更に「content」を選択します。
f:id:puu_0328:20170515151552p:plain


"content":"_______________"の中に先程、画像をBASE64形式にエンコードしたものを貼り付けます。
※上記のツールでエンコードした文字列は「data:image/jpeg;base64,/9j/..」といった感じになってるはずです。
これの「data:image/jpeg;base64,」は削除して、「/9j/..」から始まるようにして貼り付けしてください。

f:id:puu_0328:20170515151829p:plain



"image"の{}の下で「features」を選択します。
f:id:puu_0328:20170515152030p:plain


"features"の{}の中で「type」を選択し、「TEXT_DETECTION」を入力します。
更に「maxResults」を選択し、「1」を入力します。
f:id:puu_0328:20170515152516p:plain


ここまでできたら、画面下の[Execute]をクリックします。
※[Execute]が[Analyze and execute]となっている場合、
認証が完了していませんので、[Analyze and execute]をクリックして認証してください。

f:id:puu_0328:20170515152943p:plain



実行結果

送った画像はこちらです。
f:id:puu_0328:20170515174835j:plain


リクエストパラメータとして
f:id:puu_0328:20170515175836p:plain
を送信し。

レスポンスとして、このようなパラメータが返ってきました。
一番下を確認すると、f:id:puu_0328:20170515180107p:plainが表示されていることから、
ちゃんと「test」という文字列が認識できていることが分かります。

200
 
- Show headers -
  
{
 "responses": [
  {
   "textAnnotations": [
    {
     "locale": "en",
     "description": "test\n",
     "boundingPoly": {
      "vertices": [
       {
        "x": 44,
        "y": 36
       },
       {
        "x": 162,
        "y": 36
       },
       {
        "x": 162,
        "y": 90
       },
       {
        "x": 44,
        "y": 90
       }
      ]
     }
    },
    {
     "description": "test",
     "boundingPoly": {
      "vertices": [
       {
        "x": 44,
        "y": 37
       },
       {
        "x": 162,
        "y": 36
       },
       {
        "x": 162,
        "y": 89
       },
       {
        "x": 44,
        "y": 90
       }
      ]
     }
    }
   ],
   "fullTextAnnotation": {
    "pages": [
     {
      "property": {
       "detectedLanguages": [
        {
         "languageCode": "en"
        }
       ]
      },
      "width": 188,
      "height": 118,
      "blocks": [
       {
        "property": {
         "detectedLanguages": [
          {
           "languageCode": "en"
          }
         ]
        },
        "boundingBox": {
         "vertices": [
          {
           "x": 44,
           "y": 37
          },
          {
           "x": 162,
           "y": 36
          },
          {
           "x": 162,
           "y": 89
          },
          {
           "x": 44,
           "y": 90
          }
         ]
        },
        "paragraphs": [
         {
          "property": {
           "detectedLanguages": [
            {
             "languageCode": "en"
            }
           ]
          },
          "boundingBox": {
           "vertices": [
            {
             "x": 44,
             "y": 36
            },
            {
             "x": 162,
             "y": 36
            },
            {
             "x": 162,
             "y": 90
            },
            {
             "x": 44,
             "y": 90
            }
           ]
          },
          "words": [
           {
            "property": {
             "detectedLanguages": [
              {
               "languageCode": "en"
              }
             ]
            },
            "boundingBox": {
             "vertices": [
              {
               "x": 44,
               "y": 37
              },
              {
               "x": 162,
               "y": 36
              },
              {
               "x": 162,
               "y": 89
              },
              {
               "x": 44,
               "y": 90
              }
             ]
            },
            "symbols": [
             {
              "property": {
               "detectedLanguages": [
                {
                 "languageCode": "en"
                }
               ]
              },
              "boundingBox": {
               "vertices": [
                {
                 "x": 44,
                 "y": 37
                },
                {
                 "x": 68,
                 "y": 37
                },
                {
                 "x": 68,
                 "y": 90
                },
                {
                 "x": 44,
                 "y": 90
                }
               ]
              },
              "text": "t"
             },
             {
              "property": {
               "detectedLanguages": [
                {
                 "languageCode": "en"
                }
               ]
              },
              "boundingBox": {
               "vertices": [
                {
                 "x": 69,
                 "y": 37
                },
                {
                 "x": 104,
                 "y": 37
                },
                {
                 "x": 104,
                 "y": 90
                },
                {
                 "x": 69,
                 "y": 90
                }
               ]
              },
              "text": "e"
             },
             {
              "property": {
               "detectedLanguages": [
                {
                 "languageCode": "en"
                }
               ]
              },
              "boundingBox": {
               "vertices": [
                {
                 "x": 104,
                 "y": 36
                },
                {
                 "x": 137,
                 "y": 36
                },
                {
                 "x": 137,
                 "y": 89
                },
                {
                 "x": 104,
                 "y": 89
                }
               ]
              },
              "text": "s"
             },
             {
              "property": {
               "detectedLanguages": [
                {
                 "languageCode": "en"
                }
               ],
               "detectedBreak": {
                "type": "EOL_SURE_SPACE"
               }
              },
              "boundingBox": {
               "vertices": [
                {
                 "x": 138,
                 "y": 36
                },
                {
                 "x": 162,
                 "y": 36
                },
                {
                 "x": 162,
                 "y": 89
                },
                {
                 "x": 138,
                 "y": 89
                }
               ]
              },
              "text": "t"
             }
            ]
           }
          ]
         }
        ],
        "blockType": "TEXT"
       }
      ]
     }
    ],
    "text": "test\n"
   }
  }
 ]
}
 

その他のパラメータ(detectedLanguagesとかboundingPolyとか)の詳細については
Method: images.annotate  |  Google Cloud Vision API  |  Google Cloud Platform
のフィールドを参照してください。