日本ナンバープレート認識実装ガイド(RV1126B)
文書情報
| 文書名 | 日本ナンバープレート認識実装ガイド(RV1126B) |
| バージョン | v1.0 |
| 対象ボード | RV1126B開発ボード |
| 対象用途 | 駐車場、施設出入口、低速ゲート、固定カメラ環境における日本ナンバープレート認識 |
| 対象外用途 | 高速道路取締、警察・行政向け高速撮影、遠距離・高速度車両認識 |
| 検証方式 | V1で検証済みのPP-YOLOE-s plate detectionを前段に位置付け、V2ではROI画像を入力としてplate corner、PP-OCRv6、parser、kana fallback、RKNN Runtime検証を行います。 |
| ボード配置先 | /userdata/Demo/rv1126b_jp_lpr_v2/ |
| 補足資料 | 資料パッケージ内のREADME.mdを参照してください。 |
修正履歴
| バージョン | 日付 | 内容 |
|---|---|---|
| v1.0 | 2026/07/08 | 初版。V1で検証済みのPP-YOLOE-s plate detectionをV2製品構成へ統合し、ROI入力によるV2認識検証、PP-OCRv6 RKNN変換、C++ RKNN Runtime実行、18枚ROI評価、データ準備方針、README参照、参考資料を整理。 |
1. 概要
本ガイドでは、RV1126B開発ボード上で日本ナンバープレート認識を実行するためのV2検証構成について説明します。対象市場は、高速道路上の取締用途ではなく、駐車場、施設出入口、月極駐車場、コインパーキング、物流施設ゲートなど、低速・近距離・固定カメラ条件で利用するナンバープレート認識システムです。
V2の最終製品構成では、車両全体画像からナンバープレートを検出し、plate ROIを切り出し、必要に応じて四隅推定と透視補正を行った後、PP-OCRv6認識と日本ナンバープレート向け後処理を行います。ただし、本ドキュメントで扱うV2検証では、認識パイプラインの妥当性を明確に評価するため、入力をすでに切り出されたplate ROI画像に限定しました。
このため、V2検証時の主な処理は次のとおりです。
plate ROI画像 ↓plate_corner.rknn ↓OpenCV warpPerspective ↓ppocrv6_det.rknn + ppocrv6_rec.rknn ↓日本ナンバープレートparser ↓kana fallback ↓multi-frame voting ↓final plate number
図1-1 V2検証ワークフロー
資料ダウンロード
本チュートリアルで使用するソースコード、設定ファイル、モデル変換スクリプト、RV1126Bボード配置例、検証用ROI画像、辞書、READMEは、次の資料パッケージにまとめています。
資料パッケージには、V2検証用のrv1126b_jp_lpr_v2プロジェクトが含まれます。具体的には、C++ RKNN Runtime検証コード、plate_corner.rknn、PP-OCRv6 det/recのPaddle inference model・ONNX・RKNN変換スクリプト、辞書、ROI検証サンプル、PC側ラベル確認GUI、ボード側実行スクリプトを含みます。詳しいディレクトリ構成と検証手順は、同梱のREADME.mdを参照してください。
2. 日本ナンバープレートの表示項目
日本のナンバープレートでは、車両を識別するために主に次の4項目が表示されます。
| 項目 | 例 | 説明 |
|---|---|---|
| 地域名 | 品川、横浜、春日井、いわき | 運輸支局、自動車検査登録事務所、地域名を示します。 |
| 分類番号 | 330、580、649 | 自動車の種別および用途による分類を示します。近年は数字だけでなく一部ローマ字を含む場合があります。 |
| かな文字 | さ、す、ぬ、た | 自家用、事業用、貸渡用などの用途区分を示します。 |
| 一連指定番号 | 11-11、59-78、90-97 | 4桁以下の番号です。表示上は中央点やハイフンを含みます。 |
製品側では、単なるOCR文字列ではなく、次のような構造化結果として扱います。
{ "region": "春日井", "class_no": "649", "kana": "ぬ", "serial": "59-78", "final_plate_number": "春日井 649 ぬ 59-78", "valid": true}3. 一般OCRとの違い
PP-OCRv6の日本語OCRモデルは、文章画像、看板、印刷物、自然シーン文字に対して有効ですが、日本ナンバープレート認識では次の問題が起きやすくなります。
| 項目 | 一般OCRで起きやすい問題 | V2での対応 |
|---|---|---|
| レイアウト | 上段と下段が1つの文字列として結合される | ROI、上段、下段、かな領域など複数cropを生成して候補を統合します。 |
| 文字サイズ差 | 大きい番号だけ強く認識され、小さい地域名や分類番号が不安定になる | 地域名辞書、分類番号ルール、serial形式ルールで補正します。 |
| 斜め撮影 | 文字行が歪み、認識精度が低下する | plate_corner.rknnとwarpPerspectiveで透視補正します。 |
| かな文字 | 小さいかなが数字や漢字に誤認識される | kana fallback、direct evidence優先、kana-constrained CTCを使用します。 |
| 構文 | OCR結果にあり得ない文字列が混ざる | 地域名リスト、かなリスト、分類番号、serial形式で検証します。 |
| 製品運用 | 誤認識がそのまま業務結果になる | 低信頼結果を保存し、再学習・レビュー対象にします。 |
4. 最終推奨モデル構成(PP-YOLOE-s + plate corner + PP-OCRv6)
RV1126B向けの最終推奨構成は、V1で検証したPP-YOLOE-s plate detectionを前段に置き、V2で検証したROI認識パイプラインを後段に置く構成です。
| 用途 | 推奨モデル / 処理 | ボード側ファイル | 本版での扱い |
|---|---|---|---|
| ナンバープレート検出 | PP-YOLOE-s | plate_det.rknn | V1で学習・変換・ボード実行を検証済み。本V2検証ではROI入力に簡略化したため、実行対象から外しています。 |
| plate ROI切り出し | C++ OpenCV | - | full-frame製品版ではPP-YOLOE-sのbboxから切り出します。 |
| 四隅推定 | 軽量cornerモデル | plate_corner.rknn | V2検証対象です。 |
| 透視補正 | OpenCV warpPerspective | - | V2検証対象です。 |
| OCR文字検出 | PP-OCRv6 det | ppocrv6_det.rknn | V2検証対象です。 |
| OCR文字認識 | PP-OCRv6 rec pre-softmax | ppocrv6_rec.rknn | V2検証対象です。 |
| 後処理 | C++ parser / kana fallback / voting | - | V2検証対象です。 |
| 将来改善 | kana-only recognizer / classifier | kana_rec.rknnなど | 次段階の製品改善項目です。 |
V1では、PP-YOLOE-sを用いたplate_detの学習、Paddle inference model export、ONNX変換、RKNN変換、RV1126B上の推論確認までを実施しました。V2では、検出済みROIが得られている前提で、認識パイプラインの品質とボード上の実行可能性を集中的に検証しています。
製品版では、次のようにV1のPP-YOLOE-s検出をV2認識パイプラインの前に接続します。
full-frame camera image ↓PP-YOLOE-s plate_det.rknn ↓plate ROI crop ↓plate_corner.rknn ↓warpPerspective ↓PP-OCRv6 det / rec ↓parser / kana fallback / voting ↓final plate number5. Conda環境とPaddleOCRの準備
PP-OCRv6用のConda環境を作成します。
conda create -n ppocrv6 python=3.10 -yconda activate ppocrv6python -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-1 Conda環境一覧

図5-2 PP-OCRv6環境確認
PaddlePaddle 3.x CPU環境では、oneDNN / PIR互換性問題により次のようなエラーが出る場合があります。
ConvertPirAttribute2RuntimeAttribute not support [pir::ArrayAttribute<pir::DoubleAttribute>]この場合、PaddleOCRをimportする前に次の環境変数を設定します。
export FLAGS_use_mkldnn=0export FLAGS_use_onednn=0export PADDLE_PDX_ENABLE_MKLDNN_BYDEFAULT=0export PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK=TruePP-OCRv6のPaddle inference modelは、次の3ファイルを含む必要があります。
models/paddle/ppocrv6/det/├── inference.json├── inference.pdiparams└── inference.yml
models/paddle/ppocrv6/rec/├── inference.json├── inference.pdiparams└── inference.ymlinference.ymlが存在しない場合、PaddleOCR 3.xのpipeline APIはFileNotFoundErrorで初期化に失敗します。
6. データ収集方針
製品精度を達成するうえで最も重要なのは、実際の運用環境で撮影した画像を十分に集めることです。公開データや合成データだけで最終モデルを決めず、必ずRV1126B実機、実レンズ、実照明、実設置条件で撮影したデータを評価と量子化校正に使用します。
推奨データ構成を次に示します。
| データ種別 | 目的 | 推奨枚数 |
|---|---|---|
| 初期確認用ROI画像 | OCR、parser、kana fallbackの誤認識傾向確認 | 100〜500枚 |
| plate detection学習用 | full-frame画像からナンバープレートを検出 | 3,000〜10,000枚以上 |
| plate corner学習用 | 四隅推定と透視補正 | 3,000枚以上 |
| OCR認識用plate ROI / crop | 地域名、分類番号、かな、番号の認識 | 10,000〜50,000件以上 |
| 合成プレート画像 | 地域名・かな・番号の不足パターン補強 | 50,000〜200,000枚 |
| 製品評価用holdout | 最終採用判定 | 3,000〜10,000枚以上 |
| RKNN量子化校正用 | INT8量子化の分布合わせ | 500〜1,000枚 |
実機撮影では、昼夜、逆光、反射、斜め、汚れ、ナンバーフレーム、軽自動車、事業用車両、図柄入りナンバーを含めます。
公開データとV2検証データ
V2検証では、V1の公開データ処理フローで得られたplate ROIを利用し、追加評価用にreal_004.jpgからreal_018.jpgまでの15枚を抽出しました。初期3枚real_001.jpg〜real_003.jpgと合わせて、最終的に18枚のROI画像で板端C++ RKNN Runtime検証を行いました。

図6-1 データセット取得環境確認

図6-2 Roboflow由来データ取得確認
公開データからの変換や短縮ファイル名化、plate ROI生成は、V1のtraining-scriptsおよびV2のtools / scriptsを組み合わせて行います。資料パッケージでは、V2検証に必要なサンプルROIと変換済みデータを同梱しています。公開データ全体を再取得する場合は、training-scripts/のダウンロード・変換スクリプトを使用してください。
7. データディレクトリ構成
V2資料パッケージの主要なデータ構成は次のとおりです。
rv1126b_jp_lpr_v2/├── samples/real_lpr/│ ├── real_001.jpg│ ├── real_002.jpg│ ├── real_003.jpg│ ├── ...│ ├── real_018.jpg│ └── real_lpr_expected.csv├── datasets/│ ├── raw/synthetic_plate/│ ├── train_data/jp_plate_v2/│ │ ├── plate_roi/images/│ │ └── rectified/images/│ └── manifests/├── data/calib/│ ├── plate_corner/│ └── ppocrv6/└── models/ ├── paddle/ppocrv6/ ├── onnx/ └── rknn/real_lpr_expected.csvの基本形式は次のとおりです。
image_path,expectedsamples/real_lpr/real_001.jpg,下関 500 す 45-36samples/real_lpr/real_002.jpg,長崎 300 は 725複数フレーム投票を使用する場合は、3列形式に拡張できます。
image_path,expected,group_idsamples/real_lpr/car001_f001.jpg,春日井 649 ぬ 59-78,car001samples/real_lpr/car001_f002.jpg,春日井 649 ぬ 59-78,car0018. アノテーション方針
V2の最終製品化では、最低限次のラベルを管理します。
| ラベル | 内容 | 推奨形式 |
|---|---|---|
plate_bbox | ナンバープレート全体の矩形 | COCO xywhまたはJSONL絶対座標 |
plate_quad | ナンバープレート四隅 | 左上、右上、右下、左下 |
expected | 完全な車牌文字列 | 地域名 分類番号 かな 一連指定番号 |
region | 地域名 | 辞書照合可能な文字列 |
class_no | 分類番号 | 3桁数字または許可ローマ字を含む文字列 |
kana | かな文字 | 使用可能かなリスト内の1文字 |
serial | 一連指定番号 | 12-34、725など |
V2のROI検証では、plate bboxや四隅の学習アノテーションではなく、samples/real_lpr/real_lpr_expected.csvによる最終文字列評価を中心にしました。これは、認識パイプラインを簡潔に評価するためです。
9. アノテーションツールとラベル確認GUI
少量データでは、Web GUIを使用してROI画像と自動OCR候補を確認し、expectedを手動で修正します。

図9-1 PC側Web GUIによる候補ラベル確認
V2資料パッケージには、次のツールを含めています。
| ツール | 用途 |
|---|---|
tools/plate_bbox_qc_web.py | 画像表示、bbox描画、expected入力、CSV保存を行います。 |
tools/label_real_lpr_expected_paddleocr6_gui.py | PC側PaddleOCR6で自動下書き認識し、Web GUIで人手確認します。 |
tools/extract_real_lpr_samples_004_018.py | 追加ROIサンプルをreal_004.jpg〜real_018.jpgとして抽出します。 |
PC側GUIを起動する例を示します。
export FLAGS_use_mkldnn=0export FLAGS_use_onednn=0export PADDLE_PDX_ENABLE_MKLDNN_BYDEFAULT=0
python tools/label_real_lpr_expected_paddleocr6_gui.py --csv samples/real_lpr/real_004_018_expected_template.csv --output samples/real_lpr/real_004_018_expected_filled.csv --auto-ocr --det-model-dir models/paddle/ppocrv6/det --rec-model-dir models/paddle/ppocrv6/rec --det-model-name PP-OCRv6_small_det --rec-model-name PP-OCRv6_small_rec --rec-dict dict/ppocrv6_rec_dict.txt --region-dict dict/region_words.txt --host 0.0.0.0 --port 786010. 合成データ作成方針
実機データだけでは、全国の地域名、分類番号、かな、番号パターンを十分に網羅することが難しいため、合成データを併用します。V2プロジェクトにはdatasets/raw/synthetic_plate/とdatasets/train_data/jp_plate_v2/が含まれ、合成プレート画像、plate ROI、rectified画像の検証に使用します。
合成データでは次の要素をランダム化します。
| 項目 | 内容 |
|---|---|
| 地域名 | 全国の地域名辞書から選択 |
| 分類番号 | 3桁数字および許可ローマ字候補 |
| かな文字 | 用途別の使用可能かな |
| 一連指定番号 | ・・-・1から99-99相当まで |
| 変形 | 透視変換、回転、スケール |
| 劣化 | ぼけ、ノイズ、JPEG圧縮、反射、夜間風照明 |
合成データは学習・変換フロー確認には有効ですが、製品精度の最終判断には使用しません。最終評価は必ず実機撮影データで行います。
11. 使用可能文字と辞書
分類番号では、数字に加えて一部のローマ字が使われる場合があります。後処理では、分類番号内のローマ字を限定候補として扱います。
A C F H K L M P X Yかな文字は用途によって使用可能範囲が異なります。製品側では、使用不可文字を明示しておきます。
not_used: お し へ ゐ ゑ んV2検証で使用する主な辞書は次のとおりです。
| 辞書 | 用途 |
|---|---|
dict/region_words.txt | 地域名候補の照合 |
dict/ppocrv6_rec_dict.txt | PP-OCRv6 rec CTC decode |
dict/kana_type_dict.txt | 将来のkana専用モデル用 |
dict/class_no_dict.txt | 将来の分類番号専用モデル用 |
dict/serial_dict.txt | 将来のserial専用モデル用 |
PP-OCRv6 rec RKNNの出力class数は18710です。CTC decodeでは、class 0をblank、class 1以降を辞書行に対応させます。辞書末尾の半角スペースが欠落した場合は、実行時に補完します。
[WARN] OCR dict was missing one char; appended half-width space in memory.[INFO] rec_classes=18710 ocr_chars_after_shape_check=18709 expected_chars=1870912. 認識モデルの設計方針
ナンバープレート認識では、1つの汎用OCRだけで読む方式と、構文・項目・専用モデルを組み合わせる方式があります。V2検証では、PP-OCRv6 det/recを中心にしつつ、parser、kana fallback、複数crop、多変体処理で精度を補いました。
| 方式 | 内容 | V2での扱い |
|---|---|---|
| 全体OCR | 補正済みプレート全体を1回OCRする | 候補生成の1つとして使用 |
| 行別OCR | 上段と下段を分けてOCRする | region / class / serial候補抽出に使用 |
| かなfallback | 左下かな領域を複数cropで読む | V2で実装済み |
| kana-constrained CTC | かな候補だけに制約したdecode | fallback evidenceとして使用 |
| kana-only classifier | かな専用軽量分類器 | 次段階の改善項目 |
| full-frame plate_det | PP-YOLOE-sによる検出 | V1検証済み、V2製品版へ接続予定 |
13. 学習データ生成スクリプト
V2プロジェクトでは、データ生成・変換・検証用のスクリプトを複数のディレクトリに分けています。また、V1プロジェクトで使用したtraining-scripts/をV2プロジェクト直下へコピーしているため、公開データの取得やPP-YOLOE-s学習データ生成にも対応できます。
代表的なスクリプトは次のとおりです。
| 配置 | スクリプト | 用途 |
|---|---|---|
training-scripts/ | roboflow_download_dataset.py | Roboflow由来データの取得 |
training-scripts/ | convert_roboflow_coco_to_jsonl.py | COCO annotationをJSONLへ変換 |
training-scripts/ | train_jp_plate_det_ppyoloe.sh | PP-YOLOE-s plate detection学習 |
training-scripts/ | export_jp_plate_det_ppyoloe.sh | plate_det Paddle inference model export |
scripts/ | generate_synthetic_jp_plate.py | 合成ナンバープレート生成 |
scripts/ | build_plate_det_dataset.py | plate detection用データセット生成 |
scripts/ | build_plate_corner_dataset.py | plate corner学習用manifest生成 |
scripts/ | rectify_plate_by_corners.py | 四隅点からrectified plate生成 |
scripts/ | build_structured_rec_dataset.py | 構造化認識データ生成 |
tools/ | extract_real_lpr_samples_004_018.py | ROI検証サンプル抽出 |
tools/ | label_real_lpr_expected_paddleocr6_gui.py | PC OCR候補生成と手動確認 |
deploy/rv1126b_lpr_v2/scripts/ | convert_ppocrv6_onnx_to_rknn.py | PP-OCRv6 ONNXからRKNNへ変換 |
V2の最終検証では、これらのスクリプトのうち、PP-OCRv6変換、ROIサンプル作成、ラベル確認GUI、ボード実行スクリプトを主に使用しました。structured recognitionの学習実験コードは残していますが、本版の最終検証では採用していません。
14. ナンバープレート検出モデルの学習とPP-YOLOE-sの扱い
ナンバープレート検出モデルは、full-frame画像からプレート全体を検出するために使用します。V1では、PaddleDetectionのPP-YOLOE-sを用いて、plate detectionの学習、評価、Paddle inference model export、ONNX/RKNN変換、RV1126B上の推論確認を行いました。

図14-1 PP-YOLOE-s plate detection学習開始

図14-2 PP-YOLOE-s学習出力ファイル

図14-3 PP-YOLOE-s評価結果

図14-4 PP-YOLOE-s checkpoint推論結果
V2検証では、識別パイプラインの品質を切り分けるため、INPUT_MODE=roiを使用し、すでに切り出されたplate ROI画像を直接入力しました。これにより、plate detectionの成否によって認識評価が混ざることを避けています。
今後、製品レベルに到達する段階では、V1で検証したPP-YOLOE-s plate_det.rknnをV2パイプライン前段に接続し、INPUT_MODE=frameでfull-frame画像からの検出・認識を評価します。
15. 学習後モデルの評価
製品レベルでは、単純な文字単位精度だけでなく、フルプレート完全一致率を最重要指標にします。
| 指標 | 説明 | 採用目安 |
|---|---|---|
| plate detection recall | ナンバープレートを検出できた割合 | 99.5%以上を目標 |
| plate detection precision | 誤検出の少なさ | 99.0%以上を目標 |
| region accuracy | 地域名の完全一致率 | 99.0%以上を目標 |
| class_no accuracy | 分類番号の完全一致率 | 99.0%以上を目標 |
| kana accuracy | かな文字の完全一致率 | 99.0%以上を目標 |
| serial accuracy | 一連指定番号の完全一致率 | 99.5%以上を目標 |
| full plate exact match | 4項目すべての完全一致率 | 駐車場ゲート環境で99%以上を目標 |
| RV1126B latency | 1イベントまたは1車両あたりの処理時間 | ゲート連携に支障がない範囲 |
V2の18枚ROI検証は、製品精度を確定する評価ではなく、ボード上の実行可能性と認識フローの有効性を確認するための小規模検証です。
16. ONNX導出とRKNN変換
PP-OCRv6のPaddle inference modelをONNXへ変換します。
./tools/export_ppocrv6_paddle_to_onnx.sh 2>&1 | tee logs/60_export_ppocrv6_paddle_to_onnx.logPP-OCRv6 recモデルでは、最終SoftmaxがRV1126B上で実行エラーになる場合があります。CTC greedy decodeではSoftmax前後でargmaxが変わらないため、Softmax前のlogitsを出力するONNXを作成します。
python tools/make_ppocrv6_rec_pre_softmax_onnx.py --input models/onnx/ppocrv6/ppocrv6_rec.onnx --output models/onnx/ppocrv6/ppocrv6_rec_pre_softmax.onnx --shape 1,40,18710RKNN変換を行います。
python deploy/rv1126b_lpr_v2/scripts/convert_ppocrv6_onnx_to_rknn.py --target rv1126b --onnx-dir models/onnx/ppocrv6 --output-dir models/rknn --det-onnx ppocrv6_det.onnx --rec-onnx ppocrv6_rec_pre_softmax.onnx --rec-output ppocrv6_rec.rknn --det-dataset data/calib/ppocrv6/ppocrv6_det_calib.txt --rec-dataset data/calib/ppocrv6/ppocrv6_rec_calib.txtRKNN Toolkit2では、dataset txt内の相対パスはdataset txtファイルの所在ディレクトリを基準に解釈されます。例えば、data/calib/ppocrv6/ppocrv6_det_calib.txtからsamples/real_lpr/real_001.jpgを参照する場合は、次のように記述します。
../../../samples/real_lpr/real_001.jpg17. RV1126Bボードのマウントと配置
RV1126BボードをNFSでマウントします。
sudo umount -l /mnt 2>/dev/nullsudo mount -t nfs -o vers=3,proto=tcp,mountproto=tcp,nolock,retrans=5,timeo=5 192.168.10.85:/ /mntC++実行ファイルをビルドし、ボードへ配置します。
./build.sh clearrm -rf /mnt/userdata/Demo/rv1126b_jp_lpr_v2./build.sh cpres配置後のボード側ディレクトリは次のとおりです。
/userdata/Demo/rv1126b_jp_lpr_v2/├── test-lpr-v21-rknn├── models/rknn/├── dict/├── samples/real_lpr/└── run_v21_product_validation.sh18. ボード上でのV2 ROI検証
ボード上でROIモードを実行します。
cd /userdata/Demo/rv1126b_jp_lpr_v2INPUT_MODE=roi ./run_v21_product_validation.sh実行スクリプトは、必要なモデル、辞書、サンプルCSVを確認します。
========== Check V2.1 RKNN runtime files ==========[OK] ./test-lpr-v21-rknn[OK] ./models/rknn/plate_corner.rknn[OK] ./models/rknn/ppocrv6_det.rknn[OK] ./models/rknn/ppocrv6_rec.rknn[OK] ./dict/region_words.txt[OK] ./dict/ppocrv6_rec_dict.txt[OK] ./samples/real_lpr/real_lpr_expected.csv出力は次のディレクトリに保存されます。
output/v21_product_validation/├── FINAL_RESULT.json├── frame_summary.csv├── summary.csv└── cases/<case_id>/ ├── roi.jpg ├── corner_debug.jpg ├── rectified_plate.jpg ├── result.txt ├── result.json └── kana_fallback_*.jpg
図18-1 ボード上で保存されたplate ROI

図18-2 plate_corner.rknnによる四隅推定debug

図18-3 透視補正後のナンバープレート画像
19. かなfallbackと投票方針
PP-OCRv6 whole-plate OCRでは、かな文字が数字や類似漢字へ誤認識されることがあります。V2では、かな領域に対して次のfallbackを実装しました。
lower-left / kana領域のcropを複数生成original / gray / CLAHE / sharpen / threshold / upsampleを試行unrestricted OCR結果から直接かなを抽出必要に応じてkana-constrained CTCを使用direct OCR evidenceを優先し、constrained CTCはfallback evidenceとして扱うreal_003では、小さい「あ」が爱として読まれるケースがありました。これはkana領域内だけの視覚的類似として扱い、愛 / 爱を「あ」に対応付けました。この対応はwhole-plate OCRには適用しません。
20. 18枚ROI画像による評価結果
最終検証では、real_001からreal_018までの18枚ROI画像を使用しました。

図20-1 18枚ROI検証結果
評価結果を次に示します。
| case | expected | final_plate_number | status |
|---|---|---|---|
| real_001 | 下関 500 す 45-36 | 下関 500 す 45-36 | correct |
| real_002 | 長崎 300 は 725 | 長崎 300 は 725 | correct |
| real_003 | 福山 100 あ 59-37 | 福山 100 あ 59-37 | correct |
| real_004 | 春日井 649 ぬ 59-78 | 春日井 649 ぬ 59-78 | correct |
| real_005 | 佐賀 344 ほ 88-92 | 佐賀 344 ほ 88-92 | correct |
| real_006 | 倉敷 836 け 08-67 | 倉敷 836 け 08-67 | correct |
| real_007 | 久留米 476 ま 79-20 | 久留米 476 ま 79-20 | correct |
| real_008 | 奄美 860 ち 92-34 | 奄美 860 ち 92-34 | correct |
| real_009 | 倉敷 587 ん 71-98 | 倉敷 587 く 71-98 | check |
| real_010 | 山形 651 ぬ 10-97 | 山形 651 ぬ 10-97 | correct |
| real_011 | 柏 590 ま 65-23 | 柏 590 ま 65-23 | correct |
| real_012 | 多摩 759 ち 70-67 | 多摩 759 ち 70-67 | correct |
| real_013 | 盛岡 324 ふ 52-38 | 盛岡 324 ふ 52-38 | correct |
| real_014 | いわき 324 た 65-18 | いわき 324 い 65-18 | check |
| real_015 | 帯広 334 さ 18-38 | 帯広 334 さ 18-38 | correct |
| real_016 | 柏 507 せ 69-41 | 柏 507 せ 69-41 | correct |
| real_017 | 湘南 571 み 15-91 | 湘南 571 み 15-91 | correct |
| real_018 | 三重 462 あ 90-97 | 三重 462 あ 90-97 | correct |
要約は次のとおりです。
| 項目 | 結果 |
|---|---|
| 入力ROI画像数 | 18 |
| 完全一致 | 16 |
| check | 2 |
| 地域名 | 18/18 |
| 分類番号 | 18/18 |
| 一連指定番号 | 18/18 |
| かな文字 | 16/18 |
real_009は、元画像側に通常の日本ナンバープレートで使用されない「ん」が含まれていました。このため、製品精度評価上はデータ品質問題として扱います。

図20-2 real_009の元画像。かな文字に通常運用外の「ん」が含まれる
real_014では、期待値いわき 324 た 65-18に対して、出力がいわき 324 い 65-18となりました。これはかな領域のcropまたはfallback投票における実際の誤認識であり、今後はkana専用分類器またはkana専用recモデルによる改善対象とします。
21. 500枚公開データを用いたV2向けROI検証データの作成
V1では、500枚公開データを使用して、plate_det、plate ROI生成、項目別crop、QC、ラベル候補生成、ラベルQC、4項目認識モデル学習、ONNX/RKNN変換、ボード推論確認までを行いました。V2では、このうちROI生成済みデータを利用し、認識パイプラインの検証に使用しました。
今回のV2検証で重要な流れは次のとおりです。
公開データの取得 ↓COCO / JSONL変換 ↓PP-YOLOE-s plate_detまたは既存bboxからplate ROI生成 ↓V2 ROI検証用サンプル抽出 ↓PC PaddleOCR6 GUIによるexpected候補作成 ↓人手確認 ↓real_lpr_expected.csvへ統合 ↓RV1126B上でROI認識評価500枚公開データから追加検証サンプルを抽出する例を示します。
python tools/extract_real_lpr_samples_004_018.py --source-dir datasets/train_data/jp_plate_500/plate_roi/images --method random --seed 42 --overwriteこのスクリプトは次のファイルを生成します。
samples/real_lpr/real_004.jpg...samples/real_lpr/real_018.jpgsamples/real_lpr/real_004_018_mapping.csvsamples/real_lpr/real_004_018_expected_template.csvreal_004_018_expected_template.csvをPC側ラベル確認GUIで開き、PaddleOCR6候補を確認・修正した後、real_lpr_expected.csvへ統合します。
22. 低信頼結果の保存と再学習
製品投入後は、低信頼結果を自動保存し、再学習に回します。保存条件例を次に示します。
plate_det_score < 0.7OCR候補が地域名辞書に一致しない分類番号に使用不可文字が含まれるかな文字が使用不可文字である一連指定番号が形式不正である同一車両の連続フレームで認識結果が安定しないkana fallbackで複数候補が競合するparserがcheckを返す保存ディレクトリ例を示します。
/userdata/Demo/rv1126b_jp_lpr_v2/review_samples/├── raw/├── plate_roi/├── rectified/├── kana_fallback/├── result_json/└── README.md再学習フローは次のとおりです。
低信頼画像を保存 ↓PCへ回収 ↓Web GUI / CVAT / PPOCRLabelで修正 ↓train_dataへ追加 ↓plate_det / plate_corner / OCR / kana専用モデルをfine-tune ↓ONNX / RKNN変換 ↓実機評価 ↓製品モデルとして採用23. 製品レベルに到達するための段階計画
製品レベルを目指す場合、次の段階で進めます。
| 段階 | 内容 | 完了条件 |
|---|---|---|
| Phase 1 | ROI入力によるV2認識パイプライン確認 | PP-OCRv6 RKNNとparserがボード上で動作する |
| Phase 2 | PP-YOLOE-s plate_det.rknnを接続 | full-frame入力からplate ROIを安定取得できる |
| Phase 3 | plate cornerと透視補正を実機画像で評価 | 斜め・反射条件でrectified plateが安定する |
| Phase 4 | kana専用recognizer / classifierを追加 | kana誤認識が大幅に減る |
| Phase 5 | multi-frame votingを実車イベントで評価 | 同一車両3〜5フレームで結果が安定する |
| Phase 6 | 低信頼保存と再学習ループを実装 | check結果を再学習データ化できる |
| Phase 7 | 駐車場ゲート実機連携 | 入出庫イベント単位で評価できる |
| Phase 8 | release判定 | full plate exact match、latency、false acceptが要求を満たす |
24. プライバシーと運用上の注意
ナンバープレート画像は、車両識別に関わる情報です。製品開発では、技術精度だけでなく、データ管理も重要です。
最低限、次の方針を守ります。
学習データの保存場所を限定するアクセス権限を管理する不要になった画像は削除または匿名化する社外提供や再配布を行う場合は権利と契約を確認する評価レポートには必要以上の個別ナンバーを載せないログ保存期間を製品仕様として定義する低信頼レビュー用画像の取り扱いルールを決める25. READMEとソースコード構成
資料パッケージ内のREADME.mdには、プロジェクト構成、ソースコードの役割、および本MDX文書に沿ってV2検証を再現する手順をまとめています。
公開ユーザー向けのREADMEでは、作成途中で使用した内部補助ファイル名には触れず、実際に資料パッケージを展開した利用者が次の内容を把握できるように構成しています。
プロジェクト主要ディレクトリボード側C++ RKNN RuntimeコードPC側Python参考コードデータ生成・ラベル確認GUIモデル導出・RKNN変換スクリプトボード配置と実行手順18枚ROI検証の再現方法26. 現段階の完了条件と今後の改善項目
本チュートリアルでは、次の項目まで完了しました。
V1でのPP-YOLOE-s plate_det学習・変換・RV1126B推論V2 ROI入力認識パイプラインの整理PP-OCRv6 det / rec Paddle inference modelの準備PP-OCRv6 det / rec ONNX変換PP-OCRv6 rec pre-softmax ONNX生成PP-OCRv6 det / rec RKNN変換plate_corner.rknn、ppocrv6_det.rknn、ppocrv6_rec.rknnのボード配置C++ RKNN Runtimeによるtest-lpr-v21-rknn実行CTC辞書サイズ確認と半角スペース補正kana fallbackとdirect evidence優先投票の実装18枚ROI画像による認識評価現段階の主な制約は次のとおりです。
本版の最終評価はROI入力であり、full-frame plate_det接続評価は未完了18枚評価は小規模であり、製品精度を保証する件数ではないreal_009のような公開データ品質問題が含まれるkana文字は小さく、PP-OCRv6汎用recだけでは誤認識が残る夜間、反射、雨天、斜め、汚れ、図柄入りナンバーの評価が不足している量産品質を目指す場合は、次段階で次の改善を行います。
PP-YOLOE-s plate_det.rknnをV2パイプライン前段に接続する実機駐車場データを追加するfull-frame入力で検出から認識まで評価するkana専用recognizer / classifierを作成するmulti-frame votingを実車イベント単位で評価する低信頼サンプル保存と再学習フローを整備するRKNN量子化前後の精度差分を条件別に評価する以上により、本チュートリアルは「RV1126B向け日本ナンバープレート認識V2のROIベース認識パイプライン」を、PP-OCRv6 RKNN変換、C++ RKNN Runtime実行、かなfallback、評価CSV出力まで確認した状態とします。full-frame製品版では、V1で検証済みのPP-YOLOE-s plate_detを前段に追加し、実カメラ画像で再評価します。
27. 製品開発に向けた改善項目
製品開発では、次の改善を優先します。
| 優先度 | 改善項目 |
|---|---|
| 1 | PP-YOLOE-s plate_det.rknnをV2パイプラインへ接続し、full-frame検証を行う |
| 2 | 実機駐車場データを条件別に収集する |
| 3 | kana専用recognizer / classifierを追加する |
| 4 | plate cornerの実機斜め画像評価を拡充する |
| 5 | 夜間、反射、逆光、雨天、汚れ、図柄入りナンバーを追加評価する |
| 6 | multi-frame votingを入庫・出庫イベント単位で評価する |
| 7 | false acceptを抑える低信頼保留ルールを設計する |
| 8 | 低信頼サンプル回収と再学習の自動化を行う |
| 9 | RKNN INT8量子化前後の差分をレポート化する |
| 10 | 駐車場ゲート、精算機、管理サーバーとの連携を実装する |
28. 参考資料
- PaddleDetection GitHubリポジトリ
- PaddleDetection PicoDet設定例
- PaddleDetection PP-YOLOE設定・エクスポート例
- PicoDet論文
- PP-YOLOE論文
- PaddleOCR公式ドキュメント
- PaddleOCR OCR Pipeline Usage Tutorial
- PaddleOCR GitHubリポジトリ
- PaddleOCR Text Recognition Training
- PaddleOCR Fine-tune Guide
- 国土交通省 ナンバープレートについて
- 東北運輸局 ナンバープレートの見方
- 国土交通省 ナンバープレート表示地域名一覧
- RKNN Model Zoo GitHubリポジトリ