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