pythonwakaran
@pythonwakaran

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ドラレコの画像からナンバープレート認識

解決したいこと

ドラレコから取得した画像から、ナンバーを認識させて、output.txtに保存したい感じなのですが、分からなくなってしまったため質問させていただきます。

発生している問題・エラー

image 1/1 C:\Users\corei\OneDrive\画像\スクリーンショット\スクリーンショット 2025-01-30 210546.png: 576x640 1 truck, 96.4ms
Speed: 2.5ms preprocess, 96.4ms inference, 18.5ms postprocess per image at shape (1, 3, 576, 640)
Traceback (most recent call last):
  File "C:\Users\corei\OneDrive\デスクトップ\ナンバープレート\1.py", line 41, in <module>
    x1, y1, x2, y2 = box.xyxy.tolist()
ValueError: not enough values to unpack (expected 4, got 1) 

該当するソースコード

import tkinter as tk
from tkinter import filedialog
from ultralytics import YOLO
import cv2
import numpy as np
from realesrgan.utils import RealESRGANer  # 修正
from PIL import Image
import easyocr
import os  

def select_image():
    root = tk.Tk()
    root.withdraw()  
    file_path = filedialog.askopenfilename(title="画像ファイルを選択", filetypes=[ ("All files", "*.*"),("JPEG", "*.jpg"), ("PNG", "*.png")])
    return file_path

# YOLOv8モデルのロード
model = YOLO('yolov8n.pt')  

# 画像の選択
image_path = select_image()
if not image_path:
    print("画像が選択されませんでした。終了します。")
    exit()

# 画像を読み込む
image = cv2.imread(image_path)

# YOLOモデルで推論
results = model(image_path)

# 出力ファイルのパス
output_path = './output.txt'
if not os.path.exists(output_path):
    open(output_path, 'w', encoding='utf-8').close()  

# 検出されたナンバープレートの処理
for result in results:
    # 各検出ボックスに対して処理
    for box in result.boxes:
        x1, y1, x2, y2 = box.xyxy.tolist()  
        x1, y1, x2, y2 = map(int, [x1, y1, x2, y2]) 

        # ナンバープレート部分を切り取る
        plate_img = image[y1:y2, x1:x2]
        plate_pil = Image.fromarray(cv2.cvtColor(plate_img, cv2.COLOR_BGR2RGB))

        # RealESRGANを使って画像を補正
        model_path = r'./weights/RealESRGAN_x4.pth'  # モデルのパス
        real_esrgan_model = RealESRGANer(scale=4, model_path=model_path)  # モデルをロード

        # 補正後の画像を保存
        enhanced_plate = real_esrgan_model.enhance(plate_pil) 
        enhanced_plate.save("plate_enhanced.jpg")
        enhanced_plate.show()

        # OCRでナンバープレートの文字を認識
        reader = easyocr.Reader(['ja', 'en'])
        text_results = reader.readtext(np.array(enhanced_plate))

        # 出力ファイルに結果を書き込み
        with open(output_path, "a", encoding="utf-8") as f:
            for (_, text, _) in text_results:
                f.write(text + "\n")

        print("✅ ナンバープレートの検出と認識が完了しました!")
        print("認識されたテキスト:", text_results)

###フォルダ構成
ナンバープレートフォルダにpythonファイル、yolov8n.pt

weightsフォルダにRealESRGAN_x4.pth

コメント

本当に行き詰まってしまいました。
助けてください。

0

2Answer

File "C:\Users\corei\OneDrive\デスクトップ\ナンバープレート\1.py", line 41, in
x1, y1, x2, y2 = box.xyxy.tolist()
ValueError: not enough values to unpack (expected 4, got 1)

エラーには、(右からは)1つだけど、(左は)4つだよってなってます。
tolist()なので、出力されるのは1つのリストになります)

こんな感じにしてはどうでしょうか
わたしはこんな感じにしてます。

    for box in result.boxes:
        xmin, ymin, xmax, ymax = map(int, box.xyxy) 

1Like

Comments

  1. @pythonwakaran

    Questioner

    返信ありがとうございます。実行したのですが、うまくいきませんでした。

    C:\Users\corei\OneDrive\デスクトップ\ナンバープレート>tree /f
    C:.
    │  1.py
    │  output.txt
    │  test.py
    │  yolov8n.pt
    │
    └─weights
            RealESRGAN_x4.pth
    

    なのですが

    import tkinter as tk
    from tkinter import filedialog
    from ultralytics import YOLO
    import cv2
    import numpy as np
    from realesrgan.utils import RealESRGANer  # 修正
    from PIL import Image
    import easyocr
    import os  
    
    def select_image():
        root = tk.Tk()
        root.withdraw()  
        file_path = filedialog.askopenfilename(title="画像ファイルを選択", filetypes=[ ("All files", "*.*"),("JPEG", "*.jpg"), ("PNG", "*.png")])
        return file_path
    
    # YOLOv8モデルのロード
    model = YOLO('yolov8n.pt')  
    
    # 画像の選択
    image_path = select_image()
    if not image_path:
        print("画像が選択されませんでした。終了します。")
        exit()
    
    # 画像を読み込む
    image = cv2.imread(image_path)
    
    # YOLOモデルで推論
    results = model(image_path)
    
    # 出力ファイルのパス
    output_path = './output.txt'
    if not os.path.exists(output_path):
        open(output_path, 'w', encoding='utf-8').close()  
    
    for result in results:
        for box in result.boxes:
            print("box.xyxy:", box.xyxy)  # デバッグ用に表示
    
            # box.xyxy をリストに変換してから座標を取得
            coords = box.xyxy[0].tolist()  # 1つ目の要素をリストに変換
            print("coords:", coords)  # 確認用
    
            xmin, ymin, xmax, ymax = map(int, coords)  # 整数に変換
    
            # ナンバープレート部分を切り取る
            plate_img = image[ymin:ymax, xmin:xmax]
            plate_pil = Image.fromarray(cv2.cvtColor(plate_img, cv2.COLOR_BGR2RGB))
    
            # RealESRGANを使って画像を補正
            model_path = "C:/Users/corei/OneDrive/デスクトップ/ナンバープレート/weights/RealESRGAN_x4.pth"
            real_esrgan_model = RealESRGANer(scale=4, model_path=model_path)
    
            # 補正後の画像を保存
            enhanced_plate = real_esrgan_model.enhance(plate_pil) 
            enhanced_plate.save("plate_enhanced.jpg")
            enhanced_plate.show()
    
            # OCRでナンバープレートの文字を認識
            reader = easyocr.Reader(['ja', 'en'])
            text_results = reader.readtext(np.array(enhanced_plate))
    
            # 出力ファイルに結果を書き込み
            with open(output_path, "a", encoding="utf-8") as f:
                for (_, text, _) in text_results:
                    f.write(text + "\n")
    
            print("✅ ナンバープレートの検出と認識が完了しました!")
            print("認識されたテキスト:", text_results)
    

    このコードを実行すると、

    image 1/1 C:\Users\corei\OneDrive\画像\スクリーンショット\スクリーンショット 2025-01-30 210546.png: 576x640 1 truck, 76.4ms
    Speed: 2.0ms preprocess, 76.4ms inference, 1.0ms postprocess per image at shape (1, 3, 576, 640)
    box.xyxy: tensor([[ 70.2780,  59.2949, 346.4653, 319.6822]])
    coords: [70.27798461914062, 59.29487228393555, 346.46533203125, 319.6822204589844]
    Traceback (most recent call last):
      File "c:\Users\corei\OneDrive\デスクトップ\ナンバープレート\1.py", line 53, in <module>
        real_esrgan_model = RealESRGANer(scale=4, model_path=model_path)
      File "C:\Users\corei\AppData\Local\Programs\Python\Python39\lib\site-packages\realesrgan\utils.py", line 70, in __init__
        model.load_state_dict(loadnet[keyname], strict=True)
    AttributeError: 'NoneType' object has no attribute 'load_state_dict'
    

    となってしまいました。
    どうしたらよいですか?

パスの指定が悪いと思うので、次のようにしてみてください

model_path = "C:\\Users\\corei\\OneDrive\\デスクトップ\\ナンバープレート\\weights\\RealESRGAN_x4.pth"
0Like

Comments

  1. @pythonwakaran

    Questioner

    import tkinter as tk
    from tkinter import filedialog
    from ultralytics import YOLO
    import cv2
    import numpy as np
    from realesrgan.utils import RealESRGANer  # 修正
    from PIL import Image
    import easyocr
    import os  
    
    def select_image():
        root = tk.Tk()
        root.withdraw()  
        file_path = filedialog.askopenfilename(title="画像ファイルを選択", filetypes=[ ("All files", "*.*"),("JPEG", "*.jpg"), ("PNG", "*.png")])
        return file_path
    
    
    model = YOLO('yolov8n.pt')  
    
    
    image_path = select_image()
    if not image_path:
        print("画像が選択されませんでした。終了します。")
        exit()
    
    
    image = cv2.imread(image_path)
    
    
    results = model(image_path)
    
    
    output_path = './output.txt'
    if not os.path.exists(output_path):
        open(output_path, 'w', encoding='utf-8').close()  
    
    for result in results:
        for box in result.boxes:
            print("box.xyxy:", box.xyxy) 
    
            
            coords = box.xyxy[0].tolist() 
            print("coords:", coords)  
    
            xmin, ymin, xmax, ymax = map(int, coords)  
    
     
            plate_img = image[ymin:ymax, xmin:xmax]
            plate_pil = Image.fromarray(cv2.cvtColor(plate_img, cv2.COLOR_BGR2RGB))
    
    
            model_path = "C:\\Users\\corei\\OneDrive\\デスクトップ\\ナンバープレート\\weights\\RealESRGAN_x4.pth"
            real_esrgan_model = RealESRGANer(scale=4, model_path=model_path)
    
    
            enhanced_plate = real_esrgan_model.enhance(plate_pil) 
            enhanced_plate.save("plate_enhanced.jpg")
            enhanced_plate.show()
    
    
            reader = easyocr.Reader(['ja', 'en'])
            text_results = reader.readtext(np.array(enhanced_plate))
    
           
            with open(output_path, "a", encoding="utf-8") as f:
                for (_, text, _) in text_results:
                    f.write(text + "\n")
    
            print("✅ ナンバープレートの検出と認識が完了しました!")
            print("認識されたテキスト:", text_results)
    

    でやったのですが、

    PS C:\Users\corei> & C:/Users/corei/AppData/Local/Programs/Python/Python39/python.exe c:/Users/corei/OneDrive/デスクトップ/ナンバープレート/1.py
    
    image 1/1 C:\Users\corei\OneDrive\画像\スクリーンショット\スクリーンショット 2025-01-30 210546.png: 576x640 1 truck, 99.7ms
    Speed: 2.5ms preprocess, 99.7ms inference, 1.0ms postprocess per image at shape (1, 3, 576, 640)
    box.xyxy: tensor([[ 70.2780,  59.2949, 346.4654, 319.6822]])
    coords: [70.2779769897461, 59.294883728027344, 346.4654235839844, 319.6822204589844]
    Traceback (most recent call last):
      File "c:\Users\corei\OneDrive\デスクトップ\ナンバープレート\1.py", line 53, in <module>
        real_esrgan_model = RealESRGANer(scale=4, model_path=model_path)
      File "C:\Users\corei\AppData\Local\Programs\Python\Python39\lib\site-packages\realesrgan\utils.py", line 70, in __init__
        model.load_state_dict(loadnet[keyname], strict=True)
    AttributeError: 'NoneType' object has no attribute 'load_state_dict'
    

    となりました。どうしたらよいでしょう

  2. こちらの記事が参考になりそうです
    RealESRGANerというものを知らないのですが、記事で重みデータのラベル?のようなものが違うことがあるようです

Your answer might help someone💌