Google Colabを用いたNDLOCRアプリの更新:Sigle input dir modeの追加
概要
先日以下の記事およびノートブックを作成しました。
上記の記事執筆時点では、以下の入力形式にのみ対応していました。
Image file mode(-s f
で指定) (単体の画像ファイルを入力として与える場合はこちら)
ただ、以下の記事での検証により、複数の画像に対して上記のオプションを適用することは、オーバーヘッドが大きいことがわかりました。
そこで、以下の入力形式にも対応できるようにノートブックを修正しました。
Sigle input dir mode(-s s
で指定)※デフォルト
以下、上記入力オプションの使い方について説明します。
使い方
「2.設定」の「input_structure」において、「s」を選択してください。従来の「Image file mode」を使用する場合には、「f」を選択してください。
「input_structure」で「s」を選んだ場合、「extensions」の項目は無視されます。
また、入力フォルダの作成方法に注意点があります。以下の入力フォルダのパスを指定する場合を例とします。
/content/drive/MyDrive/ndl_ocr/input/
この時、以下のように、「input」フォルダの下に「img」フォルダを作成し、その下に画像を格納します。
上記の準備および設定を行なった上で実行を行うと、「Sigle input dir mode」によりOCR処理を実行することができます。
まとめ
今回作成したノートブックについて、「f(Image file mode)」を選択した場合、指定した入力フォルダ内の階層構造を特に意識せずに実行することができます。ただしこのモードでは画像ファイル毎にプログラムを実行するため、一部オーバーヘッドが生じます。大量の画像ファイルを対象に実行する場合には、「s(Sigle input dir mode)」を選択することをお勧めします。
誤った理解をしている点があるかもしれませんが、参考になりましたら幸いです。
Google Colabを用いたNDLOCRの実行にかかる時間について
先日、以下の記事を執筆しました。
今回は、Google Colabを用いたNDLOCRの実行にかかる時間について、かんたんな調査を行なったので、その結果をまとめます。
設定
GPUは以下です。
Fri Apr 29 06:26:29 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... Off | 00000000:00:04.0 Off | 0 | | N/A 35C P0 23W / 300W | 0MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
以下の画像を用いました。サイズは5000 x 3415 px で、 1.1 MB でした。
https://dl.ndl.go.jp/info:ndljp/pid/3437686/6
推論の処理内容として、以下の4つがありますが、今回は「レイアウト抽出」と「文字認識(OCR)」のみを実行しています。
- '-p 0': ノド元分割
- '-p 1': 傾き補正
- '-p 2': レイアウト抽出
- '-p 3': 文字認識(OCR)
Googleドライブの場合
マウントしたGoogleドライブをファイルの入出力に使用する場合について考察します。以下の入力オプションを使用します。
Sigle input dir mode(-s s
で指定)※デフォルト
1ファイルを対象に実行したところ、以下のような結果になりました。
ID | 処理 | タイムスタンプ | かかった時間(秒数) |
---|---|---|---|
p1 | 開始 | 2022-04-29 05:30:58 | 11 |
p2 | 推論の開始 | 2022-04-29 05:31:09 | 2 |
p3 | 終了 | 2022-04-29 05:31:11 | (合計) 13 |
p1からp2までの間は設定ファイル等のロードを行なっている時間です。画像に対する推論時間は2sでした。
同じ画像をもう1件登録して、2ファイルを対象に実行しました。
ID | 処理 | タイムスタンプ | かかった時間(秒数) |
---|---|---|---|
p1 | 開始 | 2022-04-29 05:38:02 | 10 |
p2 | 推論の開始 | 2022-04-29 05:38:12 | 6 |
p3 | 終了 | 2022-04-29 05:38:18 | (合計) 16 |
さらに、同じ画像をもう1件登録して、3ファイルを対象に実行しました。
ID | 処理 | タイムスタンプ | かかった時間(秒数) |
---|---|---|---|
p1 | 開始 | 2022-04-29 05:40:26 | 10 |
p2 | 推論の開始 | 2022-04-29 05:40:36 | 8 |
p3 | 終了 | 2022-04-29 05:40:44 | (合計) 18 |
上記の結果から、設定ファイルの初期ロードに10s程度かかり、各画像に対して、2~3s程度の処理時間がかかることがわかります。
冒頭で共有した私が作成したノートブックでは、複数の入力画像があっても、以下のオプションにより、画像ファイル毎にプログラム main.py を実行するようにしていました。
Image file mode(-s f
で指定) (単体の画像ファイルを入力として与える場合はこちら)
このことから、各画像ファイルに対して、1ファイル目を除き、初期ロードに要する10s程度の時間が不要にかかっていることになります。
実際、 Image file mode を用いて2つのファイルを対象に実行したところ、 Sigle input dir mode に比べて、ちょうど10s(初期ロードに要する時間)増加していることが確認できました。
ID | 処理 | タイムスタンプ | かかった時間(秒数) |
---|---|---|---|
p1 | 1ファイル目の開始 | 2022-04-29 05:52:59 | 11 |
p2 | 推論の開始 | 2022-04-29 05:53:10 | 2 |
p3 | 終了 | 2022-04-29 05:53:12 | 1 |
p4 | 2ファイル目の開始 | 2022-04-29 05:53:13 | 10 |
p5 | 推論の開始 | 2022-04-29 05:53:23 | 2 |
p6 | 終了 | 2022-04-29 05:53:25 | (合計) 26 |
(当たり前のことではありますが、)処理対象の画像数が多い場合には、 Sigle input dir mode を使用することをお勧めします。
(参考)GCS(Google Cloud Storage)の場合
今回は、Google ColabからマウントしたGCSを使用した場合についても計測してみました。各種設定によって結果は変わってくると思いますが、上述したGoogleドライブとの比較が目的です。
以下の入力オプションを使用します。
Sigle input dir mode(-s s
で指定)※デフォルト
1ファイルの場合
ID | 処理 | タイムスタンプ | かかった時間(秒数) |
---|---|---|---|
p1 | 開始 | 2022-04-29 06:06:08 | 13 |
p2 | 推論の開始 | 2022-04-29 06:06:21 | 13 |
p3 | 終了 | 2022-04-29 06:06:34 | (合計) 26 |
2ファイルの場合
ID | 処理 | タイムスタンプ | かかった時間(秒数) |
---|---|---|---|
p1 | 開始 | 2022-04-29 06:04:08 | 12 |
p2 | 推論の開始 | 2022-04-29 06:04:20 | 27 |
p3 | 終了 | 2022-04-29 06:04:47 | (合計) 39 |
初期ロードの時間はあまり変化がありませんが、1画像あたりの処理時間が約5倍程度になりました。推論結果の画像やテキストファイルの保存に時間を要していました。
(これも当たり前のことではありますが、)大量の画像を扱う際には、今回のノートブックの入出力にGCSを使うのはお勧めできないことがわかりました。
まとめ
Google Colabを用いたNDLOCRの実行時間を調べてみました。さまざまな設定によって結果は変わってくるかと思いますが、参考になる部分があれば幸いです。
Google Colabを用いたジャパンサーチRDFストアに対するSPARQLの実行例
Google Colabを用いたndl-lab図表自動抽出プログラムの実行
概要
ndl-labでは、以下の図表自動抽出プログラムが公開されています。
https://github.com/ndl-lab/tensorflow-deeplab-v3-plus
今回は上記のプログラムについて、Google Driveを用いた画像の入力と結果の保存までの手続きを含むGoogle Colabの使用方法をまとめましたので紹介します。
ノートブック
今回作成したGoogle Colabのノートブックには以下からアクセスいただけます。
https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ndl_deeplab.ipynb
Googleドライブ上に入力画像のフォルダを用意することで、図表の自動抽出処理を実行することができます。
基本的な操作方法は、上記のノートブック内の説明をご確認ください。以下、実行例を紹介します。
本ノートブックでは、(1)入力フォルダを準備する方法と、(2)IIIFマニフェストファイルのURLを入力する方法の2つがあります。それぞれについて説明します。
実行方法:(1)入力フォルダの準備
入力フォルダの準備
まず、Google Drive上に画像ファイルを格納したフォルダを作成します。今回は、以下のように、マイドライブに「ndl_deeplab > input」というフォルダを作成して、その直下に画像ファイルを格納しました。
ノートブックの実行:1.初期セットアップ
先に示した以下のノートブックにアクセスしてください。
https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ndl_deeplab.ipynb
そして、用意されている2つの再生ボタンを押してください。少し時間がかかりますが、必要なライブラリ等をインストールします。また、本作業については、ノートブック立ち上げ後の初回のみ実行します。
ノートブックの実行:2.設定
次に、処理の適用対象を設定します。以下のように、input_dir
に先に用意したフォルダへのパスを指定します。またmanifest
の値を空にしてください。これにより、input_dir
に格納した画像ファイルを対象に処理を実行します。
再生ボタンを押して、設定は完了です。
ノートブックの実行:3.実行
「3.実行」の再生ボタンを押してください。
完了後は、以下のように、指定した出力フォルダに処理の開始時間に基づくフォルダが作成され、その中に認識結果が保存されます。
図表の抽出に失敗してしまう場合もありますが、今回は以下のように、正しく図表を抽出することができました。
実行方法:(2)IIIFマニフェストファイルのURLを入力する
ノートブックの実行:1.初期セットアップ
これは先ほどのプロセスと同じです。2回目以降はスキップしてください。
ノートブックの実行:2.設定
以下のように、manifest
に処理対象とするIIIFマニフェストファイルのURLを入力してください。
またprocess_size
に処理対象のcanvas数を指定します。-1
を入力すると、マニフェストファイルに含まれるすべてのcanvas(画像)に対して処理を実行します。
再生ボタンを押して、設定は完了です。
ノートブックの実行:3.実行
「3.実行」の再生ボタンを押してください。
今回の場合、以下のように、まず画像のダウンロードが行われます。
### マニフェストが指定されている場合は、画像のダウンロード ### 80%|████████ | 4/5 [00:13<00:03, 3.41s/it]
その後、抽出処理が始まります。処理対象の画像が多い場合、完了まで時間がかかります。
抽出処理の完了後、「実行方法:(1)入力フォルダの準備」で示した通り、指定したGoogleドライブ上の出力フォルダに認識結果が保存されるほか、以下のように、認識結果をIIIFマニフェストファイルの形で出力し、それをMiradorビューアで閲覧するためのURLが表示されます。
### マニフェストが指定されている場合は、認識結果をマニフェストファイルに出力 ### /content/drive/MyDrive/ndl_deeplab/output/20220429095851/manifest.json にマニフェストファイルを保存しました。 また以下のリンクから、認識結果を確認できます。 https://localhost:8000/
上記のリンクをクリックすると、以下のように、Miradorを用いて認識結果を確認することができます。
まとめ
今回は、NDLラボが公開する図表自動抽出プログラムについて、Google Colabを用いた実行方法の一例を示しました。他の方の参考になりましたら幸いです。
このようなアプリケーションを公開してくださったNDLの関係者の方々に深く感謝いたします。
Google Colabを用いたNDLOCRアプリの実行(Google Driveを用いた画像の入力と結果の保存)
概要
前回、Google Cloud PlatformのCompute Engineを用いたNDLOCRアプリの実行方法を共有しました。
ただし、上記の方法は手続きが一部面倒で、かつ費用がかかる方法です。本番環境で使用するには適した方法ですが、小規模に、または試験的に使用するにはハードルが高い方法でした。
この課題に対して、 @blue0620 さんがGoogle Colabを用いたNDLOCRアプリの実行方法を作成されました。
https://twitter.com/blue0620/status/1519294332159012864
上記のノートブックを使用することにより、簡単に(「ランタイム」>「すべてのセルを実行」からワンクリックで)、かつ無料でOCRを実行することができます。
今回は、このノートブックを参考にして、Google Driveを用いた画像の入力と結果の保存までの手続きを含むGoogle Colabの使用方法をまとめましたので紹介します。
ノートブック
今回作成したGoogle Colabのノートブックには以下からアクセスいただけます。
https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ndl_ocr_folder.ipynb
Googleドライブ上に入力画像のフォルダを用意するだけで、OCR処理を実行することができます。
基本的な操作方法は、上記のノートブック内の説明をご確認ください。以下、実行例を紹介します。
実行方法
入力フォルダの準備
まず、Google Drive上に画像ファイルを格納したフォルダを作成します。今回は、以下のように、マイドライブに「ndl_ocr > input」というフォルダを作成して、その直下に画像ファイル「image_1.jpg」とフォルダ「dir_1」を作成し、フォルダ「dir1」の中に画像ファイル「image_2.jpeg」を格納しました。
ツリーで見ると、以下のような形です。
今回作成したプログラムでは、指定した入力フォルダに含まれる画像を再帰的に探索します。
ノートブックの実行:1.初期セットアップ
先に示した以下のノートブックにアクセスしてください。
https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ndl_ocr_folder.ipynb
そして、以下に示す再生ボタンを押してください。少し時間がかかりますが、必要なライブラリ等をインストールします。また、本作業については、ノートブック立ち上げ後の初回のみ実行します。
再生ボタンを押した後、「このノートブックに Google ドライブのファイルへのアクセスを許可しますか?」と聞かれるので、「Google ドライブに接続」を押して、許可してください。
その後、しばらくの間、再生中のボタンが表示されます。これが完了したら、次のステップに進みます。
ノートブックの実行:2.設定
次に、OCR処理の適用対象を設定します。
入力フォルダ(input_dir)は、上述した「/content/drive/MyDrive/ndl_ocr/input/」としました。
出力フォルダ(output_dir)は、「/content/drive/MyDrive/ndl_ocr/output/」としました。このフォルダは事前に作成しておかなくてもかまいません。
拡張子(extensions)は、今回は拡張子がjpgとjpegの画像を格納したので、これら二つを設定します。
processは、以下を参考にしてください。
ノートブックの実行:3.実行
「3.実行」の再生ボタンを押してください。
再生ボタンを押した後、以下のように、再生中ボタンが表示されます。
完了後は、以下のように、指定した出力フォルダに認識結果が保存されます。入力フォルダの構造を維持する形で出力するようにしています。また、設定において選択したprocessの値をフォルダ名に付与しています。processの値を変えて実行した際、それぞれの出力フォルダが残るようにしています。
以下のように、Googleドライブ上で認識結果の保存と確認が可能です。
まとめ
上記の方法により、Googleドライブ上に格納した画像に対するOCR処理と、その結果の保存を無料で行うことができます。保存した結果を、さまざまな用途に活用することができます。
Google Colabを利用した実行方法を示してくださった @blue0620 さんに感謝いたします。
追記
2022.05.02
本ノートブックの改良版であるVersion 2を作成しました。以下の記事も参考にしてください。
2022.04.30
設定にSigle input dir modeを追加しました。以下の記事も参考にしてください。
Amazon Lightsailを用いたOmeka Sサイトの構築(独自ドメイン+SSL化を含む)
概要
Amazon Lightsailは以下のような説明がなされています。
Amazon Lightsail は、コンテナなどのクラウドリソースを予測可能な低価格で簡単に管理できる、使いやすい仮想プライベートサーバー (VPS) です。
今回は、このAmazon Lightsailを用いたOmeka Sの構築方法を紹介します。合わせて、データベースの公開にあたり一般的に求められる「独自ドメイン」「SSL」設定についても扱います。
Amazon Lightsail
インスタンスの作成
以下のページにアクセスします。
https://lightsail.aws.amazon.com/ls/webapp/home/instances
そして、以下の「Create Instance」ボタンをクリックします。
「Select a blueprint」において、「LAMP (PHP 7)」を選択します。
「Choose your instance plan」において、インスタンスプランを選択します。今回は最も低価格のプランを選びました。
起動したら、以下のインスタンスのページにアクセスして、「Connect using SSH」ボタンを押します。
以下の画面が表示されます。
Linux ip-172-26-5-202 4.19.0-19-cloud-amd64 #1 SMP Debian 4.19.232-1 (2022-03-07) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. ___ _ _ _ | _ |_) |_ _ _ __ _ _ __ (_) | _ \ | _| ' \/ _` | ' \| | |___/_|\__|_|_|\__,_|_|_|_|_| *** Welcome to the LAMP packaged by Bitnami 7.4.28-14 *** *** Documentation: https://docs.bitnami.com/aws/infrastructure/lamp/ *** *** https://docs.bitnami.com/aws/ *** *** Bitnami Forums: https://community.bitnami.com/ *** bitnami@ip-172-26-5-202:~$
インスタンス内での作業
ファイルの移動
まず、必要なファイルのダウンロードや移動を行います。
cd . # Omekaのダウンロード wget https://github.com/omeka/omeka-s/releases/download/v3.2.0/omeka-s-3.2.0.zip unzip omeka-s-3.2.0.zip # ファイルの移動 mv omeka-s/* /home/bitnami/htdocs # .htaccessの移動 mv omeka-s/.htaccess /home/bitnami/htdocs # 元からあったindex.htmlを削除 rm /home/bitnami/htdocs/index.html
データベースの作成
次にデータベースを作成します。
# パスワードの確認(パスワードが表示されます。) cat /home/bitnami/bitnami_application_password # 上記のパスワードを使ってmysqlに入る mysql -u root -p # データベースを作成する(omekasの部分は任意) MariaDB [(none)]> create database omekas; Query OK, 1 row affected (0.002 sec) MariaDB [(none)]> quit;
Omeka Sの設定
次に、Omeka Sの設定ファイルを修正します。
vi /home/bitnami/htdocs/config/database.ini
以下のようにファイルの内容を修正する。
user = "root" password = "(先ほど確認したパスワード)" dbname = "omekas" # 先ほど作成したデータベース名 host = "localhost" ;port = ;unix_socket = ;log_path =
また、filesフォルダの所有者を変更します。
sudo chown -R daemon:daemon /home/bitnami/htdocs/files
さらに、サムネイル画像の生成等に必要な、imagemagickをインストールしておきます。
sudo apt install imagemagick -y
ブラウザでの設定
Amazon Lightsailのインスタンスの画面で、「Public IP」に表示されるIPアドレスにアクセスします。
以下のように、インストール画面が表示されます。
あとは、基本的なOmeka Sの操作方法と同じです。以下の記事などを参考に、Omeka Sをご活用ください。
https://nakamura196.hatenablog.com/entry/2022/03/01/121931
独自ドメインの付与
ここからはオプショナルな作業について記述します。「独自ドメインの付与」「SSL化」「Basic認証」について扱います。
静的IPアドレスの付与
独自ドメインの付与については、まず静的なIPアドレスを付与します。「Networking」タブから「+ Create static IP」のリンクをクリックします。
以下の画面で「Create」ボタンを押します。
結果、静的なIPアドレスが付与されました。
Route 53
ここでは、Route 53を用いた独自ドメインの付与を行います。例えば、以下のように設定します。
しばらくすると、以下のようなアドレスでアクセスできるようになります。
SSL化
次に、SSL化を行います。再度インスタンスにsshでアクセスして、以下を実行します。
bitnami@ip-172-26-5-202:~$ sudo /opt/bitnami/bncert-tool
以下のように質問に回答します。(以下、一部分です。)
Domain list []: omeka.aws.ldas.jp The following domains were not included: www.omeka.aws.ldas.jp. Do you want to add them? [Y/n]: n Warning: No www domains (e.g. www.example.com) or non-www domains (e.g. www.example.com) have been provided, so the following redirections will be disabled: non-www to www, www to non-www. Press [Enter] to continue: [Enter] Do you agree to these changes? [Y/n]: Y
これにより、先のURLにアクセスすると、HTTPSにリダイレクトされます。
ここまでの作業により、独自ドメインとSSLを用いた最低限の公開環境が整います。
(参考)Basic認証
今回はBasic認証をかける必要があったため、その備忘録です。まず、ユーザを作成します。
sudo htpasswd -c /opt/bitnami/apache2/.htpasswd <username> New password: Re-type new password: Adding password for user <username>
次に、.htaccessの先頭に認証情報を追記します。
vi /home/bitnami/htdocs/.htaccess
AuthType Basic AuthName MyAuthName AuthUserFile "/opt/bitnami/apache2/.htpasswd" Require valid-user
この結果、以下のように、Basic認証が適用されました。
まとめ
以上、Amazon Lightsailを用いたOmeka Sの基本的なセットアップ方法と、Basic認証といったオプショナルな作業をまとめました。
Omeka Sを用いたデジタルアーカイブシステム構築時の参考になりましたら幸いです。
Google Cloud PlatformのCompute Engineを用いたNDLOCRアプリの実行
概要
NDLが公開したNDLOCRアプリケーションについて、GCP(Google Cloud Platform)の仮想マシンを用いて実行してみましたので、その備忘録です。本アプリケーションの詳細については、以下のリポジトリをご確認ください。
https://github.com/ndl-lab/ndlocr_cli
VMインスタンスの作成
GCPのCompute Engineにアクセスして、画面上部の「インスタンスを作成」ボタンをクリックします。
「マシンの構成」の「マシンファミリー」について、「GPU」を選択します。そして「GPUのタイプ」において、今回は最も安価な「NVIDIA T4」を選択します。「GPUの数」は1に設定しました。
「シリーズ」については、「n1-standard-2」を選択します。
「n1-standard-1」では、以下のようにMemoryErrorが発生してしまいました。
次に、「ブートディスク」において、「イメージの切り替え」を選択します。そして推奨された「Deep Learning on Linux」を選択します。
この時の注意点として、「サイズ」をデフォルトの50GBから、100GBに変更しました。50GBの場合、no space leftが発生しました。
以下は、環境構築が済んだ後の情報ですが、40GB強が使用済みとなるため、余裕を持った「サイズ」にしておくことをお勧めします。
u_nakamura_satoru@instance-4:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 7.4G 0 7.4G 0% /dev tmpfs 1.5G 8.4M 1.5G 1% /run /dev/sda1 492G 41G 432G 9% / tmpfs 7.4G 0 7.4G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 7.4G 0 7.4G 0% /sys/fs/cgroup /dev/sda15 124M 5.7M 119M 5% /boot/efi tmpfs 1.5G 0 1.5G 0% /run/user/1001
その後、画面下部の「作成」ボタンを押してVMインスタンスの作成を完了します。
しばらくすると、以下のようにVMインスタンスが立ち上がるので、「SSH」ボタンをクリックして、VMインスタンスに入ります。
VMインスタンス内での操作
Nvidia driverのインストール
SSHで接続後、以下の画面が表示されます。「y」を押して、Nvidia driverをインストールしました。
====================================== Welcome to the Google Deep Learning VM ====================================== Version: common-cu113.m91 Based on: Debian GNU/Linux 10 (buster) (GNU/Linux 4.19.0-19-cloud-amd64 x86_64\n ) Resources: * Google Deep Learning Platform StackOverflow: https://stackoverflow.com/questi ons/tagged/google-dl-platform * Google Cloud Documentation: https://cloud.google.com/deep-learning-vm * Google Group: https://groups.google.com/forum/#!forum/google-dl-platform To reinstall Nvidia driver (if needed) run: sudo /opt/deeplearning/install-driver.sh Linux instance-1 4.19.0-19-cloud-amd64 #1 SMP Debian 4.19.232-1 (2022-03-07) x86 _64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. This VM requires Nvidia drivers to function correctly. Installation takes ~1 minute. Would you like to install the Nvidia driver? [y/n]
ただ立ち上げた直後に上記を実行すると、以下のエラーが発生しました。
Would you like to install the Nvidia driver? [y/n] y Installing Nvidia driver. wait apt locks released install linux headers: linux-headers-4.19.0-19-cloud-amd64 E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? Nvidia driver installed.
以下のpsコマンドを実行してみると、他のプロセスが実行されていました。
ps aux | grep apt
そのため、一旦exitして、少し時間を置いてから再度ssh接続します。同じ質問を聞かれますので、改めて「y」を押すと、以下のようにインストールが完了しました。
Would you like to install the Nvidia driver? [y/n] y Installing Nvidia driver. wait apt locks released install linux headers: linux-headers-4.19.0-19-cloud-amd64 Reading package lists... Done Building dependency tree Reading state information... Done linux-headers-4.19.0-19-cloud-amd64 is already the newest version (4.19.232-1). 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. DRIVER_VERSION: 470.57.02 Downloading driver from GCS location and install: gs://nvidia-drivers-us-public/tesla/470.57.02/NVIDIA-Linux-x86_64 -470.57.02.run Verifying archive integrity... OK Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 470.57.02........................................ ................................................................................................................... ................................................................................................................... ................................................................................................................... ................................................................................................................... ................................................................................... WARNING: The nvidia-drm module will not be installed. As a result, DRM-KMS will not function with this installation of the NVIDIA driver. WARNING: nvidia-installer was forced to guess the X library path '/usr/lib64' and X module path '/usr/lib64/xorg/modules'; these paths were not queryable from the system. If X fails to find the NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver. Nvidia driver installed.
上記のWARNINGの意味は分かりかねたので、スルーしました...
dockerコンテナの起動
あとは、GitHubのREADME.mdの通りに進めることができました。
dockerやgitはインストール済みでしたので、以下を実行しました。dockerbuild.shの実行には少し時間がかかります。
git clone --recursive https://github.com/ndl-lab/ndlocr_cli cd ndlocr_cli sh ./docker/dockerbuild.sh sh ./docker/run_docker.sh
推論の実行
こちらもREADME.mdの通りに進めることができました。
今回は、「校異源氏物語. 巻一」の4ページを対象に推論を実行してみました。
https://dl.ndl.go.jp/info:ndljp/pid/3437686/4
# コンテナにログイン docker exec -i -t --user root ocr_cli_runner bash
コンテナ内で推論を試します。
# sample_data/imgに画像をダウンロード wget https://www.dl.ndl.go.jp/api/iiif/3437686/R0000004/full/full/0/default.jpg -P sample_data/img/ # 推論の実行(-xオプションをつけて、認識結果のxmlファイルの合わせて出力) python main.py infer sample_data output_dir -x
以下のように推論が実行されます。
root@fd35b62fef61:~/ocr_cli# python main.py infer sample_data output_dir -x start inference ! input_root : sample_data output_root : output_dir config_file : config.yml Using TensorFlow backend. load from config=src/ndl_layout/models/ndl_layout_config.py, checkpoint=src/ndl_layout/models/epoch_140_all_eql_bt.pth set up EQL (version NDL), 9 classes included. load checkpoint from local path: src/ndl_layout/models/epoch_140_all_eql_bt.pth No Transformation module specified No SequenceModeling module specified model input parameters 32 1200 20 1 512 256 7085 100 None ResNet None CTC loading pretrained model from src/text_recognition/models/ndlenfixed64-mj0-synth1.pth [{'input_dir': '/root/ocr_cli/sample_data', 'img_list': ['/root/ocr_cli/sample_data/img/default.jpg'], 'output_dir': '/root/ocr_cli/output_dir/sample_data'}] {'input_dir': '/root/ocr_cli/sample_data', 'img_list': ['/root/ocr_cli/sample_data/img/default.jpg'], 'output_dir': '/root/ocr_cli/output_dir/sample_data'} ######## START PAGE INFERENCE PROCESS ######## ### Page Separation ### 1/1 [==============================] - 1s 1s/step img 0 top conf: 0.8656622171401978 ### Page Deskew Process ### ### Page Deskew Process ### ### Layout Extraction Process ### /usr/local/lib/python3.7/dist-packages/mmdet/datasets/utils.py:68: UserWarning: "ImageToTensor" pipeline is replaced by "DefaultFormatBundle" for batch inference. It is recommended to manually replace it in the test data pipeline in your config f ile. 'data pipeline in your config file.', UserWarning) ### Layout Extraction Process ### ### Line OCR Process ### ### Line OCR Process ### This BLOCK elemetn will be skipped. {'TYPE': '図版', 'X': '881', 'Y': '378', 'WIDTH': '439', 'HEIGHT': '428', 'CONF': '0.999'} This BLOCK elemetn will be skipped. {'TYPE': '図版', 'X': '881', 'Y': '378', 'WIDTH': '439', 'HEIGHT': '428', 'CONF': '0.999'} No predicted STRING for this xml_line {'TYPE': '図版', 'X': '881', 'Y': '378', 'WIDTH': '439', 'HEIGHT': '428', 'CONF': '0.999'} ######## END PAGE INFERENCE PROCESS ######## ### save xml : /root/ocr_cli/output_dir/sample_data/xml/sample_data.xml### ================== PROCESSING TIME ================== Average processing time : 6.026494741439819 sec / image file
結果、以下のようにOCRの処理結果を確認することができました。
root@fd35b62fef61:~/ocr_cli# cat output_dir/sample_data/xml/sample_data.xml <?xml version='1.0' encoding='utf-8'?> <OCRDATASET><PAGE HEIGHT="3426" IMAGENAME="default_L.jpg" WIDTH="2485"> <LINE CONF="1.000" HEIGHT="440" STRING="に決定いたしました。" TYPE="本文" WIDTH="45" X="1147" Y="522" /> <LINE CONF="1.000" HEIGHT="2319" STRING="ず、講壇から博士を失ふことを惜しまないものはありませんでした。それで博士記念のために國文學研究の一" TYPE="本文" WIDTH="56" X="1614" Y="517" /> <LINE CONF="1.000" HEIGHT="2336" STRING="事業を起さうといふ議が、やがて博士の知人門下生の間に起り、十二年三月本會が出來て、資金の募集に著手" TYPE="本文" WIDTH="58" X="1519" Y="517" /> <LINE CONF="1.000" HEIGHT="2334" STRING="ありません。大正十一年三月病のために願に依つて本官を免ぜられましたが、博士を知ると知らざるとを問は" TYPE="本文" WIDTH="55" X="1709" Y="519" /> <LINE CONF="1.000" HEIGHT="2337" STRING="られ、又わが國文學界に於ける新研究の開拓者として學界に貢獻された功績の顯著なことは、今更申すまでも" TYPE="本文" WIDTH="55" X="1804" Y="519" /> <LINE CONF="1.000" HEIGHT="876" STRING="原典研究に從事されることになりました。" TYPE="本文" WIDTH="48" X="765" Y="516" /> <LINE CONF="1.000" HEIGHT="2311" STRING="爾來君は主力を原典の搜索、蒐集に注ぎ、廣くこれを全國に探り、得るに隨つて或は摸寫し、或は撮影して、" TYPE="本文" WIDTH="52" X="668" Y="566" /> <LINE CONF="1.000" HEIGHT="2330" STRING="したのであります。中途大震火災の變に遭遇しましたが、幸に資を得ること金五千餘圓に達しました。そこで" TYPE="本文" WIDTH="53" X="1426" Y="523" /> <LINE CONF="1.000" HEIGHT="2309" STRING="ば、諸註研究の完備は期し難いことを痛感され、實行委員も亦これを容認したので、君は第一次事業として、" TYPE="本文" WIDTH="50" X="858" Y="517" /> <LINE CONF="1.000" HEIGHT="2291" STRING="東京帝國大學名譽教授故芳賀矢一博士が、久しく東大の國語國文學講座を擔當して、多數學生の指導に任ぜ" TYPE="本文" WIDTH="59" X="1897" Y="564" /> <LINE CONF="1.000" HEIGHT="2329" STRING="が漸次進むに隨つて、君は古註引くところの原文の異同に疑を抱き、先づ原典研究の基礎を固めるのでなけれ" TYPE="本文" WIDTH="51" X="952" Y="519" /> <LINE CONF="1.000" HEIGHT="2286" STRING="池田文學士は囑を受けてより日夜勵精、資料の蒐集及びその研究に從事することになりました。かくて研究" TYPE="本文" WIDTH="52" X="1045" Y="566" /> <LINE CONF="1.000" HEIGHT="2332" STRING="研究を新進有爲の學者に委囑することとし、芳賀博士の贊成を得て、これを文學士池田龜鑑君に囑託すること" TYPE="本文" WIDTH="53" X="1236" Y="522" /> <LINE CONF="1.000" HEIGHT="2337" STRING="實行委員は直ちに本資金及びその利子を以て源氏物語の諸註集成を作成せんことを企圖し、これを目標とした" TYPE="本文" WIDTH="52" X="1331" Y="518" /> <LINE CONF="0.999" HEIGHT="80" STRING="序" TYPE="本文" WIDTH="77" X="2129" Y="640" /> <LINE CONF="0.823" HEIGHT="88" STRING="3%θ" TYPE="本文" WIDTH="396" X="1632" Y="184" /> <BLOCK CONF="0.593" HEIGHT="46" STRING="一" TYPE="ノンブル" WIDTH="48" X="583" Y="2546" /> </PAGE><PAGE HEIGHT="3463" IMAGENAME="default_R.jpg" WIDTH="2595"> <LINE CONF="0.610" HEIGHT="151" STRING="中央" TYPE="本文" WIDTH="729" X="573" Y="2788" /> <LINE CONF="0.491" HEIGHT="117" STRING="" TYPE="キャプション" WIDTH="92" X="1683" Y="2778" /> <BLOCK CONF="0.999" HEIGHT="428" TYPE="図版" WIDTH="439" X="881" Y="378" />
まとめ
NDLOCRアプリを無事に実行することができました。実行後は、インスタンスの停止を忘れないようにしてください。
このようなアプリケーションを公開してくださったNDLの関係者の方々に深く感謝いたします。
追記
2022.04.28
Google Colabを用いた実行方法を記事にしました。こちらも参考になりましたら幸いです。