ブログ

Armadillo-IoT G4でPaddleOCRを実行する

at_shiita.ishigaki
2022年6月2日 9時02分

本ブログでは、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