Gunosyデータ分析ブログ

Gunosyで働くデータエンジニアが知見を共有するブログです。

サムネイル画像に対するテキスト認識の性能比較について (Pytesseract / Google Cloud Vision API / Amazon Rekognition)

こんにちは。データ分析部アルバイトの北田 (@shunk031) です。好きな食べ物は畳み込みニューラルネットワークです。

はじめに

Gunosyでは広告を出稿する際に使用するサムネイル画像や広告画像において、テキストが占める割合の多い画像を把握したいといったニーズがあります。 Facebookの広告ポリシー*1では、広告内のテキストが過剰であるときに配信数が減ってしまったり、まったく配信されなくなる場合があるようです。

通常、画像から文字を読み取るOCR技術を利用することで前述のニーズを満たすことができそうです。 OCRを利用するにはPythonから使えるpytesseractや、Google Cloud Vision APIAmazon RekognitionといったクラウドベースのAPIを用いる方法があります。

これらpytesseract、Google Cloud Vision API、Amazon Rekognitionについて、サムネイル画像のテキスト領域をどれだけ正確に認識できるかを調査しました。今回はテキスト領域の認識にフォーカスするため、認識された文字が正確かどうかについては省いています。

代表的なOCRアプリケーション

代表的なOCRアプリケーションの概要を示します。OCRの精度については後述の広告文字認識における私自身の主観的評価に従っています。

アプリケーション名 日本語 文字対応 対応タスク数 OCRの精度 使用料金
pytesseract 1 (OCRのみ) 無料 (OSS)
Cloud Vision API 8タスク 最初の1000枚/月は無料
Rekognition × 7タスク 1000枚/月あたり$1.00

ここからOCR技術を手軽に使うことができるpytesseract、Google Cloud Vision API、Amazon Rekognitionについて詳しく見ていきたいと思います。

pytesseract

pytesseractはGoogle Tesseract-OCRをPythonから使えるようにしたラッパーです。 tesseract-ocrはデフォルトでtiffとbmpのみサポートしている一方で、pytesseractではPythonの画像ライブラリを通してjpeg、png、gifなど様々な形式をサポートしています。

使ってみる

MacOSではtesseract、Ubuntuではtesseract-ocrと日本語用パッケージをインストールした後、pytesseractをインストールします。

$ brew install tesseract  # MacOSをお使いの方
$ sudo apt-get install tesseract-ocr tesseract-ocr-jpn # Ubuntuをお使いの方
$ pip install pytesseract
import pytesseract
from PIL import Image

img = Image.open('test.png')
print(pytesseract.image_to_string(img), lang='eng+jpn')

pypi.python.org

Google Cloud Vision API

Google Cloud Vision APIはGoogle Cloud Platform (GCP) のサービスの一つで、以下の機能をREST APIを用いて簡単に使用することが出来ます。GoogleのリソースでトレーニングされたDeep Learningモデルを手軽に使えるのは魅力的ですね。

対応タスク

Feature type 説明
LABEL_DETECTION カテゴリ検出
TEXT_DETECTION 文字認識
DOCUMENT_TEXT_DETECTION より高度な文字認識
FACE_DETECTION 顔検出
LANDMARK_DETECTION 観光名所などの名称予測
LOGO_DETECTION ロゴ検出
SAFE_SEARCH_DETECTION セーフサーチ
IMAGE_PROPERTIES 画像の色検出

使ってみる

デモページDrag image file here or Browse from your computer から画像を読み込ませてあげることでCloud Vision APIを体験することが出来ます。

f:id:shunk031:20180330104558p:plain

cloud.google.com

料金

気になるお値段ですが、最初の1000枚/月は無料となっています。個人で試す分には十分ですね。

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

Amazon Rekognition

Amazon RekognitionはAmazon Web Service (AWS) のサービスの一つで、Google Cloud Vision APIと同様に、以下の機能をREST APIから簡単に使用できますAWS LambdaやS3などと連携することで、自動的にスケールする画像分析環境を構築することが可能です。

対応タスク

  • 対象物体・シーン・アクティビティ検出
  • 顔認識
  • 顔分析・感情分析
  • 人物の追跡
  • 安全でないコンテンツの検出
  • 有名人の認識
  • 画像中のテキスト認識

Rekognitionのテキスト認識については2018年2月現在、日本語には対応していません*2

A word is one or more ISO basic latin script characters that are not separated by spaces. DetectText can detect up to 50 words in an image.

しかしながら後述では日本語の部分もしっかり認識しています。さすがDeep Learningモデルを使っているだけあります。

使ってみる

デモページデモを試す からRekognitionを体験することが出来ます。

f:id:shunk031:20180330105411p:plain

f:id:shunk031:20180330105904p:plain

料金

気になるお値段ですが、1ヶ月あたり処理枚数100万枚以内で1000枚あたり1.00 USDとなっています。 こちらも個人で試す分には十分です。

aws.amazon.com

広告画像を用いた評価

ここからは実際に「グノシー」「ニュースパス」「LUCRA」の広告画像を用いて、上記で紹介した3つのOCR手法を、それぞれ以下の観点を中心に評価していきます。

  • 認識したテキスト領域の正確さ
  • 画像内を占めるテキスト割合の正確さ

pytesseract

pytesseractを用いて広告画像内のテキストを認識させてみます。今回は以下のコードを用いてバウンディングボックスと、画像に対するテキスト領域の割合を表示させました。

import cv2
import pytesseract

img = cv2.imread("gunosy_ad.jpg")
h, w, _ = img.shape

boxes = pytesseract.image_to_boxes(img, lang="eng+jpn")
boxes = [list(map(int, i)) for i in [b.split(" ")[1:-1] for b in boxes.split("\n")]]

for b in boxes:
    img = cv2.rectangle(img, (int(b[0]), h - int(b[1])), (int(b[2]), h - int(b[3])), (0, 255, 0), 2)

def calc_area(box):
    return ((box[2] - box[0]) * (box[3] - box[1]))

print(sum([calc_area(box) for box in boxes]) / (h * w))

グノシーの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330125631p:plain

ニュースパスの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330125745p:plain

LUCRAの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330130010p:plain

pytesseractを用いた場合、概ねテキストを認識できています。しかしながら全体的に細かい文字を認識できていなかったり、文字の背景にオブジェクトがある場合は認識できていません。 加えてスマホをテキストと認識してしまっています。したがってテキスト割合が予想よりも大きくなってしまっています。

Google Cloud Vision API

次にGoogle Cloud Vision APIの Document を用いて広告画像内のテキストを認識させてみます。

グノシーの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330143352p:plain

ニュースパスの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330143532p:plain

LUCRAの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330143709p:plain

Cloud Vision APIを用いた場合、ほぼ完璧にテキスト領域を認識しているのがわかりました。さすがGoogle先生ですね。アプリ内に表示されている細かいテキストについても認識しています。強いていうならば「ニュースパス」のテキストが認識されていないところが残念でした…!

Amazon Rekognition

最後にAmazon Rekognitionの イメージ内のテキスト を用いて広告画像内のテキストを認識させてみます。

グノシーの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330144407p:plain

ニュースパスの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330144430p:plain

LUCRAの広告画像に対してOCRを施した結果です。 f:id:shunk031:20180330144447p:plain

Rekognitionを用いた場合についても、Cloud Vision APIと同等レベルで正確な認識をしていることがわかりました。ここで思い出してほしいのですが、先述したとおりRekognitionは日本語には対応しておりません。

しかしながらこの認識精度なので、バックグラウンドで動くDeep Learningモデルが抽象的な文字の概念を捉えているのかもしれません。個人的にとても興味深く感じました。

まとめ

複数のOCR手法を用いて広告画像のテキスト認識、およびテキスト割合の算出をし比較を行いました。古典的なOCR手法であるtesseractは安定した認識を示しましたが、Deep Learningモデルを利用したGoogle Cloud Vision APIやAWS Rekognitionは更に高精度でテキスト領域を認識することを確認しました。

私自身画像認識を研究していて日々画像認識に苦しめられていますが、特にCloud Vision APIやRekogtniionについては、APIを通して簡単に高精度な画像認識ができてしまい衝撃的でした。テキスト認識にかかわらず、さまざまなタスクにこれらのAPIは応用可能だと考えています。