ML Study Jams 機械学習 中級者向けコース 「Detect Labels, Faces, and Landmarks in Images with the Cloud Vision API」 をざっくり日本語に翻訳(意訳)して説明してみる。

noteで書く

経緯

みなさまこんにちは。メルマガを引退したと見せかけて、一時戻ってきました。

先日ML Study JamsにてQwiklabsのクーポンを頂き、初心者・中級者向けコースを無事修了しました。
中級者向けコースは大半が英語のため、やる前から心が折れかけていたのですが、やってみると思っていた以上に内容がシンプルでした。
そこで簡単な説明があれば、「英語だからいいや」と考えていた方をサポートできるのではと考え、ここにざっくりとした説明を残したいと思います。

ターゲット

初心者向けコースのラボを1つ修了済みの方

注意点

・タイトルはラボのドキュメントにならって英語のままにしています。
・Qwicklabsの設定については省略しています。初心者向けの設定と同じですので、そちらをご参照ください。
・Qwicklabsでは初期状態でCloud Vision APIが有効になっているはずです。自学で自費でラボを進める場合は、予めプロジェクトでCloud Vision APIが使えるように有効化しておく必要があります。

Overview

Cloud Vison APIとラボの説明。パワフルな画像認識モデルをREST API経由で利用できます。
このラボでは、実際に画像を送信して、顔やランドマークなどの要素を検出します。

Setup and Requirements

セットアップについては初心者向けコースと同じですので、そのまま進めて下さい。
途中Google Cloud Shellを起動(Activate Google Cloud Shell)しますが、右上のシェルボタンをクリックするだけです。

その他はコマンドのサンプルですので、入力する必要はありません。
*初めて起動した場合は、ダイアログボックスが開きますので、右下の「START CLOUD SHELL」をクリックしてください。

Create an API Key

curlコマンドにてVision APIにリクエストを送信します。そのためには、API Keyが必要なので、API Keyを作成します。

API Keyをコピーして、

環境変数に保存しておきます。

# Cloud Shell
export API_KEY=<コピーしたAPI KEY>

Upload an Image to a Cloud Storage bucket

Creating a Cloud Storage bucket

Cloud Storage bucket(以下 バケット)を作ります。Vision APIに画像を送る方法は2つあって、一つがbase64エンコードした画像テキストを送ることで、もう一つがCloud StorageのファイルURLを送ることです。
このラボではCloud Storageを利用します。

ナビゲーションメニューから「ストレージ」をクリックし、「バケットを作成」をクリックしてください。

バケットの「名前」は適当につけてください。(小文字の英数字で一意となる名前)

名前をつけたら、あとは初期値のままにして、ページ下にある「作成」ボタンをクリックして、バケットを作成します。

Upload an image to your bucket

ラボにあるドーナッツの画像を右クリックからローカルに保存してください。
*適当に自分が持っている画像でも良いと思います。
*ファイル名と拡張子が「donuts.png」になっていますが、.jpgのままでも大丈夫です。

以下はURLを参照して表示しています。

ドーナッツの画像

先程つくったバケットにて「ファイルをアップロード」からローカルPCに保存したドーナッツの画像をアップロードして下さい。

ファイルのアップロードが完了したら、ファイルレコードの右側にあるドットメニューから「権限を編集」をクリックし、ファイルのパーミッションを編集します。

ダイアログが開いたら、「+項目を追加」ボタンをクリックして、以下の内容で新しい権限を追加します。

  • エンティティ: グループ
  • 名前: allUsers
  • アクセス権: 読み通り

権限の追加が完了したら、保存をおしてください。これでVision APIにリクエストを送る準備ができました。

Create your Vision API request

Vision APIにリクエストするための設定ファイル request.json を作ります。
Cloud Shellは初期で5GBまでファイルを保存することができますので、ホームにそのまま作ります。
エディタはnano、vim、emacsを利用することができます。
以下はvimでの説明です。

# Cloud Shell
vim request.json

以下のjsonで gcsImageUriの値を、自分のバケットとアップロードしたファイル名に適宜変更します。my-bucket-nameがバケット名で、donuts.pngがアップロードしたファイル名です。

#request.json
{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          }
        },
        "features": [
          {
            "type": "LABEL_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

保存してvimを終了します。

Label Detection

はじめにLabel Detection(以下 ラベル検出)を試してみましょう。
ラベル検出は画像にどういった要素が入っているかリストで返してくれます。

Cloud Shellにて以下のコマンドをコピーし実行してください。

# Cloud Shell
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

*${API_KEY}の部分は環境変数が入りますので、差し替えなくても大丈夫です。コピーしたままを貼り付けて実行してください。

以下のようなレスポンスが確認できると思います。

# Label Detection のレスポンス
{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01dk8s",
          "description": "Powdered sugar",
          "score": 0.9861496,
          "topicality": 0.9861496
        },
        {
          "mid": "/m/01wydv",
          "description": "Beignet",
        },

        ...以下略
    }
}

midはGoogle Knowlage Graph APIで利用するアイテムにマップされてキーみたいなものです。
descriptionはアイテムの名前です。
scoreは0~100までの評価値です。

Web Detection

次にWEB Detection(以下 ウェブ検出)を試してみましょう。
ウェブ検出では、類似画像の検出、似た画像が埋め込まれたサイトのURLなどを検出することが可能です。まさしくGoogle画像検索のようです。

Cloud Shellにてrequest.jsonを以下のように編集します。

# request.json
{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          }
        },
        "features": [
          {
            "type": "WEB_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

gcsImageUriはラベル検出にならって、適宜変更してください。ウェブ検出を利用するには、featuresのtypeパラメータを WEB_DETECTION に変更します。

修正が完了したら以下のコマンドをコピーして実行します。

# Cloud Shell
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

すると以下のレスポンスが確認できると思います。

#Web Detection のレスポンス
{
"responses": [
    {
      "webDetection": {
        "webEntities": [
          {
            "entityId": "/m/0105pbj4",
            "score": 0.436,
            "description": "Google Cloud Platform"
          },
          ...省略
        ],
        "fullMatchingImages": [
            {
              "url": "https://codelabs.developers.google.com/codelabs/cloud-vision-intro-ja/img/b05d9534e547f5ee.png"
            },
            ...省略
        ],
        "pagesWithMatchingImages": [
          {
            "url": "https://kiosk-dot-codelabs-site.appspot.com/codelabs/cloud-vision-intro/index.html?index=..%2F..cloudai",
            "pageTitle": "Detect Labels, Faces, and Landmarks in Images with the Cloud ...",
            "fullMatchingImages": [
              {
                "url": "https://kiosk-dot-codelabs-site.appspot.com/codelabs/cloud-vision-intro/img/b05d9534e547f5ee.png"
              }
            ]
          },
          ...省略
        ],
        "visuallySimilarImages": [
          {
            "url": "https://fastly.4sqi.net/img/general/600x600/P9i-l_oqwH-_EFNwqc7hRXxxOsYotUEijdgrJi8L9Ss.jpg"
          },
          ...省略
        ],
        "bestGuessLabels": [
          {
            "label": "powdered sugar"
          }
        ]
      }
}

レスポンスには、 webEntities、fullMatchingImages、pagesWithMatchingImages、 visuallySimilarImages、bestGuessLabelsがあります。 webEntitiesでは同様の画像がGCPの機械学習で使われている事がわかります。
レスポンスについてはWeb Detection Methodを参照ください。

Face and Landmark Detection

次に Face Detection(以下 顔検出)とLandmark Detection(以下 ランドマーク検出)を同時に試してみましょう
顔検出では、顔を検出し、顔パーツ(目や鼻など)の座標や感情を数値化して返してくれます。
ランドマーク検出では、ランドマークを検出し、緯度経度やその他の情報を返してくれます

Upload a new image

ラボにある画像を右クリックからローカルに保存してください。

selfie.png

こちらも.pngで保存していますが、.jpgでも大丈夫です。ここでは selfie.jpgとして進めます。
ドーナッツと同じバケットにselfie.jpgをアップロードしてください。

また権限も同じように編集します。

Updating request file

Cloud Shellにてresuest.jsonを以下のように修正します。
gcsImageUriは適宜編集します。バケットは同じですが、ファイル名がselfie.jpgに変わっています。
またfeaturesには2つの検出を使いますので、それぞれを追加しています。

# request.json
{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/selfie.png"
          }
        },
        "features": [
          {
            "type": "FACE_DETECTION"
          },
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

編集が完了したら保存します。

Calling the Vision API and parsing the response

以下のコマンドでVision APIにリクエストします。

# Face and Landomark Detection のレスポンス
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

レスポンスにはfaceAnnotationsとlandmarkAnnotationsが入っています。
*私はfaceAnnotationsのパーツにはz座標も検出されていることに驚きました。
ここでは、各ラベルの説明は省略いたします。詳細はVision API annotationをご確認ください。

Explore other Vision API methods

Cloud Vision APIでは他にも、企業のロゴを検出したり、テキスト検出したり、セーフサーチ検出を指せる事が可能です。

Congratulations!

以上で説明は終了です。45分の制限時間ですが、時間は充分に余ると思います。request.jsonを適宜書き換えて、いろいろ試してみると良いかもしれません。

最後に

株式会社アイ・クリエイトでは、Google Cloud Platform(AWS,Azure等も)を利用した機械学習の勉強会を開催するかもしれません!(限りなく予定)
学生でも、社会人でも、興味がありましたら一緒に勉強してみませんか?
まずは初級からコツコツやってみましょう!

さらに講師となっていただける方も絶賛募集中です!
会社のお問い合わせフォームから、以下のテンプレートをご利用いただきご連絡いただければうれしいです!

勉強会の中の人へ

連絡先メールアドレス: 

お名前:  
*ご返信時に利用させていただきます。ニックネーム等でも大丈夫です!

内容:  
機械学習について

スタンス:  
講師してあげる(or 一緒に勉強してあげる)


スキルや実績など:  
*講師をしていただける方は、簡単に経歴などご紹介いただけると嬉しいです!

勉強会についての質問事項があれば:

noteで書く

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です