フォーム読み込み中
ご覧いただきありがとうございます。ソフトバンクの小柳です。
本記事では、Alibaba CloudのContents Moderationで画像認識を行う方法を紹介します。
コンテンツの違法性チェックとして宣伝されているContents Moderationですが、画像認識機能が提供されていることを知ったので、実際にコンソールやドキュメントを確認しながら試してみました。
Alibaba CloudのContents Moderationは、AI技術を活用して、画像、テキスト、ビデオなどのマルチメディアコンテンツに対して自動的にチェックするクラウドサービスです。Contents Moderationは、違法コンテンツや不適切なコンテンツを検出・ブロックすることで、コンテンツ管理者がコンテンツの管理にかかる負担を軽減します。
Contents Moderationの対象としては、特に暴力表現、ポルノグラフィ、薬物、ギャンブル、ヘイトスピーチ、過激な宗教的・政治的表現などが挙げられます。このようなコンテンツは、各国の法律や規制に基づいて検出され、表示される前にフィルタリングされます。
Contents Moderationでは前項のようにコンテンツの違法性チェックを前面に宣伝していますが、それだけではなくOptical Character Recognition(OCR)にも対応しています。
OCRは、画像内に含まれる文字を自動的に認識し、テキストとして抽出する技術です。
Alibaba CloudのContents Moderation ではOCR用のAPIを提供しており、手書きや印刷された文字をデジタル情報に変換することが可能です。これは、請求書、領収書、契約書などの紙文書のデジタル化や、画像に含まれるテキスト情報を素早く取得するのに役立ちます。また、AI技術を使用して様々なフォント、レイアウト、言語に対応しており、英語、中国語、日本語など、多数の言語での文字認識が可能です。
Contents Moderationは前述のように違法性チェックの機能が前面に宣伝されていますが、少なくとも私が関わってきた日本のお客様ではこのような需要は少なく、逆に画像の認識、取り込み、情報抽出の要望や事例が多かったため、今回Contents ModerationのOCRをご紹介することでご要望の一助になればと思います。
まず、Alibaba Cloudのアカウントを作成し、Contents Moderationサービスを有効化します。Contents Moderationは、1.0と2.0がありますが、1.0を有効化してください。2.0ではOCRは利用できません。
OCRのAPIを利用するためには、API keyとsecretが必要です。API keyとsecretは、APIリクエスト時の認証やアクセス制御を行うために使われます。
Alibaba CloudのResource Access ManagementコンソールからAPI keyとsecretを作成、取得し、それをOCRのAPIリクエストに含めることでAPIが利用できます。
次に、OCRを行いたい画像を準備します。画像の形式は、JPEG、PNG、BMPなどの一般的なフォーマットに対応しています。
そのほかの制限事項は公式ドキュメントを参照してください。
APIには同期処理と非同期処理のAPIがあります。2つの違いは、同期処理は結果をすぐに返しますがタイムアウトが6秒と短いことです。非同期処理は結果をすぐに返さず結果を最大1時間保持するので、ポーリングやコールバックで結果を取得する必要があります。
認識精度を高めるためには、画像が鮮明であることが望ましいです。解像度が低かったり、不鮮明な画像は、出力結果に影響を及ぼす可能性があります。
今回のデモで使用する画像は、下記のような申込書のPNG形式のサンプル画像です。
画像が準備できたら、API Endpointにリクエストを送信します。
APIの利用には料金が掛かりますのでご注意ください。
公式ドキュメントでは、HTTP(S)でPOSTする方法が多く書かれていますが、どれも署名(Signature)の計算が必要になるため、ドキュメントにあるHTTP(S)リクエストの方法はお勧めしません。
その代わり、複数のプログラミング言語用のSDKが提供されているので、SDK環境をセットアップして、SDKからリクエストする方法をお勧めします。
SDKには署名計算が含まれているため、画像だけ用意すれば比較的簡単にAPIを利用することが出来ます。
今回はPythonで環境をセットアップしました。
Python SDKを使用したOCR
※SDKだけでなく、PrerequisitesにあるExtension.Uploader utility classも導入してください。
上記のドキュメントにサンプルコードはあるのですが、そのままでは動作しませんでしたので、今回デモで使用したコードを掲載しておきます。
OSの環境変数に、項目2で取得した自環境のAPI keyとsecretを設定してください。
また、引数のファイル内を1行づつ読み取って、複数のファイルを同時に処理できるようにしています。
#coding=utf-8
from aliyunsdkcore import client
from aliyunsdkgreen.request.v20180509 import ImageSyncScanRequest
from aliyunsdkgreen.request.extension import HttpContentHelper
import os
import sys
import json
import uuid
# Alibaba Cloudの認証情報
accessKeyId = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
accessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
# クライアントの初期化
clt = client.AcsClient(accessKeyId, accessKeySecret, "ap-southeast-1")
# ファイルからURLを読み込む関数
def load_urls_from_file(file_path):
with open(file_path, 'r') as file:
return [line.strip() for line in file.readlines()]
# 複数のファイルを処理するメイン処理
def process_images(urls):
for url in urls:
request = ImageSyncScanRequest.ImageSyncScanRequest()
request.set_accept_format('JSON')
# 1つのタスクを作成
task = {"dataId": str(uuid.uuid1()),
"url": url
}
print(f"Processing task for URL: {url}")
# リクエストの内容を設定
request.set_content(HttpContentHelper.toValue({"tasks": [task],
"scenes": ["ocr"]
}))
# API呼び出し
response = clt.do_action_with_exception(request)
result = json.loads(response)
# 結果の処理
if 200 == result["code"]:
taskResults = result["data"]
for taskResult in taskResults:
if (200 == taskResult["code"]):
sceneResults = taskResult["results"]
print(sceneResults)
else:
print(f"Task failed: {taskResult['code']}")
else:
print(f"Request failed: {result['code']}")
if __name__ == "__main__":
# コマンドライン引数からテキストファイルパスを取得
if len(sys.argv) < 2:
print("Usage: python script.py <file_path>")
sys.exit(1)
file_path = sys.argv[1]
# ファイルからURLを読み込み、処理を開始
urls = load_urls_from_file(file_path)
process_images(urls)
SDKを通じて、画像ファイルをAPIサーバーに送信し、OCRを実行します。リクエストに画像のURLを指定することができ、OSSもしくはCDNを利用することが推奨されていたので、今回はOSSに画像をアップロードしてそのURLを指定しました。
Alibaba CloudのOCR APIは、リクエストを受け取ると処理した結果をJSON形式で返します。返されるデータには、認識されたテキストの内容と、各文字の位置情報が含まれます。さらに、複数行のテキストや表形式のデータも認識でき、構造化された情報として出力されます。
前項のサンプルコードの実行結果をサンプルとして掲載しておきます。「備考」が「信考」と認識されてしまっているのが残念ですが、それ以外は問題なさそうです。何回か別の画像でも試してみましたが、全体が映るような倍率にした画像の場合、本来の文字が別の文字として認識されてしまうクセがあるように感じました。実行結果については、前述の同期・非同期APIドキュメントにも記載されていますので、参考にしてください。
[{'label': 'ocr', 'ocrData': ['デモ申込書,フリガナ,氏名,生年月日,電話番号,携帯電話,フリガナ ,123-0987,住所,信考'], 'ocrLocations': [{'h': 20.0, 'text': 'デモ申込書', 'w': 96.0, 'x': 234.0, 'y': 72.0}, {'h': 12.0, 'text': 'フリガナ', 'w': 47.0, 'x': 66.0, 'y': 137.0}, {'h': 13.0, 'text': '氏名', 'w': 44.0, 'x': 66.0, 'y': 167.0}, {'h': 12.0, 'text': '生年月日', 'w': 46.0, 'x': 66.0, 'y': 204.0}, {'h': 13.0, 'text': '電話番号', 'w': 48.0, 'x': 65.0, 'y': 273.0}, {'h': 13.0, 'text': '携帯電話', 'w': 51.0, 'x': 297.0, 'y': 273.0}, {'h': 11.0, 'text': 'フリガナ ', 'w': 47.0, 'x': 66.0, 'y': 302.0}, {'h': 11.0, 'text': '123-0987', 'w': 61.0, 'x': 130.0, 'y': 330.0}, {'h': 12.0, 'text': '住所', 'w': 42.0, 'x': 67.0, 'y': 351.0}, {'h': 12.0, 'text': '信考', 'w': 43.0, 'x': 64.0, 'y': 465.0}], 'rate': 99.91, 'scene': 'ocr', 'suggestion': 'review'}]
APIレスポンスをもとに、自分が開発するアプリケーションなどでさらに処理を行うことが可能です。例えば、デジタル文書に変換して保存したり、抽出したテキストをデータベースに登録することができます。
あまり一般的ではないかもしれませんが、電子化の一例として、今回は得られた情報を元に下記のようなWebフォームにリフォームしてみました。
Alibaba CloudのContents Moderationは、ユーザーがプラットフォーム上で適切なコンテンツ管理を行うだけでなく、画像内に含まれる文字を自動的に認識してテキストとして抽出するOCRにも対応していることを紹介しました。
残念ながらコンソール内のUIで画像をアップロードして判別できるような形になってない、解析結果に誤りがあるなど、UXの面についてソフトバンクからAlibaba Cloudへ改善要望を挙げたいと思います。
現在、Contents Moderation によるOCRはSDKとAPIだけの提供になりますが、APIから得られた結果をアプリケーションなどで自由に保存、加工することができますので、文書の電子化、画像からのテキスト抽出の分野でDXにご利用いただければと思います。
Alibaba Cloudは中国国内でのクラウド利用はもちろん、日本-中国間のネットワークの不安定さの解消、中国サイバーセキュリティ法への対策など、中国進出に際する課題を解消できるパブリッククラウドサービスです。
条件に該当するページがございません