Ruby と Google Cloud Platform の Cloud Vision API で画像を解析して貰う
Vision API is 何?
画像のさまざまな情報を解析してくれる API です。
物体検知、有害コンテンツ検知、ロゴ検知、ランドマーク検知、OCR、顔検知、色検知等を行ってくれる。
料金は下記に詳細が書いてありますが 1000 ユニット / 月 は無料で利用出来るので、
どんなものか遊んでみたいとか Google すげぇって思ったりするのは問題ないかと思います。
cloud.google.com
実際に使って見る
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 に投げてみました。

{
"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