PP-OCRv6 OCRアルゴリズム実行ガイド(RV1126B)
文書情報
| 項目 | 内容 |
|---|---|
| 文書名 | PP-OCRv6 OCRアルゴリズム実行ガイド(RV1126B) |
| バージョン | v1.0 |
| 対象ボード | RV1126B開発ボード |
| 対象アルゴリズム | PP-OCRv6 OCR |
| 対象機能 | 日本語画像OCR |
| 開発環境 | Ubuntu 22.04 Docker、RKNN Toolkit2 Docker、RV1126Bボード |
| 推奨モデル | PP-OCRv6_small_det、PP-OCRv6_small_rec |
| ボードIP | 192.168.10.85 |
| ボード配置先 | /userdata/ppocrv6_ocr_demo/ |
修正履歴
| バージョン | 日付 | 内容 |
|---|---|---|
| v1.0 | 2026-06-27 | 初版作成。Docker内でPP-OCRv6日本語OCRを実行し、ONNX/RKNN変換およびRV1126Bボード実行へ進める手順を整理。 |
サンプル関連資料のダウンロード
本チュートリアルで使用するサンプルコード、モデル、テスト画像などの関連資料は、次のリンクからダウンロードできます。
1. 概要
本ガイドでは、RV1126B開発ボード上でPP-OCRv6 OCRを実行するための手順について説明します。開発PCまたはDocker環境でPaddleOCRモデルを準備し、ONNXへ変換した後、RKNN Toolkit2でRV1126B向けRKNNモデルへ変換します。ボード側では、RKNN RuntimeとC++実行プログラムにより、文字検出、文字領域切り出し、文字認識、CTC decode、結果保存を行います。
全体の流れは次のとおりです。
PP-OCRv6 smallモデルで日本語OCRを確認 ↓Paddle inference modelを固定 ↓Paddle model → ONNX ↓ONNX → RKNN(target_platform=rv1126b) ↓RV1126Bボードへモデル、辞書、C++実行ファイルを配置 ↓RKNN C APIでdet / recを実行 ↓OCR結果画像とテキストを保存RV1126B上でPaddleOCR Pythonパッケージ全体を実行するのではなく、ボード側ではRKNN Runtimeのみを使用する構成を標準とします。
2. 使用モデル
| 用途 | モデル名 | ボード側RKNNファイル | 説明 |
|---|---|---|---|
| 文字検出 | PP-OCRv6_small_det | ppocrv6_small_det_rv1126b_i8.rknn | 画像中の文字領域を検出します。 |
| 文字認識 | PP-OCRv6_small_rec | ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn | 文字行画像を日本語テキストとして認識します。 |
recモデルでは、最終Softmaxを除去したRKNNモデルを使用します。CTC decodeでは各時刻の最大クラスを使用するため、Softmax後の確率ではなくSoftmax前のlogitsを使用しても、argmaxの結果は変わりません。
3. 作業ディレクトリ
作業ディレクトリの例を次に示します。
/opt/linuxshare/work/rv1126b/jp/AI/demo/ai-algorithm/04_ocr/ppocrv6_jp_demoディレクトリ構成例は次のとおりです。
ppocrv6_jp_demo/├── samples/├── output/├── models/│ ├── paddle/│ ├── onnx/│ ├── rknn/│ └── rec/├── scripts/├── logs/└── rv1126b-src/4. Conda環境とPaddleOCRの準備
PP-OCRv6用のConda環境を作成します。
conda create -n ppocrv6 python=3.10 -yconda activate ppocrv6PaddlePaddleとPaddleOCRをインストールします。
python -m pip install --upgrade pip setuptools wheelpython -m pip install paddlepaddle==3.3.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/python -m pip install paddleocr==3.7.0インストール結果を確認します。
python - <<'PY'import paddleimport paddleocrimport sys
print("Python:", sys.version)print("Paddle:", paddle.__version__)print("PaddleOCR:", paddleocr.__version__)print("CUDA:", paddle.is_compiled_with_cuda())PY
5. 日本語OCRテスト画像
今回使用した日本語テスト画像を図1に示します。

画像は次のように配置します。
mkdir -p samplescp /path/to/jp_001.jpg ./samples/jp_001.jpg6. PaddleOCRでの日本語OCR確認
scripts/test_ppocrv6_jp.pyを作成します。
import os
os.environ["FLAGS_use_mkldnn"] = "0"os.environ["FLAGS_use_onednn"] = "0"os.environ["PADDLE_PDX_ENABLE_MKLDNN_BYDEFAULT"] = "0"os.environ["PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK"] = "True"
from paddleocr import PaddleOCR
ocr = PaddleOCR( text_detection_model_name="PP-OCRv6_small_det", text_recognition_model_name="PP-OCRv6_small_rec", use_doc_orientation_classify=False, use_doc_unwarping=False, use_textline_orientation=False, text_det_limit_side_len=736, text_det_limit_type="max", text_recognition_batch_size=1, device="cpu",)
results = ocr.predict("./samples/jp_001.jpg")
for res in results: res.print() res.save_to_img("./output") res.save_to_json("./output")実行します。
python scripts/test_ppocrv6_jp.py図3に、PaddleOCRで生成された可視化結果を示します。

7. Paddleモデルの固定
自動ダウンロードされたモデルをプロジェクト内に固定します。
mkdir -p models/paddle
cp -r ~/.paddlex/official_models/PP-OCRv6_small_det models/paddle/PP-OCRv6_small_det
cp -r ~/.paddlex/official_models/PP-OCRv6_small_rec models/paddle/PP-OCRv6_small_recrecモデルの文字辞書は、独立したtxtファイルではなくinference.yml内のPostProcess.character_dictに含まれます。ボード側C++で扱いやすくするため、1行1文字のtxtとして抽出します。
python - <<'PY'import yamlfrom pathlib import Path
yml_path = Path("./models/paddle/PP-OCRv6_small_rec/inference.yml")out_path = Path("./models/rec/ppocrv6_rec_dict.txt")out_path.parent.mkdir(parents=True, exist_ok=True)
cfg = yaml.safe_load(yml_path.read_text(encoding="utf-8"))chars = cfg["PostProcess"]["character_dict"]
out_path.write_text("\n".join(map(str, chars)) + "\n", encoding="utf-8")
print("dict:", out_path)print("chars:", len(chars))PY今回の辞書行数は次のとおりです。
18708recモデルの出力クラス数は18710です。差分の2クラスは、CTC blankとspace用の特殊クラスとして扱います。
8. Paddle modelからONNXへの変換
PaddleXのpaddle2onnxを使用してONNXへ変換します。
paddlex \ --paddle2onnx \ --paddle_model_dir ./models/paddle/PP-OCRv6_small_rec \ --onnx_model_dir ./models/onnx/PP-OCRv6_small_rec \ --opset_version 11実行例を図4に示します。

ONNXファイルは次の場所に生成されます。
models/onnx/PP-OCRv6_small_rec/inference.onnx同様に、文字検出モデルもONNXへ変換します。
paddlex \ --paddle2onnx \ --paddle_model_dir ./models/paddle/PP-OCRv6_small_det \ --onnx_model_dir ./models/onnx/PP-OCRv6_small_det \ --opset_version 119. RKNN変換環境
RKNN変換はRKNN Toolkit2 Docker内で行います。
docker run -t -i --privileged \ -v /dev/bus/usb:/dev/bus/usb \ -v /data/project/sales/csun/rv1126b/jp/AI/demo:/test \ rknn-toolkit2:2.3.2-cp38 /bin/bashコンテナ内で作業ディレクトリへ移動します。
cd /test/ai-algorithm/04_ocr/ppocrv6_jp_demoRKNN Toolkit2を確認します。
python - <<'PY'from rknn.api import RKNNprint("RKNN Toolkit2 import OK")PY10. detモデルのRKNN変換
detモデルはINT8量子化モデルを標準とします。入力は固定サイズ1 x 736 x 736 x 3です。
量子化用データセットリストを作成します。
DATASET_ROOT=./datasets/japanese_ocr_synthetic_dataset_v1_0
sed "s#^#japanese_ocr_synthetic_dataset_v1_0/# \ "${DATASET_ROOT}/labels/image_list.txt" \ > ./datasets/ppocrv6_det_calib.txtppocrv6_det_calib.txtは./datasets/内に置くため、リスト内のパスは./datasets/から見た相対パスにします。./datasets/を二重に含めると、RKNN Toolkitが./datasets/datasets/...として解釈し、画像読み込みに失敗します。
det変換スクリプトでは、動的入力を避けるため、load_onnx()に入力名と固定入力サイズを指定します。
ret = rknn.load_onnx( model="./models/onnx/PP-OCRv6_small_det/inference.onnx", inputs=["x"], input_size_list=[[1, 3, 736, 736]],)変換を実行します。
python scripts/convert_ppocrv6_det_to_rknn.py 2>&1 \ | tee logs/convert_ppocrv6_det_to_rknn.log実行例を図5に示します。

必要に応じて、精度比較用のFPモデルも変換できます。
python scripts/convert_ppocrv6_det_to_rknn_fp.py 2>&1 \ | tee logs/convert_ppocrv6_det_to_rknn_fp.log
11. recモデルのRKNN変換とSoftmax除去
最初にrecモデルを通常変換した場合、ボード上で最終Softmax実行時に失敗しました。変換ログ例を図6に示します。

ボード側の失敗箇所は次のとおりです。
op name: exSoftmax13:Softmax.2rknn_run failedONNX内のSoftmaxノードを確認します。
python - <<'PY'import onnx
model = onnx.load("./models/onnx/PP-OCRv6_small_rec/inference.onnx")
for i, node in enumerate(model.graph.node): if node.op_type == "Softmax" or "Softmax" in node.name: print("index:", i) print("op_type:", node.op_type) print("name:", node.name) print("input:", list(node.input)) print("output:", list(node.output)) print("-" * 80)PY確認結果は次のとおりです。
index: 480op_type: Softmaxname: Softmax.2input: ['p2o.pd_op.add.79.0']output: ['fetch_name_0']CTC decodeではSoftmax後の確率ではなく、Softmax前logitsのargmaxを使用しても結果は同じです。そのため、最終Softmaxを出力から外し、p2o.pd_op.add.79.0をRKNN出力にします。
scripts/convert_ppocrv6_rec_to_rknn_no_softmax.pyを作成します。
from pathlib import Pathfrom rknn.api import RKNN
ONNX_MODEL = "./models/onnx/PP-OCRv6_small_rec/inference.onnx"RKNN_MODEL = "./models/rknn/ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn"
REC_INPUT_SIZE = [1, 3, 48, 320]REC_OUTPUT_NAME = "p2o.pd_op.add.79.0"
def main(): Path("./models/rknn").mkdir(parents=True, exist_ok=True)
rknn = RKNN(verbose=True)
rknn.config( target_platform="rv1126b", mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], optimization_level=3, )
ret = rknn.load_onnx( model=ONNX_MODEL, inputs=["x"], input_size_list=[REC_INPUT_SIZE], outputs=[REC_OUTPUT_NAME], ) if ret != 0: raise RuntimeError("load_onnx failed")
ret = rknn.build(do_quantization=False) if ret != 0: raise RuntimeError("build failed")
ret = rknn.export_rknn(RKNN_MODEL) if ret != 0: raise RuntimeError("export_rknn failed")
rknn.release() print("done:", RKNN_MODEL)
if __name__ == "__main__": main()変換を実行します。
python scripts/convert_ppocrv6_rec_to_rknn_no_softmax.py 2>&1 \ | tee logs/convert_ppocrv6_rec_to_rknn_no_softmax.log実行例を図8に示します。

生成されるモデルは次のとおりです。
models/rknn/ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn12. RV1126Bボードのマウント
RV1126B開発ボードのIPは192.168.10.85です。ホストPC側でボードのルートファイルシステムをNFSマウントします。
sudo umount -l /mnt 2>/dev/null
sudo mount -t nfs \ -o vers=3,proto=tcp,mountproto=tcp,nolock,retrans=5,timeo=5 \ 192.168.10.85:/ /mntマウント後、/mnt/userdata/経由でボードへファイルを配置できます。
13. ボード側RKNN Runtimeの扱い
本環境では、ボード側にRKNN Runtimeが既に配置されています。
/usr/lib/librknnrt.so/usr/lib/librknn_api.soそのため、デモディレクトリへlibrknnrt.soを個別にコピーしません。古いライブラリを./libへ配置してLD_LIBRARY_PATHで優先ロードすると、既存の正常な実行環境を壊す可能性があります。
ボード側で確認します。
find / -name 'librknn*.so*' 2>/dev/null実行時は、ボードシステム側の/usr/lib/librknnrt.soを使用します。
14. ボード側配置構成
ボード側の配置先は次のとおりです。
/userdata/ppocrv6_ocr_demo/├── bin/│ ├── test-rknn-model-smoke│ └── test-ppocrv6-ocr├── model/│ ├── ppocrv6_small_det_rv1126b_i8.rknn│ └── ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn├── dict/│ └── ppocrv6_rec_dict.txt└── test/ ├── jp_001.jpg ├── ocr_result.txt ├── ocr_result.jpg └── crops/モデルと辞書をコピーします。
sudo mkdir -p /mnt/userdata/ppocrv6_ocr_demo/{model,dict,test,bin}
sudo cp models/rknn/ppocrv6_small_det_rv1126b_i8.rknn \ /mnt/userdata/ppocrv6_ocr_demo/model/
sudo cp models/rknn/ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn \ /mnt/userdata/ppocrv6_ocr_demo/model/
sudo cp models/rec/ppocrv6_rec_dict.txt \ /mnt/userdata/ppocrv6_ocr_demo/dict/
sudo cp samples/jp_001.jpg \ /mnt/userdata/ppocrv6_ocr_demo/test/15. C++実行プログラムの構成
ボード側C++コードは、1つのbuild.shで2つの実行ファイルを生成する構成にします。
rv1126b-src/├── build.sh├── CMakeLists.txt└── src/ ├── rknn_model_smoke_test.cc └── ppocrv6_ocr_demo.cc生成される実行ファイルは次の2つです。
| 実行ファイル | 用途 |
|---|---|
test-rknn-model-smoke | .rknnモデルがボード上でrknn_init、rknn_runできるか確認します。 |
test-ppocrv6-ocr | 画像読み込み、det推論、crop、rec推論、CTC decode、結果保存を行います。 |
build.shはCURRENT_FOLDER=binを使用し、生成物を$SYSROOT/userdata/ppocrv6_ocr_demo/bin/へコピーします。
./build.sh生成後の確認例です。
ls -lh Releasels -lh /mnt/userdata/ppocrv6_ocr_demo/bin/16. detモデルのsmoke test
ボード上でdetモデルをテストします。
cd /userdata/ppocrv6_ocr_demo
./bin/test-rknn-model-smoke \ ./model/ppocrv6_small_det_rv1126b_i8.rknn図9に実行結果を示します。

確認された入出力は次のとおりです。
input: 1 x 736 x 736 x 3, INT8, NHWCoutput: 1 x 1 x 736 x 736, INT8, NCHWrknn_run OKmodel smoke test OK17. rec no-softmaxモデルのsmoke test
ボード上でrec no-softmaxモデルをテストします。
cd /userdata/ppocrv6_ocr_demo
./bin/test-rknn-model-smoke \ ./model/ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn図10に実行結果を示します。

確認された入出力は次のとおりです。
input: 1 x 48 x 320 x 3, FLOAT16, NHWCoutput: 1 x 40 x 18710, FLOAT16rknn_run OKmodel smoke test OK18. ボード側OCR実行
ボード上で端末側OCRプログラムを実行します。
cd /userdata/ppocrv6_ocr_demo
./bin/test-ppocrv6-ocr \ ./model/ppocrv6_small_det_rv1126b_i8.rknn \ ./model/ppocrv6_small_rec_rv1126b_fp_no_softmax.rknn \ ./dict/ppocrv6_rec_dict.txt \ ./test/jp_001.jpg \ ./test実行ログを図11、図12に示します。


出力ファイルは次のとおりです。
/userdata/ppocrv6_ocr_demo/test/ocr_result.txt/userdata/ppocrv6_ocr_demo/test/ocr_result.jpg/userdata/ppocrv6_ocr_demo/test/crops/19. ボード側OCR結果
今回のボード側実行では、53個のテキスト領域が検出されました。代表的な認識結果を次に示します。
| 番号 | 認識結果 |
|---|---|
| 0 | もちもち |
| 1 | とろっと、後味のよい |
| 2 | 天然の |
| 7 | 焼きたて |
| 10 | うま味のある |
| 12 | 飽きのこない |
| 23 | スパイシー |
| 37 | ふんわり |
| 51 | 後味すっきり |
| 52 | とろける |
図13に、ボード側で保存したOCR可視化結果を示します。

ocr_result.txtの一部を次に示します。
0 667 58 187 53 0.945086 もちもち1 855 64 460 99 0.891344 とろっと、後味のよい2 400 81 135 49 0.932682 天然の7 922 148 314 82 0.935921 焼きたて10 100 200 483 103 0.950072 うま味のある37 409 505 389 105 0.917636 ふんわり51 496 732 285 64 0.951753 後味すっきり52 828 768 97 34 0.925347 とろける20. 現在の精度評価
v1.1時点で、端末側のPP-OCRv6実行チェーンは正常に動作しています。
det RKNN推論:成功rec no-softmax RKNN推論:成功CTC decode:成功結果テキスト保存:成功結果画像保存:成功一方で、次の改善点があります。
| 項目 | 現象 | 対応方針 |
|---|---|---|
| 文字認識 | 口どけのよいがロどけのよいになる場合があります。 | crop品質、認識モデル、辞書後処理を確認します。 |
| 検出枠 | 近接する複数語が1つの枠に結合される場合があります。 | PaddleOCR準拠のDB postprocessへ置き換えます。 |
| 後処理 | v1.1のC++検出後処理は簡易版です。 | box_score_fast、unclip、rotated box処理を追加します。 |
21. 製品レベル精度に向けたデータセットと追加学習方針
v1.4では、単なる評価方針だけではなく、実際に学習データを作成し、PaddleOCR系の検出モデル・認識モデルを追加学習できる構成まで整理します。
製品レベル精度を目指す場合、公開データセットだけで完結させるのではなく、次の3種類のデータを組み合わせます。
公開データセット ↓日本語・多言語OCRとしての基礎性能を確認
合成データ ↓不足文字、フォント、縦書き、低照度、反射、ぼかし条件を補強
RV1126B実機撮影データ ↓実レンズ、露光、焦点距離、圧縮ノイズ、設置角度、照明条件に最適化特にRV1126B製品では、最終的な精度はPC上の静止画像ではなく、実際のカメラ、照明、設置距離、画像圧縮条件に強く依存します。そのため、公開データセットは基礎評価と事前学習の補助として使用し、最終精度は必ず実機撮影データで評価します。
21.1 公共データセットとダウンロードリンク
以下のデータセットは、製品開発時の基礎評価、追加学習、または汎化性能確認に利用できます。実際に利用する前に、各データセットのライセンス、研究利用・商用利用条件、再配布可否を必ず確認してください。
| 用途 | データセット | ダウンロードまたは参照先 | 推奨用途 |
|---|---|---|---|
| 多言語自然シーンOCR | ICDAR 2019 MLT | ICDAR 2019 RRC MLT Downloads | 多言語、複雑背景、傾き、低解像度文字を含む検出・認識評価。ダウンロードにはRRCへの登録が必要です。 |
| 日本語シーン文字 | JPSC1400 | JPSC1400 Dataset Page / JPSC1400-20201218.zip | 実環境で撮影された日本語文字画像による認識評価。文字単位評価や弱点文字分析に向いています。 |
| 日本語文書OCR | NDL古典籍OCR学習用データセット | ndl-lab/ndl-minhon-ocrdataset | 日本語文書、縦書き、古典籍、劣化文書に対する参考データ。製品用途とは対象が異なるため、直接混合せず評価用または補助用とします。 |
| 日本語文字分類 | Kuzushiji / KMNIST 系列 | Kuzushiji Dataset | ひらがな・漢字の文字単位認識や文字混同分析の参考。PP-OCRの行認識学習には変換が必要です。 |
| 日本語文字画像 | ETL Character Database | ETL Character Database | 手書き・印刷日本語文字の基礎評価、文字単位の混同分析、合成データ生成時の参考。 |
公開データセットを使う場合でも、製品用OCRでは次のように扱います。
公開データセットだけで最終モデルを決めない公開データセットは事前評価・弱点把握・補助学習に使う製品判定はRV1126B実機撮影データで行う量子化校正データも実機撮影画像を中心に作成する21.2 RV1126B実機撮影データの収集方針
製品精度を上げるうえで最も重要なのは、実際に製品が見る画像を収集することです。最低限、次の条件を含めます。
| 条件 | 推奨内容 |
|---|---|
| 撮影距離 | 近距離、中距離、最大運用距離 |
| 角度 | 正面、上下傾き、左右傾き、斜め撮影 |
| 照明 | 明るい環境、暗所、逆光、反射、局所照明 |
| 文字サイズ | 大文字、通常文字、小文字、細字 |
| 背景 | 白背景、色付き背景、食品包装、金属、透明フィルム、印刷ムラ |
| ブレ | ピンぼけ、動体ブレ、手持ちブレ |
| 圧縮 | カメラ出力JPEG、ストリームからの切り出し画像 |
| 設置差 | 個体差、レンズ差、焦点距離差、筐体越し撮影 |
推奨枚数は次のとおりです。
| 目的 | 推奨枚数 |
|---|---|
| 初期検証 | 200〜500枚 |
| det追加学習 | 500枚以上 |
| rec追加学習 | crop画像5,000枚以上 |
| 製品評価 | 1,000枚以上 |
| 量子化校正 | 実機撮影画像200〜500枚 |
実機撮影画像は、次のようなディレクトリに保存します。
datasets/ppocr_product/raw/rv1126b/├── train/│ ├── normal/│ ├── low_light/│ ├── reflection/│ ├── blur/│ └── small_text/├── eval/│ ├── normal/│ ├── low_light/│ ├── reflection/│ ├── blur/│ └── small_text/└── README.md22. アノテーション方針と推奨ツール
22.1 推奨アノテーションツール
PaddleOCR系モデルの追加学習では、まずPPOCRLabelを推奨します。PPOCRLabelはOCR向けの半自動アノテーションツールで、検出ラベルLabel.txt、認識ラベルrec_gt.txt、認識用crop画像crop_img/を出力できます。
| ツール | 用途 | 備考 |
|---|---|---|
| PPOCRLabel | OCR検出・認識ラベル作成 | 最優先。PaddleOCR / PaddleX形式に近く、検出と認識を同時に整理できます。 |
| labelme | 不規則形状やポリゴン修正 | 複雑な領域を扱う場合の補助。PaddleOCR形式への変換が必要です。 |
| CVAT | チームアノテーション | 複数人でのレビュー、権限管理、品質管理に向いています。 |
| 自社Webツール | 製品専用ワークフロー | 量産時の再学習データ収集に向いています。 |
PPOCRLabelのインストール例を示します。
conda activate ppocrv6
python -m pip install PPOCRLabelpython -m pip install trash-cli起動例は次のとおりです。
PPOCRLabel --kie True起動後、画像フォルダを開き、検出枠と認識文字列を確認・修正します。作業終了時には、検出用Label.txtと認識用rec_gt.txtを必ず出力します。
22.2 PPOCRLabel出力ファイル
PPOCRLabel作業フォルダの例を示します。
datasets/ppocr_product/label_projects/rv1126b_jp_001/├── images/│ ├── jp_000001.jpg│ ├── jp_000002.jpg│ └── ...├── Label.txt├── fileState.txt├── Cache.cach├── rec_gt.txt└── crop_img/ ├── jp_000001_crop_0.jpg ├── jp_000001_crop_1.jpg └── ...検出ラベルLabel.txtは、1行に画像パスとJSON形式の検出結果を保持します。
images/jp_000001.jpg [{"transcription":"後味すっきり","points":[[496,732],[781,732],[781,796],[496,796]],"difficult":false}]認識ラベルrec_gt.txtは、1行にcrop画像パスと認識文字列を保持します。
crop_img/jp_000001_crop_0.jpg 後味すっきりcrop_img/jp_000001_crop_1.jpg とろける注意点は次のとおりです。
画像パスとラベルの区切りは必ずタブにする日本語ラベルはUTF-8で保存する空白文字、長音、句読点、全角半角の表記ゆれを統一する読めない文字は無理に推測せず、difficultまたは除外対象にする23. 学習用ディレクトリ構成
PaddleOCR学習用には、PPOCRLabelの作業フォルダをそのまま使うのではなく、検出用と認識用に分けた学習ディレクトリを作成します。
train_data/japanese_ocr/├── det/│ ├── images/│ │ ├── train/│ │ └── val/│ ├── train_label.txt│ └── val_label.txt├── rec/│ ├── images/│ │ ├── train/│ │ └── val/│ ├── rec_gt_train.txt│ └── rec_gt_val.txt└── dict/ └── ppocr_japanese_product_dict.txt検出学習用ラベル例は次のとおりです。
images/train/jp_000001.jpg [{"transcription":"後味すっきり","points":[[496,732],[781,732],[781,796],[496,796]],"difficult":false}]認識学習用ラベル例は次のとおりです。
images/train/jp_000001_crop_0.jpg 後味すっきり認識辞書ppocr_japanese_product_dict.txtは、学習ラベル内に出現する文字をすべて含めます。既存のPP-OCRv6_small_recのcharacter_dictをベースにする場合は、文字順を維持し、不足文字だけを慎重に追加します。文字順を変更すると、既存重みとの対応が崩れる可能性があります。
24. PPOCRLabelデータから学習データを作成するスクリプト
次のスクリプトは、PPOCRLabel作業フォルダから検出学習用ラベル、認識学習用ラベル、認識辞書を作成します。パッケージ内のtraining-scripts/prepare_ppocr_dataset.pyとして同梱しています。
python training-scripts/prepare_ppocr_dataset.py \ --ppocrlabel_dir datasets/ppocr_product/label_projects/rv1126b_jp_001 \ --out_dir train_data/japanese_ocr \ --val_ratio 0.1 \ --seed 42生成後、次を確認します。
tree train_data/japanese_ocr -L 3
head -n 3 train_data/japanese_ocr/det/train_label.txthead -n 3 train_data/japanese_ocr/rec/rec_gt_train.txtwc -l train_data/japanese_ocr/dict/ppocr_japanese_product_dict.txt複数のアノテーションプロジェクトを統合する場合は、--ppocrlabel_dirに複数パスを指定できます。
python training-scripts/prepare_ppocr_dataset.py \ --ppocrlabel_dir \ datasets/ppocr_product/label_projects/rv1126b_jp_001 \ datasets/ppocr_product/label_projects/rv1126b_jp_002 \ --out_dir train_data/japanese_ocr \ --val_ratio 0.125. 検出モデルの追加学習
検出モデルは、文字領域の位置がずれる、複数単語が結合される、小さい文字が漏れる場合に追加学習します。
PaddleOCRリポジトリを準備します。
mkdir -p third_partycd third_party
git clone https://github.com/PaddlePaddle/PaddleOCR.gitcd PaddleOCR
python -m pip install -r requirements.txt使用可能な検出設定ファイルを確認します。
find configs -iname "*det*.yml" | sort | grep -E "OCRv5|OCRv4|OCRv3|DB"PP-OCRv6の学習用設定ファイルが現在の環境で公開されている場合は、それを使用します。存在しない場合は、PP-OCRv5またはPP-OCRv4のDB検出設定をベースにしてfine-tuneします。実際の設定ファイル名はPaddleOCRのバージョンで異なるため、必ずfind結果で確認します。
学習コマンド例を示します。パッケージ内のtraining-scripts/train_det.shも同じ方針で作成しています。
cd third_party/PaddleOCR
DET_CONFIG=configs/det/PP-OCRv5/PP-OCRv5_server_det.yml \DATA_ROOT=../../train_data/japanese_ocr \SAVE_DIR=../../output/train/det_product \bash ../../training-scripts/train_det.shtrain_det.shでは、主に次の項目を上書きします。
Global.save_model_dirTrain.dataset.data_dirTrain.dataset.label_file_listEval.dataset.data_dirEval.dataset.label_file_listOptimizer.lr.learning_rate単一GPUまたは小規模データでfine-tuneする場合、学習率は小さめに設定します。
初期候補:1e-4不安定な場合:5e-5非常に小さいデータの場合:1e-5〜2e-526. 認識モデルの追加学習
認識モデルは、口とロ、長音、ひらがな・カタカナ、細字、小文字、装飾フォントなどで誤認識が出る場合に追加学習します。
使用可能な認識設定ファイルを確認します。
cd third_party/PaddleOCR
find configs -iname "*rec*.yml" | sort | grep -E "OCRv5|OCRv4|OCRv3|SVTR"認識モデルの追加学習コマンド例を示します。
cd third_party/PaddleOCR
REC_CONFIG=configs/rec/PP-OCRv5/PP-OCRv5_server_rec.yml \DATA_ROOT=../../train_data/japanese_ocr \SAVE_DIR=../../output/train/rec_product \DICT_PATH=../../train_data/japanese_ocr/dict/ppocr_japanese_product_dict.txt \bash ../../training-scripts/train_rec.sh認識学習で重要な項目は次のとおりです。
| 項目 | 内容 |
|---|---|
character_dict_path | 学習用辞書。ラベル中の全文字を含めます。 |
use_space_char | 空白を認識対象に含める場合は有効にします。 |
rec_image_shape | 本プロジェクトでは最終的に3,48,320へ合わせます。 |
max_text_length | 長い文字列を扱う場合は十分な長さにします。 |
| 学習率 | 追加学習では小さめにします。 |
注意点として、既存のPP-OCRv6認識モデルの出力クラス数は本プロジェクトで18710です。辞書を大きく変更した場合、最終分類層の次元が変わるため、既存重みをそのまま流用できない場合があります。製品追加学習では、まず既存辞書範囲内の文字で精度改善し、必要な場合だけ辞書拡張を検討します。
27. 学習後モデルの評価
学習後は、PC上とRV1126B上の両方で評価します。
PC側評価項目は次のとおりです。
det precision / recall / hmeanrec accuracyend-to-end OCR exact match文字単位正解率低照度、反射、ぼけ、小文字条件別の正解率PaddleOCR評価コマンド例を示します。
cd third_party/PaddleOCR
python tools/eval.py \ -c configs/rec/PP-OCRv5/PP-OCRv5_server_rec.yml \ -o Global.checkpoints=../../output/train/rec_product/best_accuracy製品評価では、集計表を次のように分けます。
| 評価セット | 内容 |
|---|---|
public_eval | 公開データセットから作成した評価セット |
rv1126b_eval_normal | 通常照明の実機撮影 |
rv1126b_eval_low_light | 暗所・低照度 |
rv1126b_eval_reflection | 反射・光沢面 |
rv1126b_eval_blur | ピンぼけ・動体ブレ |
rv1126b_eval_small_text | 小文字・遠距離 |
28. 学習済みモデルのエクスポートとRKNN変換
追加学習後、Paddle inference modelへエクスポートします。
検出モデルのエクスポート例です。
cd third_party/PaddleOCR
python tools/export_model.py \ -c configs/det/PP-OCRv5/PP-OCRv5_server_det.yml \ -o Global.checkpoints=../../output/train/det_product/best_accuracy \ Global.save_inference_dir=../../models/paddle/product_det認識モデルのエクスポート例です。
python tools/export_model.py \ -c configs/rec/PP-OCRv5/PP-OCRv5_server_rec.yml \ -o Global.checkpoints=../../output/train/rec_product/best_accuracy \ Global.save_inference_dir=../../models/paddle/product_recその後、本ガイド前半と同じ流れでONNXへ変換します。
paddlex \ --paddle2onnx \ --paddle_model_dir ./models/paddle/product_rec \ --onnx_model_dir ./models/onnx/product_rec \ --opset_version 11RV1126B向けRKNNへ変換するときは、次を守ります。
det:実機撮影画像を中心にしたdatasetリストでINT8量子化rec:まずFP no-softmaxで変換し、動作と精度を確認rec量子化:精度劣化を評価してから採用判断29. 量子化校正データの作成
detのINT8量子化では、量子化校正データが精度に大きく影響します。公開データセットだけでなく、RV1126B実機撮影画像を必ず含めます。
推奨構成は次のとおりです。
datasets/ppocr_product/calib/├── normal/├── low_light/├── reflection/├── blur/└── small_text/RKNN用datasetファイルを作成します。
find datasets/ppocr_product/calib -type f \ \( -iname "*.jpg" -o -iname "*.png" \) \ | sort \ | sed "s#^datasets/##" \ > datasets/ppocrv6_product_det_calib.txtdatasets/ppocrv6_product_det_calib.txtを./datasets/配下に置く場合、リスト内の相対パスは./datasets/を基準にします。以前確認したとおり、datasets/datasets/...にならないように注意します。
30. 製品精度改善の運用フロー
製品投入後も、誤認識画像を継続的に回収し、再学習に回します。
RV1126BでOCR実行 ↓低信頼・誤認識・未検出画像を保存 ↓PPOCRLabelで再確認・修正 ↓train_dataへ追加 ↓det / recをfine-tune ↓ONNX / RKNN変換 ↓実機評価 ↓製品モデルとして採用保存すべき失敗例は次のとおりです。
検出漏れ複数語の結合文字領域の切れ口 / ロ、日 / 目、ー / 一 などの混同小文字の誤認識反射や低照度による誤認識31. 本ドキュメント完了条件
本ドキュメントでは、次の状態を完了条件とします。
公共データセットの入手先を確認できるPPOCRLabelで検出・認識ラベルを作成できるPPOCRLabel出力からPaddleOCR学習用ディレクトリを生成できるdet / recの追加学習コマンドを実行できる学習済みモデルをPaddle inference modelへエクスポートできるONNX / RKNN変換の既存手順へ接続できるRV1126B実機撮影データを評価・量子化校正に利用できる32. 製品開発に向け改善項目
製品開発では、次の改善を行います。
| 優先度 | 改善項目 |
|---|---|
| 1 | PaddleOCR準拠のDB postprocess実装 |
| 2 | cropの透視変換と回転文字対応 |
| 3 | 認識スコア計算と低信頼結果のフィルタリング |
| 4 | PPOCRLabel出力からの自動品質チェック |
| 5 | 実機撮影データの評価レポート自動生成 |
| 6 | 学習済みモデルのONNX / RKNN変換をCI化 |
| 7 | INT8量子化前後の精度差分レポート作成 |