まっしろけっけ

めもてきなやーつ

Ruby と Google Cloud Platform の Cloud Vision API で画像を解析して貰う

Vision API is 何?

画像のさまざまな情報を解析してくれる API です。

物体検知、有害コンテンツ検知、ロゴ検知、ランドマーク検知、OCR、顔検知、色検知等を行ってくれる。

料金は下記に詳細が書いてありますが 1000 ユニット / 月 は無料で利用出来るので、
どんなものか遊んでみたいとか Google すげぇって思ったりするのは問題ないかと思います。
cloud.google.com

実際に使って見る

事前準備

事前準備としては Google Cloud Platform のアカウントを作成して、
API KEY を取得しておく必要があります。(クレジットカードの登録が必要)

google-api-client を使う

Google の様々な API の client がまとまっている gem の google-api-client を使って Vision API に画像を投げてみます。
物体検知と色検知を指定しています。

$ gem install google-api-client
require 'google/apis/vision_v1'
Vision = Google::Apis::VisionV1
vision = Vision::VisionService.new
vision.key = "API KEY"

request = Google::Apis::VisionV1::BatchAnnotateImagesRequest.new(
  requests: [
    {
      image:{
        content: File.read("1.png")
      },
      features: [
        {
          type: "LABEL_DETECTION",
          maxResults: 10
        },
        {
          type: "IMAGE_PROPERTIES",
          maxResults: 10
        }
      ]
    }
  ]
)

vision.annotate_image(request)

gcp-vision を使う

google-api-client は require した際に一瞬固まる(load に時間がかかる)のが気になったので Vision API 専用の軽量な client を自作してみた。

$ gem install gcp-vision
require 'gcp/vision'

Gcp::Vision.configure do |config|
  config.api_key = "API KEY"
end

request = {
  requests: [
    {
      image:{
        content: Base64.encode64(File.read("1.png"))
      },
      features: [
        {
          type: "LABEL_DETECTION",
          maxResults: 10
        },
        {
          type: "IMAGE_PROPERTIES",
          maxResults: 10
        }
      ]
    }
  ]
}

Gcp::Vision.annotate_image(request)

レスポンスとしてどんな情報が返ってくるか?

実際にどんな情報が Vision API から返って来るのか?
ということで自分が普段 SNS 等のアイコンに使用している下記の愛犬の画像を Vision API に投げてみました。
f:id:shiro-16:20160508183558j:plain:w100

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/068hy",
          "description": "pet",
          "score": 0.98951507
        },
        {
          "mid": "/m/0bt9lr",
          "description": "dog",
          "score": 0.98687589
        },
        {
          "mid": "/m/04rky",
          "description": "mammal",
          "score": 0.9618566
        },
        {
          "mid": "/m/0jbk",
          "description": "animal",
          "score": 0.95587397
        },
        {
          "mid": "/m/02cyl6",
          "description": "maltese",
          "score": 0.89896905
        },
        {
          "mid": "/m/09686",
          "description": "vertebrate",
          "score": 0.89741188
        },
        {
          "mid": "/m/01lrl",
          "description": "carnivoran",
          "score": 0.85160905
        },
        {
          "mid": "/m/0kpmf",
          "description": "dog breed",
          "score": 0.77777779
        },
        {
          "mid": "/m/036hyn",
          "description": "toy dog",
          "score": 0.7
        },
        {
          "mid": "/m/0b26w3",
          "description": "schnoodle",
          "score": 0.68533921
        }
      ],
      "imagePropertiesAnnotation": {
        "dominantColors": {
          "colors": [
            {
              "color": {
                "red": 197,
                "green": 199,
                "blue": 195
              },
              "score": 0.53806108,
              "pixelFraction": 0.33916494
            },
            {
              "color": {
                "red": 86,
                "green": 84,
                "blue": 82
              },
              "score": 0.030347142,
              "pixelFraction": 0.046761185
            },
            {
              "color": {
                "red": 220,
                "green": 230,
                "blue": 229
              },
              "score": 0.31318155,
              "pixelFraction": 0.19654006
            },
            {
              "color": {
                "red": 165,
                "green": 162,
                "blue": 158
              },
              "score": 0.047778718,
              "pixelFraction": 0.19640999
            },
            {
              "color": {
                "red": 53,
                "green": 55,
                "blue": 55
              },
              "score": 0.021588614,
              "pixelFraction": 0.016324142
            },
            {
              "color": {
                "red": 123,
                "green": 116,
                "blue": 115
              },
              "score": 0.017005477,
              "pixelFraction": 0.10022113
            },
            {
              "color": {
                "red": 63,
                "green": 92,
                "blue": 77
              },
              "score": 0.009515699,
              "pixelFraction": 0.012291883
            },
            {
              "color": {
                "red": 25,
                "green": 28,
                "blue": 29
              },
              "score": 0.0089049507,
              "pixelFraction": 0.0029916754
            },
            {
              "color": {
                "red": 35,
                "green": 56,
                "blue": 49
              },
              "score": 0.0033917534,
              "pixelFraction": 0.0018210198
            },
            {
              "color": {
                "red": 89,
                "green": 121,
                "blue": 105
              },
              "score": 0.0033548647,
              "pixelFraction": 0.017364724
            }
          ]
        }
      }
    }
  ]
}

物体検知の結果は pet, dog, mammal, animal, maltese... 等が返ってきた。
dog だけではなく maltese といった感じで正確な犬種まで返って来るのには驚くばかりだ。

次に色検知だが RGB だとわかりづらいので下記のようにしてみた。
⬛︎⬛︎⬛︎⬛︎⬛︎
全体的に白いのでまぁこんな感じかぁ

最後に

その他の検知方法を使用したい場合などは下記のマニュアルに載っているので興味があれば調べてみるのが良いかと。
cloud.google.com