tachiken's blog

開発、プログラミング、その他

Google Vision APIを使って名刺の内容をテキストファイル化

機械学習系のAPIを実装したことがなかったので、これを使って簡単なアプリケーションを 作ってみた。

チュートリアルとサンプル アプリケーション  |  Google Cloud Vision API  |  Google Cloud Platform

手順

まずはGoogle Cloud Platformに移動し、『Google Cloud Vision APIの有効化』を行う。 console.cloud.google.com f:id:tachiken0210:20171030112603p:plain そして『認証情報の作成』からAPIキーを作成し、 f:id:tachiken0210:20171030112645p:plain そこに表示された『自分のAPI キー』をメモする。(※これをアクセストークンとして使う。)

APIの有効化についての詳しい説明は他記事に色々記載がありますので、 そちらをご参考にしていただければとおもいます^^;

さて、テキスト抽出についてですが以下の記事を参考にさせていただきました。 qiita.com

というか、この記事でほとんど名刺のテキスト抽出はやられてますね。。。 ということで私の方ではこれを利用して、

①複数の名刺のテキスト抽出
②名刺ごとにテキストファイルを作成し、そこに名刺の内容を記載する
③テキストファイルのタイトルを会社名に書き換えるという

ということができるスクリプトを書きました。

ソースコード

以下ソースコードになります。

import base64
import requests
import glob
import os

#同一フォルダ内のpngファイル名を抽出
def detect_all_files(access_token=None):
    file_names = [os.path.basename(r) for r in glob.glob("./*.png")]
    texts = []
    for i, file in enumerate(file_names):
        text = detect_text(file,access_token)
        write_text(i,text)
        texts.append(text)
    return texts

#テキストファイルを作成し、ファイル名を株式会社にする
def write_text(i,text):
    text_list = text.split("\n")
    g = open('company_{}.txt'.format(i), 'w')
    for text in text_list:
        if "株"  in text:
            company_name = text
            os.rename('company_{}.txt'.format(i),str(company_name))
        g.write(text)
        g.write("\n")
    return text

#名刺の画像データからテキストを抽出する。
def detect_text(image_file, access_token=None):
    with open(image_file, 'rb') as image:
        base64_image = base64.b64encode(image.read()).decode()

    url = 'https://vision.googleapis.com/v1/images:annotate?key={}'.format(access_token)
    header = {'Content-Type': 'application/json'}
    body = {
        'requests': [{
            'image': {
                'content': base64_image,
            },
            'features': [{
                'type': 'TEXT_DETECTION',
                'maxResults': 5,
            }]
        }]
    }
    response = requests.post(url, headers=header, json=body).json()
    text = response['responses'][0]['textAnnotations'][0]['description'] if len(response['responses'][0]) > 0 else ''
    return text

実行は以下のようにdetect_allk_filesメソッドの引数にAPIキーを入れて実行します。

detect_all_files(access_token='APIキー(アクセストークン)を入力')

処理の流れ

詳細な流れとしては以下のことをしています。
ソースコードのファイルと同一のフォルダに名刺の画像ファイル(png)をおく
f:id:tachiken0210:20171030115614p:plain f:id:tachiken0210:20171030115620p:plain ・globを使ってフォルダ内のpngファイルを全て取得
・それらの画像ファイルからGoogle Vision APIを使ってテキストリストを取得
・テキストリストをsplitメソッドを使って要素に分ける。その中で"株"という文字が入っている要素を会社名とみなし、os.renameによりファイルのタイトルとする。

得られる結果

以上により、以下のように名刺の内容が記載されたテキストファイルが得られます。 f:id:tachiken0210:20171030120801p:plain f:id:tachiken0210:20171030120924p:plain

名刺のタイトルにその人の名前を入れたかったのですが、文字情報から名前と断定することが中々難かしく。。。
文字のサイズ情報が取得できれば名前を断定できるのかな?(名刺は名前が一番サイズ大きいっぽいので)