freeeの開発情報ポータルサイト

Google Cloud Vision API の 光学式文字認識(OCR)機能 試してみた

f:id:ryo_abe:20171210003609p:plain

こんにちは!freee で モバイルアプリ 開発を担当している RyoAbe です。

freee Developers Advent Calendar の10日目として、Google Cloud Vision API の導入 〜 OCR 機能の検証の結果についてまとめた記事になります。

Google Cloud Vision API とは?

Google Cloud Vision API とは GCP が提供するサービスの一つで、機械学習により画像から分析情報を抽出する以下のような機能を提供します。

  • 乗り物や動物など、画像に写っているさまざまなカテゴリの物体(「ヨット」や「ライオン」、「エッフェル塔」など)を検出
  • アダルト コンテンツから暴力的なコンテンツまで、さまざまなタイプの不適切なコンテンツを検出
  • 著名人やロゴ、ニュース イベントなどの時事的なエンティティを検出
  • 光学式文字認識(OCR)機能による画像内のテキストを検出

今回はこれらの機能のうちの OCR機能 について検証してみました。

API の説明

検出機能のタイプ
機能のタイプ 説明
LABEL_DETECTION 画像全体に対して画像コンテンツ分析を実行し、結果を返します。
TEXT_DETECTION 画像内のテキストに対して光学式文字認識(OCR)を実行します。
FACE_DETECTION 画像内の顔を検出します。
LANDMARK_DETECTION 画像内の地理的ランドマークを検出します。
LOGO_DETECTION 画像内の企業ロゴを検出します。
SAFE_SEARCH_DETECTION 画像の画像セーフサーチ プロパティを判別します。
IMAGE_PROPERTIES 画像の一連のプロパティ(画像のドミナント カラーなど)を計算します。

Vision API リクエストのタイプ |  Google Cloud Vision API ドキュメント より

(今回使用するのは TEXT_DETECTION

API 概要

Cloud Vision API は RSET API で、上記の検出したい機能のタイプ(feature。複数指定可能)と base64 でエンコードした画像を API キーまたは OAuth トークンと一緒に POST して使用します。

POST https://vision.googleapis.com/v1/images:annotate

API の詳細は こちら

初期設定〜APIキー発行

1. プロジェクトを作成

GCP の プロジェクトの一覧 からプロジェクトを作成。 f:id:ryo_abe:20171209174411p:plain f:id:ryo_abe:20171209174456p:plain

2. Cloud Vision API の有効化(課金情報の入力が必要)

検索窓 に Vision と入れて Cloud Vision API を有効にする。 f:id:ryo_abe:20171209175130p:plain f:id:ryo_abe:20171209175202p:plain ↑ 移行、手順に沿って課金情報を登録する。

3. API キー を発行

Cloud Vision API を利用するため API キーを発行します。 f:id:ryo_abe:20171209180348p:plain f:id:ryo_abe:20171209180542p:plain

ここで発行したAPIキーをサンプルプロジェクトに貼り付ける。

サンプルプロジェクト初期設定

README をもと 公式のiOSのサンプルプロジェクト の初期設定をします。

  • clone, pod install
$ git clone https://github.com/GoogleCloudPlatform/cloud-vision.git
$ cd cloud-vision/ios/Swift
$ pod install
  • API_KEY

1 で発行したAPI キーを YOUR_API_KEY 貼り付けて実行。 f:id:ryo_abe:20171209183250p:plain

  • 利用する機能タイプ(feature)の書き換え LABEL_DETECTION f:id:ryo_abe:20171209224420p:plain

検証

アプリを実行すると以下のように画面が表示され、 Choose an image to analyze より写真を選択して写真情報を抽出してみます。

f:id:ryo_abe:20171209185936j:plain

検証1 手書きの名前

コテはじめに自分の名前を手書きで。

  • 自分の名前1

f:id:ryo_abe:20171209221005j:plain

  • 結果
阿部訪

おしい。非常におしい。俺の字が汚いせいですよね。。もう一度書き直して

  • 自分の名前2

さっきより汚い気もするが。。

f:id:ryo_abe:20171209221150j:plain

  • 結果
阿部諒

おおお!成功した。やはり手書きはまだまだ難しいようだ

検証2 串カツ田中のクーポン

手元にあったので試しに。(ちなみに弊社近くの串カツ田中は、行くとfreee社員の誰かしらがいます)

f:id:ryo_abe:20171209223155j:plain

  • 結果
特別クーポン
お会計金額10%OFF
名物串かソはパー大阪伝統の味
6名様以上の団体様には
手㈹たこ焼きもプレゼント中!
ご予約
できます!
ご利用条件·他サービス券との併用不可
一部を除く店舗でご利用いただけます。スタッフにご確認ください。
お会計前にご提示ください。お会計終了後はご利用出来かねます
· 1組様1枚限り、お会計金額1000円以上からご利用いただけます
担当内田
有効期限Hdf年12月丰日

おおお、これはすごい。若干特殊な筆文字っぽいフォントだったので難しいのではと思ったが、ほぼほぼ認識できてる。 (ただ大事な店のお名前の「串かつ田中」が「串かソはパー」ってなってるw)

検証4 レシート1

f:id:ryo_abe:20171209232359p:plain

サンプル
領収書
2015年4月1日
毎度ご乗車ありがとうございます。
乗車料金
¥1430円
¥0円
迎車
計
1430円
freeeタクシー
全自動営業所
TEL: 06-6012-3456

完璧!完璧だ!!!

検証5 レシート2

f:id:ryo_abe:20171209223101j:plain

  • 結果
FamilyMart
新宿エルタワー店
東京都新宿区西新宿1丁目6-1
電話: 03-5909-4086
領収証
2017年12月8日
レジ2-4726
(金)
12:39
No. 028
¥103
¥233
¥233
¥503
有明の海苔
直巻炙り焼たらこ ¥130
小
計
計
(内消費税等
お預り
お
¥17)
釣
¥2-70
対象会員番号
獲得 ポイント(3日後加算)
明細)ショッピングP
現在利用可能ホ·イント
Tマネー残高
0000
9941
1P
1P
283P
Tカードが無効の場合、Tポイント
は貯まりません。詳細はtsite.jp
にてご確認下さい。
■現在のランク ブロンズ
■12\/31までにあと 3952円(12\/06
シルバー達成。ポイント2倍!
P対象外分は含まれません。
01\/04までポイント1倍!
時点)ご利用いただくと、01月度は
ご利用金額にタバコ·チケット等ショ叱.ング

これはちょっと意外。こちらもすんなりできるかなと思いきや、金額は読みやすさや強調のためかフォントが通常より横に潰れているためうまく読み取れてなかったり、最後の「ショッピング」が半角+半濁点ゆえかうまく読み取れてないですね。

料金

やっす。月1,000回までは無料で、それを超えても 500万回まで 1,000回あたり $3.5 。

f:id:ryo_abe:20171209233113p:plain

料金  |  Google Cloud Vision API ドキュメント より

まとめ

手書きが思いの外うまくいかなかったのは意外でしたね。。(上記のは2回目で成功してますが、5回くらい書き直しています...w)

ですが、デジタルに印刷されたものは細かな文字でも十分読み取れていましたし、ここまで手軽で、レスポンスも早くて(5秒程度)、料金も安いので、プロダクトでも使うことは十分できそうですね。(ユーザによる手直し多少必要かもしれませんが)

モバイルエンジニア募集中

モバイルチームではエンジニア絶賛募集中です。まずは気軽にオフィスに遊びに来てみて下さい!

01intern.com

www.wantedly.com


番外編

番外編として LABEL_DETECTION(画像全体に何が写っているのかラベルとスコアで結果を返す)を使ってみました。

使用する写真はこちら。(私の顔。我ながら気持ち悪い顔 🤢 。この顔と30年共に歩んできました。)

f:id:ryo_abe:20171123221456j:plain

実行してみると、 顎や鼻や、メガネや髭、若干笑顔であること などの情報がスコアと共に抽出することが出来ました。

"labelAnnotations" : [
  {
    "mid" : "\/m\/0j272k5",
    "score" : 0.93542570000000003,
    "description" : "eyewear"
  },
  {
    "mid" : "\/m\/0jyfg",
    "score" : 0.91612179999999999,
    "description" : "glasses"
  },
  {
    "mid" : "\/m\/027n3_",
    "score" : 0.89901613999999996,
    "description" : "eyebrow"
  },
  {
    "mid" : "\/m\/0k0pj",
    "score" : 0.89364164999999995,
    "description" : "nose"
  },
  {
    "mid" : "\/m\/0f9swq",
    "score" : 0.88021629999999995,
    "description" : "chin"
  },
  {
    "mid" : "\/m\/0bby24z",
    "score" : 0.87939860000000003,
    "description" : "moustache"
  },
  {
    "mid" : "\/m\/0h8jxfl",
    "score" : 0.87331460000000005,
    "description" : "vision care"
  },
  {
    "mid" : "\/m\/025kyy",
    "score" : 0.81071179999999998,
    "description" : "forehead"
  },
  {
    "mid" : "\/m\/019nj4",
    "score" : 0.75038470000000002,
    "description" : "smile"
  },
  {
    "mid" : "\/m\/01443y",
    "score" : 0.67853859999999999,
    "description" : "headgear"
  }
]

これは面白いことできそう。これ使って副業で一儲けしようかな😎 (そうです、 freee は副業オッケーなのです😎)

明日は、先月入社の笑顔が素敵、丸メガネがとてもお似合いの bananaumai さんです!お楽しみに!