- vừa được xem lúc

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

0 0 1

Người đăng: Văn Minh Lê

Theo Viblo Asia

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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Các thuật toán cơ bản trong AI - Phân biệt Best First Search và Uniform Cost Search (UCS)

Nếu bạn từng đọc các thuật toán trong AI (Artificial Intelligence - Trí tuệ nhân tạo), rất có thể bạn từng nghe qua về các thuật toán tìm kiếm cơ bản: UCS (thuộc chiến lược tìm kiếm mù) và Best First Search (thuộc chiến lược tìm kiếm kinh nghiệm). Khác nhau rõ từ khâu phân loại rồi, thế nhưng hai th

0 0 170

- vừa được xem lúc

Con đường AI của tôi

Gần đây, khá nhiều bạn nhắn tin hỏi mình những câu hỏi đại loại như: có nên học AI, bắt đầu học AI như nào, làm sao tự học cho đúng, cho nhanh, học không bị nản, lộ trình học AI như nào... Sau nhiều lần trả lời, mình nghĩ rằng nên viết hẳn một bài để trả lời chi tiết hơn, cũng như để các bạn sau này

0 0 159

- vừa được xem lúc

[ChatterBot] Thư viện chatbot hay ho dành cho Python| phần 3

Trong bài trước mình đã trình bày về Training data cho chatbot và tiền xử lý dữ liệu. Trong phần này sẽ trình bày với các bạn về logic adapter.

0 0 62

- vừa được xem lúc

[Deep Learning] Kỹ thuật Dropout (Bỏ học) trong Deep Learning

. Trong bài viết này, mình xin phép giới thiệu về Dropout (Bỏ học) trong mạng Neural, sau đó là mình sẽ có 1 số đoạn code để xem Dropout ảnh hưởng thế nào đến hiệu suất của mạng Neural. 1.1. Dropout trong mạng Neural là gì.

0 0 69

- vừa được xem lúc

Kỹ thuật Dropout (Bỏ học) trong Deep Learning

Trong bài viết này, mình xin phép giới thiệu về Dropout (Bỏ học) trong mạng Neural, sau đó là mình sẽ có 1 số đoạn code để xem Dropout ảnh hưởng thế nào đến hiệu suất của mạng Neural. 1.

0 1 82

- vừa được xem lúc

Blockchain dưới con mắt làng Vũ Đại 4.0

Mở bài. Hey nhô các bạn, lại là mình đây .

0 0 51