AIでナンバープレート読み取り日本のナンバープレートAI認識~ご当地ナンバー背景除去フィルタも含めてAIでナンバープレート読み取り~
1. 日本のナンバープレート事情と課題
- 統一フォントがない(自治体ごとに微妙に異なる)
- ひらがな・漢字・数字・アルファベットの混在
- デザインの多様化(ご当地・記念デザインも含む)
- 反射・湾曲・汚れ等による読取困難
- 図柄入り(ご当地ナンバー)は背景が複雑でOCRに不利
2. AIによるナンバープレート認識の基本技術
- 物体検出(YOLOv8, YOLOX等)でプレート領域を抽出
- 深層学習OCR(PaddleOCR、TrOCRなど)で文字認識
- 構造解析・補正(正規表現や文字領域ごとの処理)
- Augmentationや合成データ生成で、現実のバリエーションに強くするのがコツ
- ご当地ナンバーの図柄背景は前処理が重要
3. サンプル:YOLOv8 + PaddleOCRによるプレート認識
from ultralytics import YOLO
from paddleocr import PaddleOCR
import cv2
model = YOLO("yolov8n.pt") # 再学習モデル推奨
img = cv2.imread('test.jpg')
results = model(img)
for box in results[0].boxes.xyxy:
x1, y1, x2, y2 = map(int, box)
plate_img = img[y1:y2, x1:x2]
ocr = PaddleOCR(lang="japan", use_angle_cls=True)
ocr_result = ocr.ocr(plate_img, cls=True)
print("認識結果:", ocr_result)
4. ご当地ナンバー背景の削除(前処理フィルタ例)
ご当地ナンバーの図柄・カラー背景はAI OCRの大きな障害。
グレースケール化+適応的二値化+モルフォロジーで文字だけを抽出するフィルタ例です。
import cv2
import numpy as np
img = cv2.imread('gotouchi_plate.jpg')
# グレースケール化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 適応的二値化
bin_img = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 21, 10
)
# モルフォロジー処理(ノイズ除去・文字強調)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
clean = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel, iterations=1)
# 結果表示
cv2.imshow('clean', clean)
cv2.waitKey(0)
cv2.destroyAllWindows()
- adaptiveThresholdは背景の明るさムラにも強い
- さらに深層学習セグメンテーション(U-Net, Mask R-CNN等)で「文字のみ」マスク生成も可能
セグメンテーション例:
U-Net-based license plate character segmentation(arXiv)
5. 今後の展望・参考リンク
- 日本語OCR・ディープラーニングの進化で精度向上中
- OpenAI Vision APIやクラウドOCRも日本語対応拡大中(商用利用は費用注意)
- 合成データ・背景分離の自動化も進展