YomiTokuは日本語に特化して学習したAI OCRです。Pythonパッケージとして公開されており、インストールすればCLIで簡単にOCR解析が可能です。APIもありますので、Pythonからの操作も可能です。
今回は、さくらインターネット社の提供するGPUクラウドサービスであるDOKでYomiTokuを利用する手順を紹介します。
DOKについて
DOKはさくらインターネットの提供するGPUクラウドサービスです。高機能なGPUを使って、コンテナを実行します。課金は秒単位となっており、GPU向けのFaaS(Function as a Service)として利用できます。
Dockerイメージの作成
DOK上で利用するDockerイメージを作成します。ベースになるのは、公式リポジトリにあるdockerfileです。このDockerfileを使えば、以下のようにコマンドを実行できます。
$ git clone https://github.com/kotaro-kinoshita/yomitoku.git
$ cd yomitoku
$ docker build -t yomitoku .
$ docker exec -it --rm --gpus all yomitoku \
yomitoku -o /path/to/results -f md /path/to/dir
今回はこの実行方法を多少カスタマイズして、DOK上で動かします。具体的には、 docker-entrypoint.sh をコンテナ内にコピーし、そのファイルを実行します。
WORKDIR /workspace
# ここから追記
COPY dockker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/dockker-entrypoint.sh
ENTRYPOINT ["/usr/local/bin/dockker-entrypoint.sh"]
docker-entrypoint.shの作成
docker-entrypoint.sh
は、Dockerコンテナが起動したときに実行されます。これを使って、YomiTokuを実行します。
#!/bin/bash
# この下に記述します
まず、DOKから渡される環境変数を取得します。
- SAKEURA_ARTIFACT_DIR
アウトプット先ディレクトリ(自動付与) /opt/artifact固定です - SAKEURA_TASK_ID
DOKのタスクID(自動付与)
この2つの環境変数は必ず送られてきますが、ローカルで試用する際などを考えて、デフォルト値を設定しておきます。
# アウトプット先ディレクトリ(自動付与) /opt/artifact固定です
if [ -z "${SAKURA_ARTIFACT_DIR:-}" ]; then
echo "Environment variable SAKURA_ARTIFACT_DIR is not set" >&2
SAKURA_ARTIFACT_DIR=/opt/artifact
fi
# DOKのタスクID(自動付与)
if [ -z "${SAKURA_TASK_ID:-}" ]; then
echo "Environment variable SAKURA_TASK_ID is not set" >&2
SAKURA_TASK_ID=0
fi
そして、解析したい帳票は URL
という環境変数で指定します。これは必須です。
# 解析対象のファイルのURL
if [ -z "${URL:-}" ]; then
echo "Environment variable URL is not set" >&2
exit 1
fi
ファイルは、wgetでダウンロードします。
filename=$(basename "$URL")
wget -O $SAKURA_ARTIFACT_DIR/$filename $URL
これで、 /opt/artifact
にファイルがダウンロードされました。
さらに、出力フォーマットを複数指定できるようにします。何も指定しない場合には、 json
のみです。
# 出力フォーマット。,区切りで複数指定可能
FORMATS=()
if [ -z "${FORMAT:-}" ]; then
# デフォルト
FORMATS=("json")
else
# ,で分割
IFS=',' read -ra FORMATS <<< "$FORMAT"
fi
これで、 FORMATS
に出力フォーマットが格納されました。そして、フォーマット毎に yomitoku
を実行します。
for format in "${FORMATS[@]}"; do
echo "SAKURA_ARTIFACT_DIR: $SAKURA_ARTIFACT_DIR"
echo "filename: $filename"
echo "format: $format"
yomitoku -o $SAKURA_ARTIFACT_DIR -f $format -v $SAKURA_ARTIFACT_DIR/$filename
done
これで、指定されたフォーマットで解析が実行されます。 docker-entrypoint.sh
は以下のようになります。
#!/bin/bash
# アウトプット先ディレクトリ(自動付与) /opt/artifact固定です
if [ -z "${SAKURA_ARTIFACT_DIR:-}" ]; then
echo "Environment variable SAKURA_ARTIFACT_DIR is not set" >&2
SAKURA_ARTIFACT_DIR=/opt/artifact
fi
# DOKのタスクID(自動付与)
if [ -z "${SAKURA_TASK_ID:-}" ]; then
echo "Environment variable SAKURA_TASK_ID is not set" >&2
SAKURA_TASK_ID=0
fi
# 解析対象のファイルのURL
if [ -z "${URL:-}" ]; then
echo "Environment variable URL is not set" >&2
exit 1
fi
filename=$(basename "$URL")
wget -O $SAKURA_ARTIFACT_DIR/$filename $URL
# 出力フォーマット。,区切りで複数指定可能
FORMATS=()
if [ -z "${FORMAT:-}" ]; then
# デフォルト
FORMATS=("json")
else
# ,で分割
IFS=',' read -ra FORMATS <<< "$FORMAT"
fi
for format in "${FORMATS[@]}"; do
echo "SAKURA_ARTIFACT_DIR: $SAKURA_ARTIFACT_DIR"
echo "filename: $filename"
echo "format: $format"
yomitoku -o $SAKURA_ARTIFACT_DIR -f $format -v $SAKURA_ARTIFACT_DIR/$filename
done
コンテナレジストリの準備
さくらインターネットでは、Dockerイメージを保存しておくコンテナレジストリを提供しています。これは無料で利用でき、さくらインターネットのネットワーク内に保存されるので、DOK実行時に便利です。
さくらインターネットのGPUサービスDOKでVALL-E X(音声読み上げAI)を試す #Python - Qiitaを参考にしています。
コンテナレジストリの用意
さくらのクラウドにログインしたら さくらのクラウド
を選択します。
左側のメニューの グローバル
の中にある コンテナレジストリ
を選択します。
追加
を押して、コンテナレジストリを作成します。
項目 | 設定 |
---|---|
名前 | 任意の名前 |
コンテナレジストリ名 | サブドメイン名として利用されます 例: example.sakuracr.jp
|
公開設定 | Pullのみで指定してください |
利用ユーザーの作成
作成したコンテナレジストリを一覧でダブルクリックし、詳細表示にてユーザータブをクリックします。
追加ボタンを押し、ユーザーを作成します。
項目 | 設定 |
---|---|
ユーザー名 | 任意のユーザー名 |
パスワード | 任意のパスワード |
ユーザ権限設定 | All |
Dockerイメージのビルド
DockerイメージはLinuxで行います。今回はUbuntu 24.04を使っています。 example.sakuracr.jp
の部分は、作成したコンテナレジストリのURLに読み替えてください。また、 yomitoku
は任意の名前です。
sudo docker build -t example.sakuracr.jp/yomitoku:latest .
コンテナレジストリへのログイン
作成したコンテナレジストリにログインします。認証が求められるので、作成したものを入力してください。
sudo docker login example.sakuracr.jp
イメージのプッシュ
ビルドしたイメージをコンテナレジストリにプッシュします。
sudo docker push example.sakuracr.jp/yomitoku:latest
これで、コンテナレジストリにDockerイメージが保存され、DOKで実行する準備が整いました。
DOKでの実行
DOKは、タスクという単位で処理内容を指定します。その際に、Dockerイメージとコマンド、環境変数を指定します。今回は、以下のように設定します。
- イメージ
example.sakuracr.jp/yomitoku - 環境変数
以下のように設定します
変数名 | 値 |
---|---|
URL | 解析したい帳票ファイルのURL |
FORMART | 出力フォーマット。カンマ区切りで複数指定可能 |
解析したいファイルはURLで指定できれば、どこにあっても大丈夫です。たとえばさくらインターネットのオブジェクトストレージや、Amazon S3などが利用できます。
実行中です。ログが流れていきます。
実行完了すると、「アーティファクト」という項目にダウンロードのリンクが表示されます。これは /opt/artifact
に保存されたファイルを圧縮したもので、 tar.gz
形式でダウンロードできます。
解凍すると、指定したフォーマットの解析結果ファイルと、レイアウトなどの画像ファイルがダウンロードできます。
たとえば、以下はMarkdown出力結果です。
ライセンス
YomiTokuのライセンスはコモンズ証 - 表示 - 非営利 - 継承 4.0 国際 - Creative Commonsです。非商用での個人利用、研究目的においては、ご自由に利用できます。商用目的での利用に関しては、商用ライセンスが必要です。
まとめ
今回はDOKを使って、YomiTokuを実行しました。DOKはタスクベースなので、複数のタスクを立ち上げて並行処理させられます。また、URL上に圧縮ファイルを置いて、解凍してから一括実行と言った利用も考えられます。
DOKは秒単位で課金されるので、短時間で処理が終わるYomiTokuと相性が良さそうです。ぜひ参考にしてください。