Google Cloud Vison のロゴ判定はOCRっぽかった

みんな大好き、Google Cloud Vison。その中の機能に「ロゴ判定」がある。これは大変だ。テレビを見せているだけで、どんどん「企業の露出」が分かっちゃう。「バッグ」と「ヴィトンのバッグ」とは大違い。

ということで、ロゴ判定でどこまでできるかを試しましたよ！

## ソース
```rb
#cloud vision api を使ってロゴ判定

require 'base64'
require 'json'
require 'net/http'
require 'uri'
require 'open-uri'
require 'find'

#ディレクトリ名を入力
DIR=ARGV

VISION_API_URL = "https://vision.googleapis.com/v1/images:annotate"
API_KEY        = "********"  #発行したAPIキー
URL            = "#{VISION_API_URL}?key=#{API_KEY}"

begin
  #ディレクトリ内の画像を入力
  Dir.glob("image/*.jpg").each {|imgfile|
    input = Base64.encode64(File.open(imgfile,"rb").read)
    
    uri           = URI.parse(URL)
    https         = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
  
    req                 = Net::HTTP::Post.new(uri.request_uri)
    req["Content-Type"] = "application/json"
    param               = {
      "requests" =>
      [
        {
          "image" =>
          {
            "content" => input
          },
          "features" =>
          [
            {
              "type"       => "LOGO_DETECTION",
              "maxResults" => 10
            }
          ]
        }
      ]
    }
    req.body = param.to_json
    res      = https.request(req)
  
    case res
    when Net::HTTPSuccess
      logname="#{File.basename(imgfile).split('.').first}.txt"
      File.open("log/#{logname}.txt","w"){|f|
        f.puts res.body  
      }
    else
      res.error!
    end
  }
rescue => e
  puts "error : #{e.message}"
end
```

imageフォルダにある、jpeg画像を片っ端から、ロゴ判定にかけて、そのJSONをテキストファイルに吐いてる。

## 結論

結論からいうと、文字が入ってると、判定できる。マークだけだとダメっぽい。ロゴ判定ってそういうものなのか？ じゃぁ単なるOCRかというと、「CHANEL」は、"Coco Chanel" と判定してるから、ブランドとして認識はしている。日本の企業とかはしらないかと思ったら、「SSK」は、"SSK Baseball" って判定してる。そこは賢い。

写真とイラストの違いかと思いきや、アップルのリンゴマーク単体は認識されてないから、写真かどうかは影響しなさそう。

ここから先は、画像と判定結果のJSONがひたすら並びます。

## シャネル文字なし
![chanel_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/1d15cb5a-90ef-8c81-02b8-d3ad3569e735.jpeg)

```js
{
  "responses": [
    {}
  ]
}

```
## シャネル文字あり
![chanel_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/d5094577-0dfa-58de-fb41-c5e8ffca7a0a.jpeg)

```js
{
  "responses": [
    {
      "logoAnnotations": [
        {
          "mid": "/m/037g0",
          "description": "Coco Chanel",
          "score": 0.61861169,
          "boundingPoly": {
            "vertices": [
              {
                "x": 43,
                "y": 73
              },
              {
                "x": 820,
                "y": 73
              },
              {
                "x": 820,
                "y": 640
              },
              {
                "x": 43,
                "y": 640
              }
            ]
          }
        }
      ]
    }
  ]
}
```

## ミズノ文字なし
![mizuno_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/81700d3a-4fa5-f56e-1832-5f5cddfeff13.jpeg)

```js
{
  "responses": [
    {}
  ]
}
```

## ミズノ文字あり
![mizuno_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/75df3319-0ed5-7df1-beb2-6bd8137990b9.jpeg)

```js
{
  "responses": [
    {
      "logoAnnotations": [
        {
          "mid": "/m/060wbl",
          "description": "Mizuno",
          "score": 0.57299244,
          "boundingPoly": {
            "vertices": [
              {
                "x": 82,
                "y": 16
              },
              {
                "x": 335,
                "y": 16
              },
              {
                "x": 335,
                "y": 194
              },
              {
                "x": 82,
                "y": 194
              }
            ]
          }
        }
      ]
    }
  ]
}
```

## SSK文字なし
![ssk_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/9bb9bb5a-6836-21e4-2df3-1eaf945115be.jpeg)

```js
{
  "responses": [
    {}
  ]
}
```


## SSK文字あり
![ssk_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/dc29d2c4-b297-33b9-3a45-0a9cb55be731.jpeg)

```js
{
  "responses": [
    {
      "logoAnnotations": [
        {
          "description": "SSK Baseball",
          "score": 0.22743617,
          "boundingPoly": {
            "vertices": [
              {
                "x": 12,
                "y": 16
              },
              {
                "x": 201,
                "y": 16
              },
              {
                "x": 201,
                "y": 39
              },
              {
                "x": 12,
                "y": 39
              }
            ]
          }
        }
      ]
    }
  ]
}
```

## ヴィトン文字なし
![vuitton_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/f6026f4b-b2fa-da53-8b6b-cfe8a113e14f.jpeg)

```js
{
  "responses": [
    {}
  ]
}
```

## ヴィトン文字あり
![vuitton_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/01c6a24d-c3eb-1b20-b25f-fa7bf4a0f8ff.jpeg)

```js
{
  "responses": [
    {
      "logoAnnotations": [
        {
          "mid": "/m/03h90x",
          "description": "Louis Vuitton",
          "score": 0.42544109,
          "boundingPoly": {
            "vertices": [
              {
                "x": 13,
                "y": 54
              },
              {
                "x": 174,
                "y": 54
              },
              {
                "x": 174,
                "y": 293
              },
              {
                "x": 13,
                "y": 293
              }
            ]
          }
        }
      ]
    }
  ]
}
```

## インターネット企業ロゴいっぱい
![comp_logo_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/6bbb7739-ee26-9602-c8d1-a01c82f0523d.jpeg)

```js
{
  "responses": [
    {
      "logoAnnotations": [
        {
          "description": "IREP",
          "score": 0.40736783,
          "boundingPoly": {
            "vertices": [
              {
                "x": 200,
                "y": 722
              },
              {
                "x": 392,
                "y": 722
              },
              {
                "x": 392,
                "y": 742
              },
              {
                "x": 200,
                "y": 742
              }
            ]
          }
        },
        {
          "mid": "/m/0cm98dx",
          "description": "Dena",
          "score": 0.36809859,
          "boundingPoly": {
            "vertices": [
              {
                "x": 147,
                "y": 114
              },
              {
                "x": 240,
                "y": 114
              },
              {
                "x": 240,
                "y": 142
              },
              {
                "x": 147,
                "y": 142
              }
            ]
          }
        },
        {
          "mid": "/m/0b10_w",
          "description": "Mixi",
          "score": 0.361237,
          "boundingPoly": {
            "vertices": [
              {
                "x": 160,
                "y": 536
              },
              {
                "x": 270,
                "y": 536
              },
              {
                "x": 270,
                "y": 562
              },
              {
                "x": 160,
                "y": 562
              }
            ]
          }
        },
        {
          "description": "iStyle",
          "score": 0.29449216,
          "boundingPoly": {
            "vertices": [
              {
                "x": 31,
                "y": 670
              },
              {
                "x": 88,
                "y": 670
              },
              {
                "x": 88,
                "y": 685
              },
              {
                "x": 31,
                "y": 685
              }
            ]
          }
        },
        {
          "mid": "/m/04c9bn",
          "description": "楽天",
          "score": 0.27938938,
          "boundingPoly": {
            "vertices": [
              {
                "x": 133,
                "y": 357
              },
              {
                "x": 217,
                "y": 357
              },
              {
                "x": 217,
                "y": 382
              },
              {
                "x": 133,
                "y": 382
              }
            ]
          }
        },
        {
          "mid": "/m/0bh762n",
          "description": "アメブロ",
          "score": 0.21190925,
          "boundingPoly": {
            "vertices": [
              {
                "x": 128,
                "y": 25
              },
              {
                "x": 174,
                "y": 25
              },
              {
                "x": 174,
                "y": 73
              },
              {
                "x": 128,
                "y": 73
              }
            ]
          }
        }
      ]
    }
  ]
}
```

## 消費者向けブランドいっぱい
![comp_logo_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/53489/569a4637-1ed0-8536-68df-cfa7662aa556.jpeg)

```js
{
  "responses": [
    {
      "logoAnnotations": [
        {
          "mid": "/m/05g_lz",
          "description": "Meiji",
          "score": 0.41433442,
          "boundingPoly": {
            "vertices": [
              {
                "x": 208,
                "y": 565
              },
              {
                "x": 294,
                "y": 565
              },
              {
                "x": 294,
                "y": 593
              },
              {
                "x": 208,
                "y": 593
              }
            ]
          }
        },
        {
          "mid": "/m/05t__z",
          "description": "Asahi",
          "score": 0.38916281,
          "boundingPoly": {
            "vertices": [
              {
                "x": 213,
                "y": 50
              },
              {
                "x": 292,
                "y": 50
              },
              {
                "x": 292,
                "y": 75
              },
              {
                "x": 213,
                "y": 75
              }
            ]
          }
        },
        {
          "mid": "/m/03595y",
          "description": "JAXA",
          "score": 0.38760966,
          "boundingPoly": {
            "vertices": [
              {
                "x": 353,
                "y": 342
              },
              {
                "x": 425,
                "y": 342
              },
              {
                "x": 425,
                "y": 376
              },
              {
                "x": 353,
                "y": 376
              }
            ]
          }
        },
        {
          "mid": "/m/04vmpm",
          "description": "Loft",
          "score": 0.30656153,
          "boundingPoly": {
            "vertices": [
              {
                "x": 96,
                "y": 116
              },
              {
                "x": 142,
                "y": 116
              },
              {
                "x": 142,
                "y": 146
              },
              {
                "x": 96,
                "y": 146
              }
            ]
          }
        },
        {
          "mid": "/m/03tb1",
          "description": "IKEA",
          "score": 0.29957649,
          "boundingPoly": {
            "vertices": [
              {
                "x": 208,
                "y": 493
              },
              {
                "x": 292,
                "y": 493
              },
              {
                "x": 292,
                "y": 517
              },
              {
                "x": 208,
                "y": 517
              }
            ]
          }
        },
        {
          "mid": "/m/0fqsd",
          "description": "Olympus",
          "score": 0.29347152,
          "boundingPoly": {
            "vertices": [
              {
                "x": 483,
                "y": 346
              },
              {
                "x": 564,
                "y": 346
              },
              {
                "x": 564,
                "y": 362
              },
              {
                "x": 483,
                "y": 362
              }
            ]
          }
        }
      ]
    }
  ]
}
```