本ブログでは、Armadillo-IoT G4上でOCR(Optical Character Recognition:光学文字認識)を実行する方法・結果について紹介します。今回は、機械学習によってOCRを行うPaddleOCRを使用しました。特徴として、 文字の傾きや日本語に対応しています。 PaddleOCRは、スマートフォンや組み込み用に対応しているPaddle Liteというフレームワークを使用して、Armadillo-IoT G4で実行しました。OCRの処理を行ったハードウェアはNPUではなくCPUになります。以下にソフトウェアの構成等についてまとめていますが、実行結果のみ知りたい方は「実行結果」をご覧ください。
使用環境・機材
- ATDE9※
-
Armadillo-IoTゲートウェイ G4
※ATDEに割り振られているメモリやプロセッサ数が少ないと、クロスコンパイルに時間がかかる場合があります。本ブログでは、メモリ8GB、プロセッサ数4で動作検証を行いました。
使用したソフトウェア
使用したArmadillo-IoT G4のソフトウェア構成は以下の通りです。
ソフトウェア | ダウンロード |
---|---|
Armadillo Base OS SWUイメージファイル | v3.15.4-at.6 |
Dockerfile | v1.0.5 |
Paddle Lite | v2.9 |
PaddleOCR | v2.5 |
OCRの準備
ATDE上での準備
Paddle Lite用PaddleOCRをクロスコンパイル
Paddle Lite用のPaddleOCRをクロスコンパイルします。
[ATDE ~]$ git clone -b release/2.5 https://github.com/PaddlePaddle/PaddleOCR.git
[ATDE ~]$ cd PaddleOCR/
Paddle Lite用のPaddleOCRをクロスコンパイルできるように、パッチを当て、AutoLogをgiteeのリポジトリからクローンします。また、クロスコンパイルに必要なライブラリをダウンロードします。
[ATDE ~/PaddleOCR]$ wget https://armadillo.atmark-techno.com/system/files/blog/paddleocr_lite_g4.patch
[ATDE ~/PaddleOCR]$ patch -p1 < paddleocr_lite_g4.patch
[ATDE ~/PaddleOCR]$ cd deploy/lite
[ATDE ~/PaddleOCR/deploy/lite]$ git clone https://gitee.com/Double_V/AutoLog
[ATDE ~/PaddleOCR/deploy/lite]$ wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.9/inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv.tar.gz
[ATDE ~/PaddleOCR/deploy/lite]$ tar xf inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv.tar.gz
Paddle Lite用のPaddleOCRをクロスコンパイルし、OCRのデモに使用する画像等をinference_lite_lib.armlinux.armv8.gcc.with_extra.with_cvにコピーするため、prepare_ja.shを実行します。
[ATDE ~/PaddleOCR/deploy/lite]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/PaddleOCR/deploy/lite/inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv/cxx/lib/
[ATDE ~/PaddleOCR/deploy/lite]$ make
[ATDE ~/PaddleOCR/deploy/lite]$ ls ocr_db_crnn
ocr_db_crnn
[ATDE ~/PaddleOCR/deploy/lite]$ prepare_ja.sh inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv
テキスト認識モデルをPaddle Liteモデルに変換
PaddleOCRでは、3つのモデルを使用しており、テキスト検出モデル・テキスト認識モデル・テキストの角度判別モデルを用意する必要があります。テキスト検出モデルとテキストの角度判別モデルは、公式から配布されているモデルを使用できますが、テキスト認識モデルは、日本語に対応しているモデルを用意する必要があるため、PaddlePaddleのモデルから、Paddle Liteのモデルに変換する必要があります。
[ATDE ~]$ mkdir model
[ATDE ~]$ cd model
[ATDE ~/model]$ wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/lite/ch_ppocr_mobile_v2.0_det_slim_opt.nb #テキスト検出モデルをダウンロード
[ATDE ~/model]$ wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/lite/ch_ppocr_mobile_v2.0_cls_slim_opt.nb #テキストの角度判別モデルをダウンロード
[ATDE ~/model]$ wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/multilingual/japan_mobile_v2.0_rec_infer.tar #日本語のテキスト認識モデルをダウンロード
[ATDE ~/model]$ wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.9/opt_linux #PaddlePaddleからPaddle Liteへモデルを変換するためのバイナリをダウンロード
[ATDE ~/model]$ tar xf japan_mobile_v2.0_rec_infer.tar
[ATDE ~/model]$ chmod +x opt_linux
[ATDE ~/model]$ ./opt_linux \
--model_file=./japan_mobile_v2.0_rec_infer/inference.pdmodel \
--param_file=./japan_mobile_v2.0_rec_infer/inference.pdiparams \
--optimize_out=./japan_mobile_v2.0_rec_opt \
--valid_targets=arm \
--optimize_out_type=naive_buffer
[ATDE ~/model]$ ls japan_mobile_v2.0_rec_infer
inference.pdiparams inference.pdiparams.info inference.pdmodel
上記のコマンドを実行することにより、Paddle Lite用の3つのモデルを用意することができます。
用意したモデルをinference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv/demo/cxx/ocr/へコピーし、Armadillo-IoT G4へ渡します。
ここではファイルを渡す方法の例として、ATDEで稼働しているlighttpdを使用して、ファイルの受け渡しを行います。
[ATDE ~]$ cp -r model/ PaddleOCR/deploy/lite/inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv/demo/cxx/ocr/
[ATDE ~]$ tar cf ocr.tar -C PaddleOCR/deploy/lite/inference_lite_lib.armlinux.armv8.gcc.with_extra.with_cv/ ./
[ATDE ~]$ ls ocr.tar
ocr.tar
[ATDE ~]$ sudo cp ocr.tar /var/www/html
Armadillo-IoT G4でOCRを実行
コンテナの作成
OCRデモ実行用にコンテナを作成します。
[armadillo ~]# podman_switch_storage --disk #ファイルの保存先をeMMCに変更
[armadillo ~]# wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/container/at-debian-image-dockerfile-v1.0.5.tar.gz
[armadillo ~]# tar xf at-debian-image-dockerfile-v1.0.5.tar.gz
[armadillo ~]# podman build -t at-debian-image at-debian-image-dockerfile-v1.0.5
[armadillo ~]# podman run -it --name=ocr \
--volume=/opt/firmware:/opt/firmware \
localhost/at-debian-image:latest /bin/bash
Paddle-Lite OCRデモの実行
必要なパッケージをインストールし、先ほどATDEで用意したocr.tarをArmadillo-IoT G4にコピーします。
[container ~]# apt install wget libopencv-dev
[container ~]# wget http://[ATDE の IP アドレス]/ocr.tar
[container ~]# tar xf ocr.tar
共有ライブラリのパスを通し、OCRデモを実行します。
[container ~]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/cxx/lib
[container ~]# cd demo/cxx/ocr
[container demo/cxx/ocr]# ./ocr_db_crnn \
system model/ch_ppocr_mobile_v2.0_det_slim_opt.nb \
model/japan_mobile_v2.0_rec_opt.nb \
model/ch_ppocr_mobile_v2.0_cls_slim_opt.nb \
armadillo \
FP32 4 1 \
debug/japan_2.jpg \
debug/config.txt \
debug/japan_dict.txt \
True
実行結果
OCRのために使用した画像に文字検出された結果は以下のようになりました。
文字検出結果とスコア・実行時間は以下のようになりました。
0 もちもち 0.999522
1 天然の 0.979182
2 とろっと、後味のよい 0.931581
3 濃厚を 0.567871
4 サクサク 0.998064
5 味わい深い 0.987407
6 なめらかな 0.998983
7 焼きたて 0.995912
8 深みのある 0.993817
9 ぶわふカ 0.483028
10 うま味のある 0.992611
11 とろーり 0.873689
12 飽きのこない、絶品 0.95012
13 警沢な 0.848828
14 ピリギ 0.738107
15 やみつきになる 0.999601
16 ふわっと 0.990078
17 香ばしい 0.98759
18 脂の乗ったサクッと 0.946312
19 コクのある 0.997202
20 カリカリ 0.996339
21 出来たて、こだわりの 揚げたて 0.922094
22 スツ“イシ 0.911247
23 とろとろ 0.996725
24 新鮮な 0.969792
25 炊きたて 0.919515
26 リッチな 0.999553
27 風味豊かな 0.994431
28 熱成した カリッと 0.921043
29 美味 0.989676
30 こんがり 0.999526
31 芳醒た 0.613251
32 口どけのよい 0.947932
33 コシのある 0.995326
34 ふんわり 0.873003
35 まろやかな 0.985168
36 産地直送 0.965039
37 パリッと、旬 0.847574
38 食べごえ 0.758072
39 クセになる 0.9987
40 秘伝の 0.978794
41 れたて、スイート ーもっちり 0.881879
42 ほくほく 0.796866
43 ジューシー 0.995521
44 本場の 0.967555
45 朝採り 0.854931
46 後味すっきり 0.998536
47 とろける 0.999824
----------------------- Config info -----------------------
runtime_device: armadillo
cpu_num_threads: 4
----------------------- Data info -----------------------
batch_size: 1
input_shape: dynamic
data_num: 1
----------------------- Model info -----------------------
model_name: ch_ppocr_mobile_v2.0_det_slim_opt.nb
precision: FP32
----------------------- Perf info ------------------------
Total time spent(ms): 401
preprocess_time(ms): 37.3934, inference_time(ms): 316.168, postprocess_time(ms): 48.5784
----------------------- Config info -----------------------
runtime_device: armadillo
cpu_num_threads: 4
----------------------- Data info -----------------------
batch_size: 1
input_shape: dynamic
data_num: 1
----------------------- Model info -----------------------
model_name: japan_mobile_v2.0_rec_slim_opt.nb
precision: FP32
----------------------- Perf info ------------------------
Total time spent(ms): 2150
preprocess_time(ms): 728.955, inference_time(ms): 1098.89, postprocess_time(ms): 324.628