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
- link data train: https://universe.roboflow.com/computer-vison-4zhos/license-plate-recognition-kvr7y
- link file google colab để mn tiện theo dõi hoặc chạy lại: https://colab.research.google.com/drive/17t5leH5MVEoj0wLdLJX5iPQTb-UV_s3n?usp=sharing
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
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ự
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