コンテンツにスキップ

日本ナンバープレート認識実装ガイド(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.02026/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

V2検証ワークフロー

図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項目が表示されます。

項目説明
地域名品川横浜春日井いわき運輸支局、自動車検査登録事務所、地域名を示します。
分類番号330580649自動車の種別および用途による分類を示します。近年は数字だけでなく一部ローマ字を含む場合があります。
かな文字自家用、事業用、貸渡用などの用途区分を示します。
一連指定番号11-1159-7890-974桁以下の番号です。表示上は中央点やハイフンを含みます。

製品側では、単なる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.rknnwarpPerspectiveで透視補正します。
かな文字小さいかなが数字や漢字に誤認識される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-splate_det.rknnV1で学習・変換・ボード実行を検証済み。本V2検証ではROI入力に簡略化したため、実行対象から外しています。
plate ROI切り出しC++ OpenCV-full-frame製品版ではPP-YOLOE-sのbboxから切り出します。
四隅推定軽量cornerモデルplate_corner.rknnV2検証対象です。
透視補正OpenCV warpPerspective-V2検証対象です。
OCR文字検出PP-OCRv6 detppocrv6_det.rknnV2検証対象です。
OCR文字認識PP-OCRv6 rec pre-softmaxppocrv6_rec.rknnV2検証対象です。
後処理C++ parser / kana fallback / voting-V2検証対象です。
将来改善kana-only recognizer / classifierkana_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 number

5. Conda環境とPaddleOCRの準備

PP-OCRv6用のConda環境を作成します。

Terminal window
conda create -n ppocrv6 python=3.10 -y
conda activate ppocrv6
python -m pip install --upgrade pip setuptools wheel
python -m pip install paddlepaddle==3.3.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
python -m pip install paddleocr==3.7.0

確認コマンドは次のとおりです。

Terminal window
python - <<'PY'
import paddle
import paddleocr
import sys
print("Python:", sys.version)
print("Paddle:", paddle.__version__)
print("PaddleOCR:", paddleocr.__version__)
print("CUDA:", paddle.is_compiled_with_cuda())
PY

Conda環境一覧

図5-1 Conda環境一覧

PP-OCRv6環境確認

図5-2 PP-OCRv6環境確認

PaddlePaddle 3.x CPU環境では、oneDNN / PIR互換性問題により次のようなエラーが出る場合があります。

ConvertPirAttribute2RuntimeAttribute not support [pir::ArrayAttribute<pir::DoubleAttribute>]

この場合、PaddleOCRをimportする前に次の環境変数を設定します。

Terminal window
export FLAGS_use_mkldnn=0
export FLAGS_use_onednn=0
export PADDLE_PDX_ENABLE_MKLDNN_BYDEFAULT=0
export PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK=True

PP-OCRv6のPaddle inference modelは、次の3ファイルを含む必要があります。

models/paddle/ppocrv6/det/
├── inference.json
├── inference.pdiparams
└── inference.yml
models/paddle/ppocrv6/rec/
├── inference.json
├── inference.pdiparams
└── inference.yml

inference.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.jpgreal_003.jpgと合わせて、最終的に18枚のROI画像で板端C++ RKNN Runtime検証を行いました。

データセット取得環境確認

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

Roboflowデータ取得確認

図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,expected
samples/real_lpr/real_001.jpg,下関 500 す 45-36
samples/real_lpr/real_002.jpg,長崎 300 は 725

複数フレーム投票を使用する場合は、3列形式に拡張できます。

image_path,expected,group_id
samples/real_lpr/car001_f001.jpg,春日井 649 ぬ 59-78,car001
samples/real_lpr/car001_f002.jpg,春日井 649 ぬ 59-78,car001

8. アノテーション方針

V2の最終製品化では、最低限次のラベルを管理します。

ラベル内容推奨形式
plate_bboxナンバープレート全体の矩形COCO xywhまたはJSONL絶対座標
plate_quadナンバープレート四隅左上、右上、右下、左下
expected完全な車牌文字列地域名 分類番号 かな 一連指定番号
region地域名辞書照合可能な文字列
class_no分類番号3桁数字または許可ローマ字を含む文字列
kanaかな文字使用可能かなリスト内の1文字
serial一連指定番号12-34725など

V2のROI検証では、plate bboxや四隅の学習アノテーションではなく、samples/real_lpr/real_lpr_expected.csvによる最終文字列評価を中心にしました。これは、認識パイプラインを簡潔に評価するためです。

9. アノテーションツールとラベル確認GUI

少量データでは、Web GUIを使用してROI画像と自動OCR候補を確認し、expectedを手動で修正します。

bbox QC / expected入力GUI

図9-1 PC側Web GUIによる候補ラベル確認

V2資料パッケージには、次のツールを含めています。

ツール用途
tools/plate_bbox_qc_web.py画像表示、bbox描画、expected入力、CSV保存を行います。
tools/label_real_lpr_expected_paddleocr6_gui.pyPC側PaddleOCR6で自動下書き認識し、Web GUIで人手確認します。
tools/extract_real_lpr_samples_004_018.py追加ROIサンプルをreal_004.jpgreal_018.jpgとして抽出します。

PC側GUIを起動する例を示します。

Terminal window
export FLAGS_use_mkldnn=0
export FLAGS_use_onednn=0
export 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 7860

10. 合成データ作成方針

実機データだけでは、全国の地域名、分類番号、かな、番号パターンを十分に網羅することが難しいため、合成データを併用します。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.txtPP-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=18709

12. 認識モデルの設計方針

ナンバープレート認識では、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かな候補だけに制約したdecodefallback evidenceとして使用
kana-only classifierかな専用軽量分類器次段階の改善項目
full-frame plate_detPP-YOLOE-sによる検出V1検証済み、V2製品版へ接続予定

13. 学習データ生成スクリプト

V2プロジェクトでは、データ生成・変換・検証用のスクリプトを複数のディレクトリに分けています。また、V1プロジェクトで使用したtraining-scripts/をV2プロジェクト直下へコピーしているため、公開データの取得やPP-YOLOE-s学習データ生成にも対応できます。

代表的なスクリプトは次のとおりです。

配置スクリプト用途
training-scripts/roboflow_download_dataset.pyRoboflow由来データの取得
training-scripts/convert_roboflow_coco_to_jsonl.pyCOCO annotationをJSONLへ変換
training-scripts/train_jp_plate_det_ppyoloe.shPP-YOLOE-s plate detection学習
training-scripts/export_jp_plate_det_ppyoloe.shplate_det Paddle inference model export
scripts/generate_synthetic_jp_plate.py合成ナンバープレート生成
scripts/build_plate_det_dataset.pyplate detection用データセット生成
scripts/build_plate_corner_dataset.pyplate corner学習用manifest生成
scripts/rectify_plate_by_corners.py四隅点からrectified plate生成
scripts/build_structured_rec_dataset.py構造化認識データ生成
tools/extract_real_lpr_samples_004_018.pyROI検証サンプル抽出
tools/label_real_lpr_expected_paddleocr6_gui.pyPC OCR候補生成と手動確認
deploy/rv1126b_lpr_v2/scripts/convert_ppocrv6_onnx_to_rknn.pyPP-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上の推論確認を行いました。

PP-YOLOE-s正式学習開始

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

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

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

PP-YOLOE-s評価結果

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

PP-YOLOE-s checkpoint推論結果

図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 match4項目すべての完全一致率駐車場ゲート環境で99%以上を目標
RV1126B latency1イベントまたは1車両あたりの処理時間ゲート連携に支障がない範囲

V2の18枚ROI検証は、製品精度を確定する評価ではなく、ボード上の実行可能性と認識フローの有効性を確認するための小規模検証です。

16. ONNX導出とRKNN変換

PP-OCRv6のPaddle inference modelをONNXへ変換します。

Terminal window
./tools/export_ppocrv6_paddle_to_onnx.sh 2>&1 | tee logs/60_export_ppocrv6_paddle_to_onnx.log

PP-OCRv6 recモデルでは、最終SoftmaxがRV1126B上で実行エラーになる場合があります。CTC greedy decodeではSoftmax前後でargmaxが変わらないため、Softmax前のlogitsを出力するONNXを作成します。

Terminal window
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,18710

RKNN変換を行います。

Terminal window
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.txt

RKNN Toolkit2では、dataset txt内の相対パスはdataset txtファイルの所在ディレクトリを基準に解釈されます。例えば、data/calib/ppocrv6/ppocrv6_det_calib.txtからsamples/real_lpr/real_001.jpgを参照する場合は、次のように記述します。

../../../samples/real_lpr/real_001.jpg

17. RV1126Bボードのマウントと配置

RV1126BボードをNFSでマウントします。

Terminal window
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

C++実行ファイルをビルドし、ボードへ配置します。

Terminal window
./build.sh clear
rm -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.sh

18. ボード上でのV2 ROI検証

ボード上でROIモードを実行します。

Terminal window
cd /userdata/Demo/rv1126b_jp_lpr_v2
INPUT_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

ボード上で保存されたplate ROI

図18-1 ボード上で保存されたplate ROI

四隅推定debug

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

透視補正後plate

図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画像を使用しました。

18枚ROI検証結果

図20-1 18枚ROI検証結果

評価結果を次に示します。

caseexpectedfinal_plate_numberstatus
real_001下関 500 す 45-36下関 500 す 45-36correct
real_002長崎 300 は 725長崎 300 は 725correct
real_003福山 100 あ 59-37福山 100 あ 59-37correct
real_004春日井 649 ぬ 59-78春日井 649 ぬ 59-78correct
real_005佐賀 344 ほ 88-92佐賀 344 ほ 88-92correct
real_006倉敷 836 け 08-67倉敷 836 け 08-67correct
real_007久留米 476 ま 79-20久留米 476 ま 79-20correct
real_008奄美 860 ち 92-34奄美 860 ち 92-34correct
real_009倉敷 587 ん 71-98倉敷 587 く 71-98check
real_010山形 651 ぬ 10-97山形 651 ぬ 10-97correct
real_011柏 590 ま 65-23柏 590 ま 65-23correct
real_012多摩 759 ち 70-67多摩 759 ち 70-67correct
real_013盛岡 324 ふ 52-38盛岡 324 ふ 52-38correct
real_014いわき 324 た 65-18いわき 324 い 65-18check
real_015帯広 334 さ 18-38帯広 334 さ 18-38correct
real_016柏 507 せ 69-41柏 507 せ 69-41correct
real_017湘南 571 み 15-91湘南 571 み 15-91correct
real_018三重 462 あ 90-97三重 462 あ 90-97correct

要約は次のとおりです。

項目結果
入力ROI画像数18
完全一致16
check2
地域名18/18
分類番号18/18
一連指定番号18/18
かな文字16/18

real_009は、元画像側に通常の日本ナンバープレートで使用されない「ん」が含まれていました。このため、製品精度評価上はデータ品質問題として扱います。

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枚公開データから追加検証サンプルを抽出する例を示します。

Terminal window
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.jpg
samples/real_lpr/real_004_018_mapping.csv
samples/real_lpr/real_004_018_expected_template.csv

real_004_018_expected_template.csvをPC側ラベル確認GUIで開き、PaddleOCR6候補を確認・修正した後、real_lpr_expected.csvへ統合します。

22. 低信頼結果の保存と再学習

製品投入後は、低信頼結果を自動保存し、再学習に回します。保存条件例を次に示します。

plate_det_score < 0.7
OCR候補が地域名辞書に一致しない
分類番号に使用不可文字が含まれる
かな文字が使用不可文字である
一連指定番号が形式不正である
同一車両の連続フレームで認識結果が安定しない
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 1ROI入力によるV2認識パイプライン確認PP-OCRv6 RKNNとparserがボード上で動作する
Phase 2PP-YOLOE-s plate_det.rknnを接続full-frame入力からplate ROIを安定取得できる
Phase 3plate cornerと透視補正を実機画像で評価斜め・反射条件でrectified plateが安定する
Phase 4kana専用recognizer / classifierを追加kana誤認識が大幅に減る
Phase 5multi-frame votingを実車イベントで評価同一車両3〜5フレームで結果が安定する
Phase 6低信頼保存と再学習ループを実装check結果を再学習データ化できる
Phase 7駐車場ゲート実機連携入出庫イベント単位で評価できる
Phase 8release判定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. 製品開発に向けた改善項目

製品開発では、次の改善を優先します。

優先度改善項目
1PP-YOLOE-s plate_det.rknnをV2パイプラインへ接続し、full-frame検証を行う
2実機駐車場データを条件別に収集する
3kana専用recognizer / classifierを追加する
4plate cornerの実機斜め画像評価を拡充する
5夜間、反射、逆光、雨天、汚れ、図柄入りナンバーを追加評価する
6multi-frame votingを入庫・出庫イベント単位で評価する
7false acceptを抑える低信頼保留ルールを設計する
8低信頼サンプル回収と再学習の自動化を行う
9RKNN INT8量子化前後の差分をレポート化する
10駐車場ゲート、精算機、管理サーバーとの連携を実装する

28. 参考資料