17
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SENSYAdvent Calendar 2018

Day 17

Cloud Vision APIを使ってみた

Last updated at Posted at 2018-12-16

はじめに

隣の席の先輩が先日、Cloud Auto ML Visionを用いてカレイの識別を試みました。
→ Cloud AutoML Visionを使ってカレイの種類を識別してみた
この記事で思ったよりも簡単に画像識別が出来るのを見て、それならばと、とりあえず入門編としてまずはCloud Vision APIを触ってみようと今回チャレンジしました。

Cloud Vision APIとは

Cloud Vision APIとは、Googleが用意した学習モデルを利用して、画像から様々な情報を抽出することができるサービスです。
下記の様に様々な機能があります。

機能のタイプ 説明
ラベル検出 乗り物や動物など、画像に写っているさまざまなカテゴリの物体を検出
テキスト検出 画像内のテキストに対して光学式文字認識(OCR)を実行し、テキストを検出
ドキュメントテキスト検出 ドキュメントなどの高密度テキスト画像に対してOCRを実行し、ドキュメントテキストを検出
セーフサーチプロパティの検出 アダルト コンテンツや暴力的コンテンツなど、画像に含まれる不適切なコンテンツを検出
顔検出 画像に含まれる複数の人物の顔を検出(ただし、個人を特定する顔認識には対応していません。)
ランドマーク検出 画像内の地理的ランドマークを検出
ロゴ検出 画像内の企業ロゴを検出
画像プロパティの検出 画像の一連のプロパティ(画像のドミナント カラーなど)を検出
ウェブ検出 画像内のニュース、イベント、有名人などの時事的なエンティティを検出し、Google画像検索の機能を使用してウェブ上で同様の画像を検索
クロップヒントの検出 画像上のクロップ領域の推奨頂点を調べる
複数のオブジェクトの検出[ベータ版] 画像に含まれている複数のオブジェクトを検出し、抽出

今回はこの中から、「ラベル検出」「テキスト検出」「ランドマーク検出」を試してみたいと思います。

事前準備

Cloud Vision APIはGCPのサービスなので、事前に下記手順が必要です。

  • GCPのプロジェクト作成
  • プロジェクトに対して課金を有効にする
  • Cloud Vision API を有効にする
  • サービスアカウントの作成・使用

こちらの詳細は公式を参照ください。
Vision API を有効にする
Cloud Vision API に対する認証

ラベル検出

まずはラベル検出。下記のコードで、画像から乗り物や動物などさまざまなラベルを検出できます。

label_detection.py
import io
from google.cloud import vision

client = vision.ImageAnnotatorClient()
with io.open('path/to/image', 'rb') as image_file:
    content = image_file.read()
image = vision.types.Image(content=content)

response = client.label_detection(image=image)
labels = response.label_annotations

for label in labels:
    print(label.description)
画像 検出されたラベル
label01.jpg cat, whiskers, skin, small to medium sized cats, nose, eye, cat like mammal, fauna, close up, snou
label02.jpg cup, coffee cup, coffee, serveware, tableware, cup, espresso, caffeine, ristretto, sauce
label03.jpg jeans, shoe, trousers, vehicle, bag, asphalt, product

信頼度が高い順にラベルが並べられますが、モチーフがはっきりとした画像なら精度はかなり良さそうです。

テキスト検出

次にテキスト検出。画像から文字列全体、個々の単語、それらの境界ボックスを検出できます。
ちなみにコードの上半分は先程のラベル検出と一緒です。

text_detection.py
import io
from google.cloud import vision

client = vision.ImageAnnotatorClient()
with io.open('path/to/image', 'rb') as image_file:
    content = image_file.read()
image = vision.types.Image(content=content)

response = client.text_detection(image=image)
texts = response.text_annotations

for text in texts:
    print('\n"{}"'.format(text.description))
    vertices = (['({},{})'.format(vertex.x, vertex.y)
                 for vertex in text.bounding_poly.vertices])
    print('bounds: {}'.format(','.join(vertices)))
画像 検出されたフレーズ / その境界ボックス
(および個々の単語とその境界ボックス)
text_detection01.jpg "check!!
"
bounds: (38,17),(193,17),(193,133),(38,133)

"check!!"
bounds: (38,102),(174,17),(193,49),(58,133)
text_detection02.jpg "No!
"
bounds: (194,51),(283,51),(283,99),(194,99)

"No!"
bounds: (196,51),(283,55),(281,99),(194,95)
text_detection03.jpg "Thank You
"
bounds: (77,100),(266,100),(266,138),(77,138)

"Thank"
bounds: (78,100),(185,102),(184,137),(77,135)

"You"
bounds: (200,105),(266,106),(265,138),(199,137)

こちらも斜め向いた文字や、手書き文字を含んでいるのに見事に文字を検出できました。

ランドマーク検出

最後にランドマーク検出。画像からランドマークの名前と場所を検出できます。
こちらもコードの上半分はラベル検出・テキスト検出と一緒です。

landmark_detection.py
import io
from google.cloud import vision

client = vision.ImageAnnotatorClient()
with io.open('path/to/image', 'rb') as image_file:
    content = image_file.read()
image = vision.types.Image(content=content)

response = client.landmark_detection(image=image)
landmarks = response.landmark_annotations

for landmark in landmarks:
    print(landmark.description)
    for location in landmark.locations:
        lat_lng = location.lat_lng
        print('Latitude {}'.format(lat_lng.latitude))
        print('Longitude {}'.format(lat_lng.longitude))
画像 ランドマークの名前と場所
landmark01.jpg Arc de Triomphe
Latitude 48.873667
Longitude 2.295134
landmark02.jpg Sagrada Familia ("Expiatory Temple of the Holy Family")
Latitude 41.403579
Longitude 2.174242
landmark03.jpg

1つ目の「凱旋門」、2つ目の「サグラダ・ファミリア」はバッチリ検出できました。

3つ目は判別できなかったのか、レスポンスが空でした。
ドバイにある世界一高いビル「ブルジュ・ハリファ」でしたが、写真がわかりづらかったのかもですね...

感想

コード自体はほぼサンプルの流用でしたが、当初思ってた以上にお手軽に試せました。
Googleが事前に学習したモデルを使えるというのも、本当にありがたいです。

他にも面白そうな機能が有ったので、また別の機会に試してみたいと思います!

参考

17
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?