0

Nhận diện biển số xe với YOLOv8 siêu đơn giản

1. Giới thiệu

Nhận diện biển số xe là một bài toán quan trọng trong lĩnh vực thị giác máy tính, được ứng dụng trong kiểm soát giao thông, thu phí tự động và quản lý bãi đỗ xe. Trong bài viết này, mình sẽ chia sẻ cách xây dựng một hệ thống nhận diện biển số xe sử dụng YOLOv8 để phát hiện vùng biển số và VietOCR để nhận dạng ký tự.

2. Mô hình tổng quan

Hệ thống nhận diện biển số xe gồm hai giai đoạn chính:

  • Phát hiện biển số: Sử dụng YOLOv8 để xác định vị trí biển số trong ảnh.
  • Nhận dạng ký tự: Sử dụng VietOCR để chuyển hình ảnh biển số thành chuỗi ký tự.

Mô hình được huấn luyện trên tập dữ liệu hơn 4000 ảnh, chia thành train, test và validation.

3. Phát hiện biển số bằng YOLOv8

Chuẩn bị dữ liệu

Dữ liệu gồm các ảnh xe có biển số, được gán nhãn bằng công cụ LabelImg theo định dạng YOLO. Cấu trúc thư mục dữ liệu:

/dataset  
  /images  
    /train  
    /val  
    /test  
  /labels  
    /train  
    /val  
    /test  

Huấn luyện mô hình YOLOv8

Sử dụng thư viện ultralytics để train YOLOv8

Cài đặt bằng lệnh sau

!pip install ultralytics

Tiến hành train mô hình, ở đây mình chạy với 20 epochs

#import YOLO sử dụng yolov8n.pt
from ultralytics import YOLO
# Khởi tạo model YOLOv8
model = YOLO("yolov8n.pt")  # Có thể chọn yolov8s.pt, yolov8m.pt, yolov8l.pt, yolov8x.pt

# Train model
model.train(data="/content/drive/MyDrive/AIGroupSTE/dataset/data.yaml", epochs=20, batch=16,patience=5, imgsz=640)

Sau khi train, mô hình có thể phát hiện biển số với độ chính xác cao.

4. Nhận dạng ký tự bằng VietOCR

Sau khi phát hiện biển số, ta cần cắt vùng biển số và sử dụng VietOCR để nhận dạng ký tự.

Cài thư viện VietOCR

!pip install vietocr
!pip install pillow

Load mô hình VietOCR

config = Cfg.load_config_from_name('vgg_transformer')
config['device'] = 'cuda'  # Dùng GPU nếu có
vietocr_model = Predictor(config)

import model vừa train

# Load model YOLOv8
model = YOLO("/content/runs/detect/train2/weights/best.pt")  # Thay đường dẫn nếu cần

Định nghĩa hàm đọc ảnh từ url và trích xuất ra biển số xe

def detect_and_recognize_plate(image_url):
    """
    Hàm này thực hiện các bước:
    1. Tải ảnh từ URL
    2. Dùng YOLOv8 để phát hiện biển số xe
    3. Cắt vùng biển số ra khỏi ảnh gốc
    4. Dùng VietOCR để nhận diện chữ trên biển số
    """
    # 🔹 Bước 1: Tải ảnh từ URL
    resp = urllib.request.urlopen(image_url)
    image_array = np.asarray(bytearray(resp.read()), dtype=np.uint8)
    image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # Chuyển BGR -> RGB

    # 🔹 Bước 2: Dự đoán biển số bằng YOLOv8
    results = model(image)

    # 🔹 Bước 3: Duyệt qua các bounding boxes và nhận diện biển số
    for result in results:
        for box in result.boxes:
            x1, y1, x2, y2 = map(int, box.xyxy[0])  # Lấy tọa độ bounding box

            # Cắt biển số từ ảnh
            license_plate = image_rgb[y1:y2, x1:x2]

            # Hiển thị ảnh biển số
            plt.figure(figsize=(4, 2))
            plt.imshow(license_plate)
            plt.axis("off")
            plt.title("License Plate")
            plt.show()

            # 🔹 Chuyển ảnh sang định dạng phù hợp cho VietOCR (PIL Image)
            license_plate_pil = Image.fromarray(license_plate)

            # 🔹 Nhận diện chữ trên biển số
            text = vietocr_model.predict(license_plate_pil)
            print("🚘 Biển số xe:", text)
url = "https://img.tinxe.vn/crop/620x324/2020/07/04/vwnbOqjE/otoso1-lam-bien-so-dai-1-7111.jpg"
resp = urllib.request.urlopen(url)
image_array = np.asarray(bytearray(resp.read()), dtype=np.uint8)

# Chuyển đổi sang ảnh OpenCV
image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)

# Chuyển từ BGR -> RGB để hiển thị đúng màu
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Hiển thị ảnh gốc
plt.figure(figsize=(8, 6))
plt.imshow(image_rgb)
plt.axis("off")
plt.title("Original Image")
plt.show()

Hiển thị kết quả ngay trên colab

# Predict với YOLOv8
results = model(image)

# Hiển thị kết quả trực tiếp
for result in results:
    result.show()  # Hiển thị ngay trên Colab

Kết quả được

image.png

Lấy toạ độ ảnh

for result in results:
    for box in result.boxes:
        x1, y1, x2, y2 = map(int, box.xyxy[0])  # Lấy tọa độ (xmin, ymin, xmax, ymax)

        # Cắt biển số ra khỏi ảnh gốc
        license_plate = image_rgb[y1:y2, x1:x2]

        # Hiển thị ảnh biển số
        plt.figure(figsize=(4, 2))
        plt.imshow(license_plate)
        plt.axis("off")
        plt.title("License Plate")
        plt.show()

Đọc ảnh và nhận diện ký tự

image.png

Kết quả đầu ra là chuỗi ký tự của biển số.

5. Cải thiện độ chính xác

Tiền xử lý ảnh: Dùng OpenCV để tăng độ tương phản, giảm nhiễu. Tăng dữ liệu: Sử dụng augmentation để đa dạng hóa ảnh train. Fine-tuning VietOCR: Huấn luyện lại mô hình với tập dữ liệu biển số xe thực tế.

6. Kết luận

Bài viết này đã giới thiệu cách xây dựng hệ thống nhận diện biển số xe bằng YOLOv8 và VietOCR. Hệ thống có thể áp dụng cho các bài toán thực tế như kiểm soát giao thông và bãi đỗ xe. Trong bài viết tiếp theo, mình sẽ hướng dẫn cách triển khai mô hình trên môi trường thực tế.

P/S

Bài viết lấy của tác giả Phạm Hiệp tại group fb: Helios Community


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí