Hệ thống phát hiện loại phương tiện dựa trên YOLOv10 với giao diện đồ họa và xử lý đa dạng

Một hệ thống phát hiện đối tượng chuyên biệt cho bảy loại phương tiện giao thông, được xây dựng trên nền tảng mô hình YOLOv10 — phiên bản mới nhất trong dòng kiến trúc You Only Look Once. Hệ thống không chỉ xác định vị trí mà còn phân loại chính xác các đối tượng thành: xe con cỡ nhỏ, xe con trung bình, xe con lớn, xe tải nhẹ, xe tải nặng, xetankphương tiện đặc chủng. Với độ chính xác đạt 99.1% trên tập kiểm thử, giải pháp phù hợp cho các ứng dụng giám sát giao thông thực thời, quản lý an ninh khu vực trọng yếu và tối ưu hóa luồng vận chuyển logistics.

Tính năng vận hành

  • Xử lý ảnh tĩnh: Hỗ trợ tải và phân tích từng ảnh riêng lẻ hoặc hàng loạt từ thư mục — kết quả hiển thị trực quan kèm bounding box và nhãn lớp.
  • Phân tích video: Đọc từng khung hình của tệp MP4/AVI, áp dụng suy luận mô hình và xuất video đã đánh dấu hoặc hiển thị trực tiếp trên giao diện.
  • Giám sát thời gian thực: Kết nối camera USB để phân tích luồng video liên tục, cập nhật kết quả mỗi khung hình với độ trễ dưới 50ms trên GPU.

Cấu trúc dữ liệu huấn luyện

Dữ liệu được tổ chức theo chuẩn định dạng YOLO v8–v10, gồm 2206 ảnh được chia theo tỷ lệ 67.5% (1488 ảnh), 23% (507 ảnh) và 1.4% (31 ảnh) cho các tập huấn luyện, xác thực và kiểm thử. Mỗi ảnh đi kèm file nhãn *.txt chứa tọa độ chuẩn hóa theo định dạng:

<class_id> <x_center_norm> <y_center_norm> <width_norm> <height_norm>

Tập dữ liệu đảm bảo tính đa dạng về điều kiện ánh sáng (ban ngày, hoàng hôn, ban đêm), góc quan sát (mặt trước, hông, góc chéo), bối cảnh (đường đô thị, cao tốc, khu công nghiệp) và mật độ giao thông — giúp mô hình duy trì độ ổn định khi triển khai ngoài thực tế.

Cài đặt môi trường

Khuyến nghị sử dụng môi trường ảo Python 3.9 để tránh xung đột phụ thuộc:

conda create -n vehicle-detector python=3.9
conda activate vehicle-detector
pip install ultralytics opencv-python PyQt5 numpy pillow

Huấn luyện mô hình

Sử dụng mã lệnh sau để khởi chạy quá trình huấn luyện với cấu hình tùy chỉnh:

from ultralytics import YOLOv10

model = YOLOv10('yolov10s.pt')  # Khởi tạo từ trọng số tiền huấn luyện
results = model.train(
    data='datasets/data.yaml',
    epochs=500,
    batch=64,
    imgsz=640,
    device=0,           # GPU ID hoặc 'cpu'
    workers=4,
    project='training_runs',
    name='vehicle_v10_s',
    patience=50         # Dừng sớm nếu không cải thiện sau 50 epoch
)

Các biến thể mô hình hỗ trợ lựa chọn linh hoạt theo yêu cầu phần cứng và hiệu năng:

  • yolov10n.pt: Mô hình nano — tối ưu cho thiết bị edge (Jetson Nano, Raspberry Pi).
  • yolov10s.pt: Cân bằng giữa tốc độ và độ chính xác — khuyến nghị cho máy chủ trung bình.
  • yolov10l.pt: Mô hình lớn — dành cho hệ thống GPU mạnh, ưu tiên độ chính xác tuyệt đối.

Giao diện người dùng đồ họa

Giao diện được xây dựng bằng PyQt5, tích hợp hoàn chỉnh các chức năng tương tác:

  • Bảng điều khiển thao tác: nút mở ảnh/video, bật/tắt camera, lưu kết quả.
  • Hiển thị hình ảnh đầu ra với bounding box màu sắc phân biệt theo lớp.
  • Bảng thống kê chi tiết từng phát hiện: tên lớp, độ tin cậy (%), tọa độ bounding box (xmin, ymin, xmax, ymax).
  • Hộp chọn đối tượng để phóng to/xem chi tiết từng mục trong khung hình.
  • Thanh tiến trình tự động cập nhật khi xuất video kết quả.

Đoạn mã xử lý chính

Đoạn logic xử lý ảnh và cập nhật giao diện được thiết kế theo mô hình phân lớp rõ ràng:

def process_single_image(self, image_path: str):
    start_time = time.perf_counter()
    results = self.detector(image_path)[0]
    inference_time = time.perf_counter() - start_time
    
    # Trích xuất thông tin phát hiện
    boxes = results.boxes.xyxy.cpu().numpy().astype(int)
    classes = results.boxes.cls.cpu().numpy().astype(int)
    confidences = (results.boxes.conf.cpu().numpy() * 100).round(2)
    
    # Vẽ kết quả lên ảnh gốc
    annotated_img = results.plot()
    
    # Cập nhật UI
    self.update_display(annotated_img)
    self.update_statistics(len(boxes), classes, confidences, inference_time)
    self.populate_detection_table(boxes, classes, confidences, image_path)

def update_display(self, cv2_img: np.ndarray):
    h, w = cv2_img.shape[:2]
    scale = min(self.display_width / w, self.display_height / h)
    resized = cv2.resize(cv2_img, (int(w * scale), int(h * scale)))
    qimg = tools.cv2_to_qpixmap(resized)
    self.ui.image_label.setPixmap(qimg)

def populate_detection_table(self, boxes, classes, confs, path):
    self.ui.result_table.setRowCount(0)
    for idx, (box, cls_id, conf) in enumerate(zip(boxes, classes, confs)):
        row = self.ui.result_table.rowCount()
        self.ui.result_table.insertRow(row)
        
        self.ui.result_table.setItem(row, 0, QTableWidgetItem(str(idx + 1)))
        self.ui.result_table.setItem(row, 1, QTableWidgetItem(os.path.basename(path)))
        self.ui.result_table.setItem(row, 2, QTableWidgetItem(Config.CLASS_NAMES[cls_id]))
        self.ui.result_table.setItem(row, 3, QTableWidgetItem(f"{conf}%"))
        self.ui.result_table.setItem(row, 4, QTableWidgetItem(str(box.tolist())))

Cấu hình dữ liệu

Tập tin datasets/data.yaml định nghĩa đường dẫn và siêu tham số lớp:

train: ./datasets/images/train
val: ./datasets/images/val
test: ./datasets/images/test

nc: 7
names: ["tiny-car", "mid-car", "big-car", "small-truck", "big-truck", "oil-truck", "special-car"]

Thẻ: yolov10 PyQt5 computer-vision object-detection vehicle-classification

Đăng vào ngày 20 tháng 7 lúc 00:50