Future Tech Blog
フューチャー技術ブログ

GCP連載#9 初めてのGCP 画像AI(Vision API)をさわってみた


はじめに

こんにちは。TIG DXチームの村瀬です。

今回はGCP連載企画の9日目です。私個人としてはGCPはほとんど利用したことがないので、せっかくだから面白そうなことを試してみようと思い、画像AIのサービスであるVision APIについて試してみることにしました。

Vision APIとは

Google Cloud の Vision API は REST API や RPC API を使用して強力な事前トレーニング済みの機械学習モデルを提供します。画像にラベルを割り当てることで、事前定義済みの数百万のカテゴリに画像を高速で分類できます。オブジェクトや顔を検出し、印刷テキストや手書き入力を読み取り、有用なメタデータを画像カタログに作成します。
https://cloud.google.com/vision

Google Cloudの公式ページによりますと事前トレーニング済みの機械学習モデルを利用してラベルの割り当てやOCRとしてすぐに利用できるようですね。

機能(検出のタイプ)としては以下のものがあります。

Feature Type Description
Face detection 顔の検出
Landmark detection ランドマークの検出
Logo detection ロゴの検出
Label detection ラベル検出
Text detection 光学式文字認識(OCR)
Document text detection (dense text / handwriting) PDF/TIFF ドキュメント テキスト検出
Image properties 画像プロパティの検出
Object localization 複数のオブジェクトを検出する
Crop hint detection クロップヒントの実行
Web entities and pages ウェブ エンティティおよびページの検出
Explicit content detection (Safe Search) セーフサーチ プロパティの検出

詳細は公式ページを参照ください。
https://cloud.google.com/vision/docs/features-list?hl=ja

料金

無料枠があり、最初の1,000ユニット/月は無料。それを越した場合でも1,000ユニットあたり$1.50。なんと太っ腹!

詳細は公式ページを参照ください。
https://cloud.google.com/vision/pricing?hl=ja

準備

プロジェクト作成

プロジェクト名を入力し作成ボタンをクリック

Cloud Vision APIの有効化

Cloud Vision APIの画面に移動して有効にするボタンをクリック
https://cloud.google.com/vision/docs/before-you-begin

APIキーを作成

APIとサービスの画面に移動して認証情報を作成からAPIキーを選択してクリック

これでAPIキーが作成されました。
後ほどこのAPIキーを利用します。

事前準備はこれで完了です。

APIをコールしてみる

バリエーション豊かな機能がありますが、今回はLabel detection(ラベル検出)とText detection(光学式文字認識(OCR))を試してみます。

Label detection(ラベル検出)

まずは、Label detection。Futureのキャリア採用ページにある、つよつよエンジニア渋川の画像を利用してどのようなラベルが検出がされるか見てみましょう。今回の検証では改めて説明する必要はないと思いますがお手軽万能HTTPアクセスツールcURLを利用します。

keyの項目に先ほど取得したAPIキーを設定します。

Request
1
curl -H 'Content-Type:application/json' -d '{"requests":[{"image":{"source":{"imageUri":"https://www.future.co.jp/recruit/common/img/member/er_popup_14_pc.jpg"}},"features":[{"type":"LABEL_DETECTION","maxResults":10,"model":"builtin/stable"}],"imageContext":{"languageHints":[]}}]}' https://vision.googleapis.com/v1/images:annotate?key=xxxxxxxxxxx

リクエストのJSONを整形するとこんな感じ

json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"requests": [
{
"image": {
"source": {
"imageUri": "https://www.future.co.jp/recruit/common/img/member/er_popup_14_pc.jpg"
}
},
"features": [
{
"type": "LABEL_DETECTION",
"maxResults": 10,
"model": "builtin/stable"
}
],
"imageContext": {
"languageHints": []
}
}
]
}

レスポンスは以下の通りJSON形式で返却されます。

Response
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{
"responses": [
{
"labelAnnotations": [
{
"mid": "/m/015c4z",
"description": "Sitting",
"score": 0.84581405,
"topicality": 0.84581405
},
{
"mid": "/m/0dzf4",
"description": "Arm",
"score": 0.82127464,
"topicality": 0.82127464
},
{
"mid": "/m/0c_jw",
"description": "Furniture",
"score": 0.7518786,
"topicality": 0.7518786
},
{
"mid": "/m/01kq3x",
"description": "White-collar worker",
"score": 0.74684197,
"topicality": 0.74684197
},
{
"mid": "/m/0dzd8",
"description": "Neck",
"score": 0.7371684,
"topicality": 0.7371684
},
{
"mid": "/m/019nj4",
"description": "Smile",
"score": 0.6944891,
"topicality": 0.6944891
},
{
"mid": "/m/0dnr7",
"description": "Textile",
"score": 0.6563325,
"topicality": 0.6563325
},
{
"mid": "/m/05wkw",
"description": "Photography",
"score": 0.62422496,
"topicality": 0.62422496
},
{
"mid": "/m/08xgn7",
"description": "Comfort",
"score": 0.55251026,
"topicality": 0.55251026
},
{
"mid": "/m/02crq1",
"description": "Couch",
"score": 0.5395869,
"topicality": 0.5395869
}
]
}
]
}

descriptionだけ抜き出して整理すると

description 日本語
Sitting 座っている
Arm
Furniture 家具
White-collar worker サラリーマン
Neck
Smile ほほえみ
Textile 織物
Photography 写真撮影
Comfort 快適さ
Couch ソファー

当たり前と言えば当たり前なのですが、画像から連想される説明が返却されてます。
サラリーマンが快適にソファーに座っていてほほえんでおり、首や腕、ソファーの繊維も映っていますね。

Text detection(光学式文字認識(OCR))

続いてText detection。渋川のスペックのレーダーチャートを解析してみましょう。

Request
1
curl -H 'Content-Type:application/json' -d '{"requests":[{"image":{"source":{"imageUri":"https://www.future.co.jp/recruit/common/img/member/chart_14_pc.png"}},"features":[{"type":"TEXT_DETECTION"}]}]}' https://vision.googleapis.com/v1/images:annotate?key=xxxxxxxxxxx
1
2
3
4
5
6
7
8
9
10
{
"responses": [
{
"textAnnotations": [
"~~ 中略 ~~"
],
"text": "コミュケーションカ\nメイタリティ\n画性\n5.\n3\n4\n5.\nインライン\nスケート\nメタ学習法\nオタク度\nLO\n"
}
]
}

解析したワードを整理すると

text
コミュケーションカ
メイタリティ
画性
5
3
4
5
インラインスケート
メタ学習法オタク度

一部の文字はレーダーチャートの線と重なって別の文字として認識されてしまったり、読み込めなかったりしていますが(目的にもよりますが)十分な精度かと思います。

画像AIってすごいですね。

さいごに

機械学習と聞くと利用できるようにするのにトレーニングが必要で、ある種の車輪の再発明に近い作業が必要になり、コストと時間が掛かるものと思っていたのですが、事前トレーニング済みの機械学習モデルが安価にお手軽に利用できてとても便利ですね。様々な検出のタイプがあり、(当たり前ではありますが)適切なタイプを選ぶ必要があるのでそこさえ間違えなければ多種多様なニーズに応えられる素晴らしいAPIかと思います。Vision APIのすばらしさを実感できる検証となりました。

今回は検証目的でプロジェクトを作成したのでプロジェクトを削除して完了です。

関連リンク