Hệ thống Phát hiện Mũ Bảo Hiểm cho Xe Máy dựa trên Học sâu

Hệ thống Phát hiện Mũ Bảo Hiểm cho Xe Máy dựa trên Học sâu

Bài viết này giới thiệu một hệ thống phát hiện mũ bảo hiểm cho người lái xe máy, sử dụng kiến trúc YOLOv12. Hệ thống này có khả năng xác định xem người điều khiển xe máy có đội mũ bảo hiểm hay không. Chúng tôi cũng sẽ giải thích về các mô-đun mới của YOLOv12. Tương tự như các nội dung trước, hướng dẫn này bao gồm bộ dữ liệu đã được gán nhãn, các mô hình đã được huấn luyện (yolov5, yolov8, yolo11, yolo12), và một giao diện đồ họa. Bộ dữ liệu của chúng tôi bao gồm các lớp sau:

        ['helmet', 'without', 'two_wheeler']
        Đội mũ bảo hiểm  Không đội mũ bảo hiểm  Xe máy
    

Hệ thống hỗ trợ phát hiện trên video và hình ảnh.

Thực hiện Dự án

Trước khi bắt đầu dự án, hãy đảm bảo bạn đã cài đặt PyTorch và Miniconda.

Để cấu hình môi trường, vui lòng tham khảo: Python project configuration preparation

Lưu ý: Trước khi cấu hình, bạn cần tải gói tài nguyên của dự án. Bạn có thể tìm thấy gói tài nguyên trong phần bình luận được ghim ở trên hoặc trong blog được liên kết.

Lưu ý: Chúng tôi khuyến nghị bộ sưu tập các dự án lớn, bộ sưu tập này bao gồm tất cả các tệp tài nguyên của loạt dự án lớn và một lần gỡ lỗi từ xa!!!

Cấu hình Môi trường

Cấu hình môi trường: YOLO series code environment configuration unified process

Đào tạo Mô hình Cục bộ

Kịch bản đào tạo mô hình được sử dụng là `step1_start_train.py`. Trước khi đào tạo mô hình, hãy đảm bảo bạn đã cấu hình bộ dữ liệu cục bộ của mình. Bộ dữ liệu nằm trong thư mục `ultralytics\cfg\datasets\A_my_data.yaml`, bạn cần thay thế thư mục gốc của bộ dữ liệu bằng thư mục cục bộ của mình.

Sau khi thay đổi, hãy sửa đổi đường dẫn tệp cấu hình trong kịch bản đào tạo và bắt đầu đào tạo bằng cách nhấp chuột phải.

Trước khi đào tạo bắt đầu, nếu có lỗi, rất có thể là do đường dẫn bộ dữ liệu không được cấu hình chính xác. Vui lòng kiểm tra đường dẫn bộ dữ liệu và đảm bảo cấu hình bộ dữ liệu không có vấn đề. Kết quả đào tạo sẽ được lưu trong thư mục `runs`.

Đào tạo trên Máy chủ GPU (Tùy chọn)

Hiện tại, bạn có thể sử dụng dịch vụ GPU của Lanyun. Chúng tôi khuyến nghị bạn sử dụng nền tảng GPU đám mây này để đào tạo. Người dùng mới đăng ký sẽ nhận được 30 nhân dân tệ tiền giảm giá.

Địa chỉ đăng ký: Lanyun GPU Cloud Platform

Hướng dẫn sử dụng máy chủ: Hand-in-hand teaching you how to use a server to train AI models

Kiểm tra Mô hình

Kiểm tra mô hình chủ yếu là để tính toán các chỉ số như mAP, độ chính xác (p), độ phủ (r). Kịch bản được sử dụng là `step2_start_val.py`. Mô hình đã thực hiện kiểm tra trong vòng cuối cùng của quá trình đào tạo, vì vậy bước này có thể được bỏ qua. Tuy nhiên, một số bạn có thể muốn kiểm tra riêng, bạn chỉ cần thay đổi trọng số trong kịch bản kiểm tra thành đường dẫn trọng số của mô hình bạn đã đào tạo.

Gói Giao diện Đồ họa

Giao diện đồ họa đã được nâng cấp. Lần này, chúng tôi sử dụng PySide6 để phát triển giao diện đồ họa. **PySide6** là một thư viện Python mã nguồn mở, đây là trình liên kết Python của khung Qt 6. Qt là một khung phát triển ứng dụng đa nền tảng, chủ yếu được sử dụng để phát triển các ứng dụng giao diện người dùng đồ họa (GUI), đồng thời cung cấp nhiều chức năng để xử lý các tác vụ không đồ họa (như cơ sở dữ liệu, lập trình mạng, v.v.). PySide6 cho phép nhà phát triển viết các ứng dụng Qt 6 bằng Python, do đó, nó cung cấp sự linh hoạt của Python và sức mạnh của Qt 6. Giao diện đồ họa cung cấp nhiều chức năng như phát hiện hình ảnh và video. Chương trình giao diện đồ họa là `step3_start_window_track.py`.

Nếu bạn đào tạo lại mô hình, bạn cần thay thế nó bằng mô hình của riêng mình.

Nếu bạn muốn sửa đổi tiêu đề, logo của giao diện đồ họa, bạn chỉ cần sửa đổi các biến toàn cục ở đây.

Đăng nhập và tải lên hình ảnh hoặc video để phát hiện.

Gói Giao diện Web

Đối với gói giao diện web, tệp Python tương ứng là `web_demo.py`. Chúng tôi chủ yếu sử dụng Gradio để phát triển. Mã chi tiết như sau:


import gradio as gr
import PIL.Image as Image

from ultralytics import ASSETS, YOLO

# Khởi tạo mô hình YOLO, thay đổi đường dẫn đến mô hình của bạn
model = YOLO("runs/yolo11s/weights/best.pt") 

def predict_image(img, conf_threshold, iou_threshold):
    """Dự đoán các đối tượng trong hình ảnh sử dụng mô hình YOLO11 với ngưỡng độ tin cậy và IOU có thể điều chỉnh."""
    results = model.predict(
        source=img,
        conf=conf_threshold,
        iou=iou_threshold,
        show_labels=True,
        show_conf=True,
        imgsz=640,
    )

    # Lấy kết quả đầu tiên
    r = results[0]
    im_array = r.plot()
    im = Image.fromarray(im_array[..., ::-1]) # Chuyển đổi từ BGR sang RGB

    return im

# Tạo giao diện Gradio
iface = gr.Interface(
    fn=predict_image,
    inputs=[
        gr.Image(type="pil", label="Tải lên Hình ảnh"),
        gr.Slider(minimum=0, maximum=1, value=0.25, label="Ngưỡng Độ tin cậy"),
        gr.Slider(minimum=0, maximum=1, value=0.45, label="Ngưỡng IOU"),
    ],
    outputs=gr.Image(type="pil", label="Kết quả"),
    title="Chào mừng đến với Phát hiện Đối tượng từ Góc nhìn Máy bay không người lái dựa trên YOLOv11",
    description="Tải lên hình ảnh để suy luận.",
)

if __name__ == "__main__":
    iface.launch()
    

Tài liệu

Bối cảnh và Ý nghĩa

Với sự phổ biến của xe máy, vấn đề an toàn khi lái xe ngày càng trở nên nổi bật, trong đó việc đội mũ bảo hiểm là biện pháp quan trọng để giảm thương vong do tai nạn giao thông. Tuy nhiên, việc giám sát thủ công truyền thống có hiệu quả thấp và không bao phủ toàn diện. Hệ thống phát hiện dựa trên YOLOv12 kết hợp với PySide giúp thực hiện giám sát tự động, lấp đầy khoảng trống của việc kiểm tra thủ công. Hệ thống hỗ trợ phát hiện hình ảnh/video thời gian thực và ghi lại nhật ký, thích ứng với các tình huống giao thông phức tạp (như thay đổi ánh sáng, che khuất, v.v.), là một phần mở rộng công nghệ quan trọng của quản lý giao thông thông minh.

Cải thiện an toàn đường bộ: Bằng cách nhận dạng hành vi không đội mũ bảo hiểm và ghi lại nhật ký, có thể cảnh báo kịp thời hoặc hỗ trợ thực thi pháp luật, giảm nguy cơ chấn thương đầu. Dữ liệu cho thấy, đội mũ bảo hiểm có thể giảm khoảng 70% khả năng bị thương nặng ở đầu.

Quản lý thông minh: Hệ thống cung cấp dữ liệu hỗ trợ cho các cơ quan giao thông (như thống kê tỷ lệ đội mũ theo khu vực), giúp tối ưu hóa phân bổ nguồn lực thực thi pháp luật và xây dựng chính sách.

Giá trị kỹ thuật: Các thuật toán cải tiến của YOLOv12 (như hợp nhất đặc trưng, cơ chế chú ý) đã cải thiện độ chính xác và tính thời gian thực của việc phát hiện, cung cấp tài liệu tham khảo kỹ thuật cho các nhiệm vụ phát hiện an toàn khác (như nhận dạng dây an toàn).

Lợi ích xã hội: Việc ứng dụng lâu dài có thể hình thành thói quen đội mũ bảo hiểm cho công chúng, thúc đẩy xây dựng văn hóa an toàn giao thông.

Hệ thống kết hợp học sâu với phát triển GUI, vừa có tính thực tiễn vừa có khả năng mở rộng, là một trường hợp điển hình của việc áp dụng công nghệ để giải quyết nhu cầu xã hội.

Tổng quan về các Tài liệu Liên quan

Bối cảnh kỹ thuật và tiến hóa thuật toán
Gần đây, những tiến bộ của học sâu trong lĩnh vực phát hiện đối tượng đã cung cấp giải pháp hiệu quả cho việc phát hiện mũ bảo hiểm cho xe máy. Do khả năng thời gian thực và độ chính xác cao, các thuật toán YOLO đã trở thành lựa chọn chính. Trong quá trình phát triển từ YOLOv5 đến YOLOv10n, các nhà nghiên cứu đã liên tục tối ưu hóa hiệu suất bằng cách giới thiệu các mô-đun nhẹ (như VanillaNet), cải thiện hàm mất mát (như MPDIoU) và công nghệ hợp nhất đặc trưng đa tỷ lệ (như CARAFE upsampling). Ví dụ, mô hình YOLOv8s cải tiến đạt độ chính xác trung bình (mAP) 95.6% trong các tình huống phức tạp, tốc độ phát hiện tăng lên 102 khung hình/giây. YOLOv12, phiên bản mới nhất, có thể kế thừa các tối ưu hóa này và tăng cường khả năng trích xuất đặc trưng, nhưng cần xác minh chi tiết các cải tiến cụ thể để xác nhận lợi thế của nó.

Thực hiện hệ thống và tích hợp khung
Các nghiên cứu hiện có thường sử dụng các khung GUI như PyQt5 hoặc PySide để phát triển hệ thống phát hiện, hỗ trợ đầu vào hình ảnh/video, phát hiện thời gian thực và hiển thị kết quả. Ví dụ, hệ thống dựa trên YOLOv8s của Yuan Yule đã sử dụng PyQt5 để thực hiện giao diện tương tác thân thiện với người dùng và tích hợp công cụ gán nhãn dữ liệu (như LabelImg) để xây dựng bộ dữ liệu đa dạng. Tương tự, hệ thống của bạn sử dụng PySide để phát triển, phù hợp với xu hướng kỹ thuật hiện tại, và chức năng ghi nhật ký có thể truy xuất kết quả phát hiện, cung cấp hỗ trợ dữ liệu cho quản lý giao thông. Một số nghiên cứu cũng kết hợp ước lượng tư thế cơ thể (như YOLOPOSE) để định vị khu vực đầu, nâng cao độ chính xác khớp mũ lên 95.6%.

Thách thức ứng dụng và hướng tối ưu hóa
Trong quá trình triển khai thực tế, thay đổi ánh sáng, che khuất và các đối tượng nhỏ (như mũ bảo hiểm ở khoảng cách xa) vẫn là những thách thức chính. Các nhà nghiên cứu đã cải thiện độ bền của mô hình bằng cách tăng cường dữ liệu (như xoay, cắt), cơ chế chú ý và mô-đun Transformer. Ví dụ, thuật toán YOLOv10n cải tiến đã tăng cường khả năng phát hiện trong môi trường phức tạp bằng cách hợp nhất thông tin đa phương thức (như âm thanh, nhận dạng sinh trắc học). Ngoài ra, thiết kế nhẹ và khả năng triển khai trên thiết bị nhúng trở thành trọng tâm tối ưu hóa để đáp ứng nhu cầu triển khai trên thiết bị nhúng.

Giá trị xã hội và xu hướng tương lai
Loại hệ thống này cho thấy tiềm năng rộng lớn trong các lĩnh vực như giao thông thông minh, an toàn tại công trường. Ví dụ, đội của Huang Shize đã kết hợp phát hiện mũ bảo hiểm với thực thi giao thông, tối ưu hóa chiến lược thực thi bằng phân tích thống kê. Các nghiên cứu trong tương lai có thể tập trung vào học không giám sát để giảm sự phụ thuộc vào gán nhãn, hợp nhất đa cảm biến (như LiDAR) để nâng cao khả năng phát hiện 3D, và tích hợp liền mạch với các nền tảng thành phố thông minh.

Hệ thống của bạn dựa trên YOLOv12 và PySide, phù hợp với xu hướng kỹ thuật hiện tại. Trong tương lai, bạn có thể tham khảo các hướng tối ưu hóa (như giới thiệu cơ chế chú ý hoặc thiết kế nhẹ) để cải thiện hiệu suất hơn nữa. Đồng thời, cần chú ý đến dữ liệu thử nghiệm trong tình huống thực tế để xác minh khả năng tổng quát của nó trong các môi trường phức tạp.

Giới thiệu về Thuật toán

Giới thiệu về thuật toán YOLOv12

Thuật toán YOLOv12 đã được tinh chỉnh trên cơ sở YOLOv11, giới thiệu một kiến trúc tập trung vào cơ chế chú ý, khác với phương pháp truyền thống dựa trên CNN được sử dụng trong các mô hình YOLO trước đây, nhưng vẫn giữ được tốc độ suy luận thời gian thực cần thiết cho nhiều ứng dụng. Mô hình này đạt được độ chính xác phát hiện đối tượng tiên tiến nhất bằng cách đổi mới phương pháp đối với cơ chế chú ý và kiến trúc mạng tổng thể, đồng thời duy trì hiệu suất thời gian thực.

  • Cơ chế chú ý vùng (Area Attention): Một phương pháp tự chú ý mới, có khả năng xử lý trường nhìn lớn hiệu quả. Nó có thể chia biểu đồ đặc trưng theo chiều ngang hoặc chiều dọc thành *l* vùng có kích thước bằng nhau (mặc định là 4), từ đó tránh các phép toán phức tạp và duy trì trường nhìn hiệu quả lớn. So với chú ý tự thân tiêu chuẩn, điều này làm giảm đáng kể chi phí tính toán.
  • Mạng tổng hợp lớp hiệu quả còn lại (R-ELAN): Một mô-đun hợp nhất đặc trưng dựa trên ELAN được cải tiến, nhằm giải quyết các vấn đề tối ưu hóa, đặc biệt là trong các mô hình lớn tập trung vào chú ý. R-ELAN giới thiệu:
    • Kết nối còn lại ở cấp độ khối có chức năng tỷ lệ (tương tự như tỷ lệ lớp).
    • Phương pháp hợp nhất đặc trưng được thiết kế lại để tạo ra cấu trúc giống như cổ chai.
  • Tối ưu hóa kiến trúc chú ý: YOLOv12 đơn giản hóa cơ chế chú ý tiêu chuẩn để tăng hiệu quả và tương thích với khung YOLO. Điều này bao gồm:
    • Sử dụng FlashAttention để giảm chi phí truy cập bộ nhớ.
    • Loại bỏ mã hóa vị trí, làm cho mô hình gọn gàng và nhanh hơn.
    • Điều chỉnh tỷ lệ MLP (từ 4 thường thấy thành 1.2 hoặc 2) để cân bằng tốt hơn giữa lớp chú ý và lớp truyền thẳng.
    • Giảm độ sâu của khối xếp chồng, cải thiện hiệu quả tối ưu hóa.
    • Sử dụng có chọn lọc các phép toán tích chập để tăng hiệu quả tính toán.
    • Thêm phép tích chập tách rời 7x7 ("bộ nhận biết vị trí") vào cơ chế chú ý để mã hóa thông tin vị trí một cách ngầm định.

Về mặt tệp cấu hình, sự khác biệt giữa nó và YOLOv11 khá nhỏ, chủ yếu thể hiện trong khu vực được đánh dấu bằng hộp đỏ trong hình dưới đây.

Trong đó, A2C2F là mô-đun chính được đề xuất trong YOLOv12, trong đó A đại diện cho Area Attention. Để khắc phục vấn đề chi phí tính toán cao của cơ chế chú ý tự thân truyền thống, YOLOv12 thông qua mô-đun chú ý vùng (Area Attention, A2), chia biểu đồ đặc trưng có độ phân giải (H, W) thành l vùng có kích thước (H/l, W) hoặc (H, W/l). Điều này loại bỏ việc phân vùng cửa sổ rõ ràng, chỉ cần thao tác định hình đơn giản, từ đó đạt được tốc độ nhanh hơn. Giá trị mặc định của l được đặt là 4, làm giảm trường nhìn xuống 1/4 ban đầu, nhưng vẫn duy trì trường nhìn lớn. Bằng cách này, chi phí tính toán của cơ chế chú ý giảm từ 2n²hd xuống còn 1/2n²hd. Mặc dù có độ phức tạp n², nhưng khi n được cố định là 640 (n sẽ tăng nếu độ phân giải đầu vào tăng), nó vẫn đủ hiệu quả để đáp ứng yêu cầu thời gian thực của hệ thống YOLO. A2 giảm chi phí tính toán của cơ chế chú ý trong khi vẫn duy trì trường nhìn lớn, cải thiện đáng kể độ chính xác phát hiện. Như hình dưới đây, khu vực bên phải biểu thị cơ chế chú ý được đề xuất, tương đương với việc bắt được các vùng liên quan với chi phí tính toán thấp.

Đây là triển khai của Area Attention:


import torch
import torch.nn as nn

class ABlock(nn.Module):
    """Mô-đun ABlock đơn giản để minh họa."""
    def __init__(self, in_channels, out_channels, mlp_ratio, area):
        super().__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)
        self.mlp = nn.Sequential(
            nn.Linear(out_channels, int(out_channels * mlp_ratio)),
            nn.ReLU(),
            nn.Linear(int(out_channels * mlp_ratio), out_channels)
        )
        self.area = area

    def forward(self, x):
        # Giả lập cơ chế chú ý vùng bằng cách xử lý từng vùng
        batch_size, channels, height, width = x.shape
        x = x.view(batch_size, channels, self.area, height // self.area, width)
        x = x.permute(0, 2, 1, 3, 4) # (B, A, C, H/A, W)
        x = x.reshape(batch_size * self.area, channels, height // self.area, width)
        x = self.conv(x)
        x = self.mlp(x.mean(dim=[2, 3])) # Giả lập xử lý MLP
        x = x.view(batch_size, self.area, channels, 1, 1)
        x = x.permute(0, 2, 1, 3, 4) # (B, C, A, 1, 1)
        x = x.reshape(batch_size, channels, self.area)
        return x

class A2C2f(nn.Module):
    """
    Mô-đun A2C2f với cơ chế chú ý vùng để trích xuất đặc trưng được cải thiện.

    Mô-đun này mở rộng kiến trúc C2f bằng cách kết hợp chú ý vùng và các lớp ABlock để xử lý đặc trưng tốt hơn.
    Nó hỗ trợ cả chế độ chú ý vùng và chế độ tích chập tiêu chuẩn.

    Thuộc tính:
        cv1 (Conv): Lớp tích chập 1x1 ban đầu làm giảm số kênh đầu vào xuống số kênh ẩn.
        cv2 (Conv): Lớp tích chập 1x1 cuối cùng xử lý các đặc trưng đã nối.
        gamma (nn.Parameter | None): Tham số có thể học để tỷ lệ phần còn lại khi sử dụng chú ý vùng.
        m (nn.ModuleList): Danh sách các lớp ABlock hoặc C3k để xử lý đặc trưng.

    Phương thức:
        forward: Xử lý đầu vào qua đường dẫn chú ý vùng hoặc tích chập tiêu chuẩn.
    """
    def __init__(self, c1, c2, n=1, a2=True, area=1, residual=False, mlp_ratio=2.0, e=0.5, g=1, shortcut=True):
        super().__init__()
        c_ = int(c2 * e)  # số kênh ẩn
        assert c_ % 32 == 0, "Kích thước của ABlock phải là bội số của 32."

        self.cv1 = nn.Conv2d(c1, c_, 1, 1)
        self.cv2 = nn.Conv2d((1 + n) * c_, c2, 1)

        self.gamma = nn.Parameter(0.01 * torch.ones(c2), requires_grad=True) if a2 and residual else None
        self.m = nn.ModuleList(
            nn.Sequential(ABlock(c_, c_ // 32, mlp_ratio, area) for _ in range(n))
            if a2
            else nn.Sequential(nn.Conv2d(c_, c_, 3, 1, 1) for _ in range(n))
        )

    def forward(self, x):
        y = [self.cv1(x)]
        for m in self.m:
            y.append(m(y[-1]))
        y = self.cv2(torch.cat(y, dim=1))
        if self.gamma is not None:
            return x + self.gamma.view(-1, len(self.gamma), 1, 1) * y
        return y
    

Giới thiệu về thuật toán YOLOv11

YOLO series đã trở nên rất nổi tiếng trong ngành. Dưới đây là biểu đồ hiệu suất của YOLOv11, trong đó trục ngang là tốc độ của mô hình, thường được điều chỉnh bằng cách thay đổi độ sâu và chiều rộng của tích chập, và trục tung biểu thị độ chính xác của mô hình. Có thể thấy rằng YOLOv11 thể hiện độ chính xác cao hơn ở cùng tốc độ.

Cấu trúc cốt lõi của YOLO bao gồm ba thành phần cơ bản. Đầu tiên, bộ xương (backbone) đóng vai trò là bộ trích xuất đặc trưng chính, sử dụng mạng nơ-ron tích chập để chuyển đổi dữ liệu hình ảnh thô thành các bản đồ đặc trưng đa tỷ lệ. Thứ hai, thành phần cổ (neck) đóng vai trò là giai đoạn xử lý trung gian, sử dụng các lớp chuyên dụng để tổng hợp và tăng cường các biểu diễn đặc trưng ở các tỷ lệ khác nhau. Thứ ba, thành phần đầu (head) đóng vai trò là cơ chế dự đoán, tạo ra đầu ra cuối cùng về vị trí và phân loại đối tượng dựa trên các bản đồ đặc trưng được tinh chỉnh. Dựa trên kiến trúc đã thiết lập này, YOLOv11 mở rộng và tăng cường nền tảng do YOLOv8 tạo ra, giới thiệu các đổi mới kiến trúc và tối ưu hóa tham số để đạt được hiệu suất phát hiện xuất sắc như được hiển thị trong Hình 1. Dưới đây là các tác vụ mà mô hình YOLOv11 có thể hỗ trợ: phát hiện đối tượng, phân đoạn thể hiện, phân loại đối tượng, ước lượng tư thế, phát hiện đối tượng quay và theo dõi đối tượng. Nếu bạn muốn chọn một thuật toán học sâu để bắt đầu, YOLOv11 sẽ là lựa chọn tuyệt vời của bạn.

Để giúp mọi người hiểu rõ hơn về mạng YOLOv11, chúng tôi sẽ phân tích cấu trúc của nó.

Đầu tiên là tổng quan cấu trúc mạng YOLOv11, trong đó phần backbone chịu trách nhiệm trích xuất đặc trưng cơ bản, phần neck chịu trách nhiệm hợp nhất đặc trưng, và phần head chịu trách nhiệm giải mã, cho phép mạng của bạn thích ứng với các tác vụ thị giác máy tính khác nhau.

  • Bộ xương (Backbone)
    • Conv

      Mô-đun tích chập là một mô-đun tích chập thông thường, được sử dụng rất nhiều trong YOLO, có thể thiết kế kích thước và bước nhảy của tích chập, chi tiết triển khai mã như sau:

      
      class Conv(nn.Module):
          """Tích chập tiêu chuẩn với các đối số (ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""
      
          default_act = nn.SiLU()  # hàm kích hoạt mặc định
      
          def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
              """Khởi tạo lớp Conv với các đối số đã cho bao gồm hàm kích hoạt."""
              super().__init__()
              self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
              self.bn = nn.BatchNorm2d(c2)
              self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()
      
          def forward(self, x):
              """Áp dụng tích chập, chuẩn hóa theo lô và kích hoạt cho tensor đầu vào."""
              return self.act(self.bn(self.conv(x)))
      
          def forward_fuse(self, x):
              """Thực hiện tích chập chuyển vị của dữ liệu 2D."""
              return self.act(self.conv(x))
                          
    • C3k2

      Mô-đun C3k2 được đặt trong một số kênh của đầu, được sử dụng để xử lý các đặc trưng đa tỷ lệ ở các độ sâu khác nhau. Ưu điểm của nó là hai mặt. Mặt một, mô-đun này cung cấp xử lý nhanh hơn: so với một tích chập lớn duy nhất, việc sử dụng hai tích chập nhỏ hơn có thể giảm chi phí tính toán, từ đó trích xuất đặc trưng nhanh hơn. Mặt hai, mô-đun này cung cấp hiệu quả tham số tốt hơn: C3k2 là phiên bản gọn gàng hơn của cổ CSP, làm cho kiến trúc hiệu quả hơn về số lượng tham số có thể huấn luyện.

      Mô-đun C3k2 chủ yếu nhằm tăng cường sự đa dạng của đặc trưng, mô-đun này được phát triển từ mô-đun C3k. Nó cung cấp sự linh hoạt được tăng cường bằng cách cho phép tùy chỉnh kích thước kernel. Sự thích ứng của C3k rất hữu ích để trích xuất các đặc trưng chi tiết hơn từ hình ảnh, giúp cải thiện độ chính xác phát hiện. C3k được triển khai như sau.

      
      class C3k(C3):
          """C3k là mô-đun cổ CSP với kích thước kernel có thể tùy chỉnh để trích xuất đặc trưng trong mạng nơ-ron."""
      
          def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5, k=3):
              """Khởi tạo mô-đun C3k với các kênh được chỉ định, số lớp và cấu hình."""
              super().__init__(c1, c2, n, shortcut, g, e)
              c_ = int(c2 * e)  # số kênh ẩn
              self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, k=(k, k), e=1.0) for _ in range(n)))
                          

      Nếu đặt n của c3k thành 2, thì mô-đun tại thời điểm này là mô-đun C3K2. Mã triển khai của mạng như sau.

      
      class C3k2(C2f):
          """Triển khai nhanh hơn của cổ CSP với 2 tích chập."""
      
          def __init__(self, c1, c2, n=1, c3k=False, e=0.5, g=1, shortcut=True):
              """Khởi tạo mô-đun C3k2, một cổ CSP nhanh hơn với 2 tích chập và các khối C3k tùy chọn."""
              super().__init__(c1, c2, n, shortcut, g, e)
              self.m = nn.ModuleList(
                  C3k(self.c, self.c, 2, shortcut, g) if c3k else Bottleneck(self.c, self.c, shortcut, g) for _ in range(n)
              )
                          
    • C2PSA

      Mô-đun PSA ban đầu được đề xuất trong YOLOv10, tăng cường khả năng biểu diễn đặc trưng thông qua cơ chế chú ý tự thân, so với cơ chế chú ý tự thân truyền thống, chi phí tính toán lại tương đối thấp. Cấu trúc mạng như sau, trong đó mhsa biểu thị cơ chế chú ý tự thân đa đầu, FFN biểu thị mạng nơ-ron truyền thẳng.

      Dựa trên đó, thêm một nhánh PSA vào mô-đun C2 ban đầu sẽ tạo thành mô-đun C2PSA. Sơ đồ của mô-đun này như sau.

      
      class C2PSA(nn.Module):
          """
          Mô-đun C2PSA với cơ chế chú ý để trích xuất và xử lý đặc trưng được cải thiện.
      
          Mô-đun này triển khai một khối tích chập với cơ chế chú ý để tăng cường khả năng trích xuất và xử lý đặc trưng.
          Nó bao gồm một loạt các mô-đun PSABlock để thực hiện chú ý tự thân và các phép toán truyền thẳng.
      
          Thuộc tính:
              c (int): Số kênh ẩn.
              cv1 (Conv): Lớp tích chập 1x1 làm giảm số kênh đầu vào xuống 2*c.
              cv2 (Conv): Lớp tích chập 1x1 làm giảm số kênh đầu ra xuống c.
              m (nn.Sequential): Container tuần tự của các mô-đun PSABlock để thực hiện chú ý và phép toán truyền thẳng.
      
          Phương thức:
              forward: Thực hiện một lần truyền thẳng qua mô-đun C2PSA, áp dụng chú ý và phép toán truyền thẳng.
          """
      
          def __init__(self, c1, c2, n=1, e=0.5):
              """Khởi tạo mô-đun C2PSA với các kênh đầu vào/đầu ra được chỉ định, số lớp và tỷ lệ mở rộng."""
              super().__init__()
              assert c1 == c2
              self.c = int(c1 * e)
              self.cv1 = nn.Conv2d(c1, 2 * self.c, 1, 1)
              self.cv2 = nn.Conv2d(2 * self.c, c1, 1)
      
              self.m = nn.Sequential(*(PSABlock(self.c, attn_ratio=0.5, num_heads=self.c // 64) for _ in range(n)))
      
          def forward(self, x):
              """Xử lý tensor đầu vào 'x' qua một loạt các khối PSA và trả về tensor đã biến đổi."""
              a, b = self.cv1(x).split((self.c, self.c), dim=1)
              b = self.m(b)
              return self.cv2(torch.cat((a, b), 1))
                          
  • Thành phần cổ (Neck)
    • upsample

      Đây là một phương pháp lấy mẫu lên phổ biến, trong mô hình YOLOv11, nó thường được thực hiện bằng phương pháp nội suy lân cận gần nhất. Trong `torch` (PyTorch), `upsample` là một thao tác được sử dụng để **lấy mẫu lên** (tăng kích thước) của tensor (thường là hình ảnh hoặc bản đồ đặc trưng). Mục đích chính của việc lấy mẫu lên là tăng độ phân giải không gian của bản đồ đặc trưng, thường được sử dụng trong **mạng nơ-ron tích chập (CNN)** để tạo ra các bản đồ đặc trưng có độ phân giải cao, đặc biệt trong các tác vụ như phát hiện đối tượng, phân đoạn ngữ nghĩa và mạng đối kháng sinh ra (GANs).

      Trong PyTorch, `torch.nn.functional.upsample` trong các phiên bản cũ hơn cung cấp chức năng lấy mẫu lên, nhưng trong các phiên bản mới, người ta khuyến nghị sử dụng `torch.nn.functional.interpolate`, có chức năng tương tự nhưng linh hoạt và chuẩn hóa hơn.

      Các tham số chính như sau:

      
      torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)
                          
      • `input`: Tensor đầu vào, thường là tensor 4D, có hình dạng `(batch_size, channels, height, width)`.
      • `size`: Kích thước đích của đầu ra, có thể là chiều cao và chiều rộng nguyên (như `(height, width)`), biểu thị kích thước cụ thể mà bạn muốn điều chỉnh bản đồ đặc trưng.
      • `scale_factor`: Tỷ lệ co giãn của việc lấy mẫu lên. Ví dụ, `scale_factor=2` có nghĩa là chiều cao và chiều rộng của bản đồ đặc trưng đều được mở rộng 2 lần. Nếu đặt `scale_factor`, thì không cần đặt `size`.
      • `mode`: Phương pháp nội suy, có nhiều thuật toán nội suy tùy chọn:
        • `'nearest'`: Nội suy lân cận gần nhất (mặc định). Sao chép trực tiếp giá trị pixel gần nhất, tính toán đơn giản, tốc độ nhanh, nhưng hình ảnh được tạo ra có thể hơi thô.
        • `'linear'`: Nội suy song tuyến, phù hợp với đầu vào 3D (tức là bản đồ đặc trưng 1D).
        • `'bilinear'`: Nội suy song tuyến, phù hợp với đầu vào 4D (tức là bản đồ đặc trưng 2D).
        • `'trilinear'`: Nội suy ba tuyến, phù hợp với đầu vào 5D (tức là bản đồ đặc trưng 3D).
        • `'bicubic'`: Nội suy song tuyến bậc ba, tính toán phức tạp hơn, nhưng hình ảnh được tạo ra mượt mà hơn.
      • `align_corners`: Quyết định xem có căn chỉnh các góc của bản đồ đặc trưng đầu vào và đầu ra hay không khi sử dụng nội suy song tuyến, ba tuyến, v.v. Nếu là `True`, các góc của bản đồ đặc trưng đầu vào và đầu ra sẽ được căn chỉnh, thường làm cho kết quả nội suy chính xác hơn.
    • Concat

      Trong YOLO (You Only Look Once) network, `concat` (nối) là một thao tác được sử dụng để nối các bản đồ đặc trưng từ các lớp khác nhau. Nó có tác dụng hợp nhất thông tin đặc trưng ở các tỷ lệ khác nhau, để mạng có thể phát hiện đối tượng tốt hơn ở nhiều tỷ lệ. Sau khi điều chỉnh kích thước, nối các bản đồ đặc trưng dọc theo **kích thước kênh**. Giả sử chúng ta có hai bản đồ đặc trưng, lần lượt có hình dạng (H, W, C1) và (H, W, C2), bản đồ đặc trưng được nối sẽ có hình dạng (H, W, C1+C2), tức là số kênh tăng lên. Thông thường, sau khi thực hiện thao tác concat, sẽ có một lần tích chập để điều chỉnh số kênh về kích thước mong muốn. Triển khai của thao tác này như sau.

      
      class Concat(nn.Module):
          """Nối một danh sách các tensor dọc theo chiều."""
          def __init__(self, dimension=1):
              """Nối một danh sách các tensor dọc theo chiều được chỉ định."""
              super().__init__()
              self.d = dimension
      
          def forward(self, x):
              """Lần truyền thẳng cho mô-đun YOLOv8 mask Proto."""
              return torch.cat(x, self.d)
                          
  • Thành phần đầu (Head)

    Head của YOLOv11 chịu trách nhiệm tạo ra các dự đoán cuối cùng về phát hiện và phân loại đối tượng. Nó xử lý các bản đồ đặc trưng được truyền từ cổ và cuối cùng tạo ra hộp giới hạn và nhãn lớp của đối tượng trong hình ảnh. Nó thường chịu trách nhiệm ánh xạ các đặc trưng đến nhiệm vụ tương ứng của bạn. Nếu là nhiệm vụ phát hiện, tương ứng với 4 giá trị của hộp giới hạn và 1 giá trị độ tin cậy và 1 giá trị lớp đối tượng. Như được hiển thị dưới đây.

    
    # Ultralytics YOLO 🚀, AGPL-3.0 license
    """Các mô-đun đầu của mô hình."""
    import copy
    import math
    
    import torch
    import torch.nn as nn
    from torch.nn.init import constant_, xavier_uniform_
    
    from ultralytics.utils.tal import TORCH_1_10, dist2bbox, dist2rbox, make_anchors
    
    from .block import DFL, BNContrastiveHead, ContrastiveHead, Proto
    from .conv import Conv, DWConv
    from .transformer import MLP, DeformableTransformerDecoder, DeformableTransformerDecoderLayer
    from .utils import bias_init_with_prob, linear_init
    
    __all__ = "Detect", "Segment", "Pose", "Classify", "OBB", "RTDETRDecoder", "v10Detect"
                

Dựa trên thiết kế trên, YOLOv11 đã tạo ra nhiều biến thể, như được hiển thị trong bảng dưới đây. Chúng có thể hỗ trợ các tác vụ và kích thước mô hình khác nhau. Trong hướng dẫn này, chúng tôi chủ yếu tập trung vào phát hiện, và trong các quy trình tiếp theo, chúng tôi sẽ giải thích về các tác vụ như phân đoạn, ước lượng tư thế, v.v.

YOLOv11 đại diện cho một bước tiến lớn trong lĩnh vực CV, cung cấp một sự kết hợp hấp dẫn giữa hiệu suất được cải thiện và đa năng. Phiên bản mới nhất của kiến trúc YOLO đã có những cải tiến đáng kể về độ chính xác và tốc độ xử lý, đồng thời giảm số lượng tham số cần thiết. Những tối ưu hóa này làm cho YOLOv11 đặc biệt phù hợp với nhiều ứng dụng, từ tính toán biên đến phân tích dựa trên đám mây. Khả năng thích ứng của mô hình với các tác vụ khác nhau, bao gồm phát hiện đối tượng, phân đoạn thể hiện và ước lượng tư thế, khiến nó trở thành một công cụ có giá trị cho nhiều ngành (như phát hiện cảm xúc, chăm sóc sức khỏe và các ngành khác). Khả năng tích hợp liền mạch và hiệu quả được cải thiện khiến nó trở thành một lựa chọn hấp dẫn cho các doanh nghiệp tìm cách triển khai hoặc nâng cấp hệ thống CV của họ. Tóm lại, YOLOv11 với khả năng trích xuất đặc trưng được tăng cường, hiệu suất được tối ưu hóa và hỗ trợ tác vụ rộng rãi, là một giải pháp mạnh mẽ để giải quyết các thách thức nhận dạng thị giác phức tạp trong nghiên cứu và ứng dụng thực tế.

Phân tích Kết quả Thí nghiệm

Giới thiệu về Bộ dữ liệu

Bộ dữ liệu chúng tôi sử dụng ở đây là bộ dữ liệu ở định dạng YOLO. Phân phối bộ dữ liệu như sau.

Tôi đã xử lý bộ dữ liệu này theo định dạng YOLO, bạn chỉ cần cấu hình đường dẫn cục bộ của mình trong tệp cấu hình, như được hiển thị dưới đây.


# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: F:/Upppppdate/54/rope_yolo_format/
train: images/train # train images (relative to 'path') 1052 images
val: images/val # val images (relative to 'path') 225 images
test: images/test # test images (relative to 'path') 227 images

# Classes
names:
  0: rope
    

Phân tích Kết quả Chỉ số

Các biểu đồ chỉ số kết quả thí nghiệm đều được lưu trong thư mục runs, bạn chỉ cần phân tích quy trình thí nghiệm và kết quả biểu đồ chỉ số.

Nếu định nghĩa biểu đồ chỉ số không rõ ràng, vui lòng xem: YOLO11 model metrics interpretation

  • `train/box_loss` (Giá trị mất mát hộp giới hạn của tập huấn luyện): Giá trị mất mát hộp giới hạn giảm dần khi số vòng lặp đào tạo tăng lên, cho thấy mô hình đang học cách định vị mục tiêu chính xác hơn.
  • `train/cls_loss` (Giá trị mất mát phân loại của tập huấn luyện): Giá trị mất mát phân loại giảm nhanh ở giai đoạn đầu, sau đó ổn định, cho thấy mô hình đang dần cải thiện độ chính xác phân loại đối với sinh vật biển.
  • `train/dfl_loss` (Giá trị mất mát DFL của tập huấn luyện): Giá trị mất mát này cũng giảm, cho thấy mô hình đang tối ưu hóa việc khớp giữa hộp dự đoán và hộp thật.
  • `metrics/precision(B)` (Độ chính xác): Độ chính xác tăng lên khi số vòng lặp đào tạo tăng lên, cho thấy mô hình ngày càng tốt hơn trong việc giảm báo động sai.
  • `metrics/recall(B)` (Độ phủ): Độ phủ cũng tăng dần, cho thấy mô hình có khả năng nhận dạng nhiều sinh vật biển thật hơn.
  • `val/box_loss` (Giá trị mất mát hộp giới hạn của tập xác thực): Giá trị mất mát hộp giới hạn của tập xác thực cũng giảm, nhưng có thể có một số biến động, có thể do sự đa dạng của tập xác thực hoặc dấu hiệu quá khớp.
  • `val/cls_loss` (Giá trị mất mát phân loại của tập xác thực): Xu hướng giảm của giá trị mất mát phân loại của tập xác thực tương tự như tập huấn luyện, nhưng có thể có một số điểm biến động.
  • `val/dfl_loss` (Giá trị mất mát DFL của tập xác thực): Giá trị mất mát DFL của tập xác thực cũng giảm, nhưng có thể có một số biến động, cần quan sát thêm để xác định xem có phải là dấu hiệu quá khớp hay không.
  • `metrics/mAP50(B)` (Độ chính xác trung bình khi ngưỡng IoU là 0.5): mAP50 tăng lên khi số vòng lặp đào tạo tăng lên, cho thấy hiệu suất tổng thể của mô hình trên nhiệm vụ phát hiện đang được cải thiện.
  • `metrics/mAP50-95(B)` (Độ chính xác trung bình khi ngưỡng IoU từ 0.5 đến 0.95): Sự tăng lên của mAP50-95 cho thấy hiệu suất của mô hình đang được cải thiện ở các ngưỡng IoU khác nhau, đây là một chỉ số hiệu suất nghiêm ngặt hơn.

Khi ngưỡng IoU là 0.5, độ chính xác trung bình của mô hình trên tập kiểm tra có thể đạt giá trị ở góc trên bên phải. Dưới đây là một hình ảnh dự đoán, có thể thấy mô hình của chúng tôi có thể dự đoán hiệu quả các mục tiêu có tỷ lệ thay đổi nhiều.

Kết luận

Hệ thống phát hiện mũ bảo hiểm cho xe máy dựa trên YOLOv12 đã đạt được nhận dạng trạng thái đội mũ bảo hiểm hiệu quả và chính xác bằng công nghệ học sâu. Hệ thống sử dụng PySide để xây dựng giao diện GUI thân thiện với người dùng, hỗ trợ phát hiện hình ảnh/video thời gian thực và tích hợp chức năng ghi nhật ký, cung cấp hỗ trợ dữ liệu truy xuất cho quản lý giao thông. Kiến trúc đổi mới của YOLOv12 (như mô-đun chú ý vùng A2 và mạng tổng hợp lớp hiệu quả còn lại R-ELAN) đã cải thiện đáng kể độ chính xác phát hiện (ví dụ: mAP trên bộ dữ liệu COCO đạt 40.6%) và tính thời gian thực (độ trễ suy luận thấp đến 1.64ms), đặc biệt thể hiện xuất sắc trong các tình huống phức tạp như thay đổi ánh sáng và che khuất. Hệ thống này lấp đầy khoảng trống của việc giám sát thủ công, giảm thiểu rủi ro tai nạn giao thông bằng cách giám sát tự động, đồng thời cung cấp dữ liệu hỗ trợ cho việc xây dựng chính sách (như thống kê tỷ lệ đội mũ theo khu vực).

Tầm nhìn của hệ thống:

  • Tối ưu hóa kỹ thuật: Trong tương lai, có thể kết hợp cảm biến đa phương thức (như LiDAR) hoặc giới thiệu học không giám sát để giảm sự phụ thuộc vào gán nhãn dữ liệu, nâng cao độ bền của mô hình trong môi trường khắc nghiệt.
  • Mở rộng ứng dụng: Hệ thống có thể thích ứng với các lĩnh vực như an toàn công trường, bảo hộ công nghiệp, và khám phá tích hợp với các nền tảng thành phố thông minh, thực hiện giám sát an toàn đa cảnh.
  • Nâng cao hiệu suất: Tham khảo thiết kế nhẹ của YOLOv12 (như cắt tỉa mô hình) và triển khai tính toán biên, tối ưu hóa hiệu suất chạy của hệ thống trên thiết bị nhúng.
  • Giá trị xã hội: Việc ứng dụng lâu dài có thể hình thành thói quen an toàn cho công chúng, kết hợp phân tích dữ liệu thực thi giao thông để tối ưu hóa phân bổ nguồn lực, tạo thành một vòng lặp "công nghệ-dữ liệu-chính sách".

Hệ thống này đại diện cho sự kết hợp sâu sắc giữa công nghệ phát hiện đối tượng và nhu cầu xã hội thực tế, trong tương lai sẽ tiếp tục được hưởng lợi từ đổi mới thuật toán và tiến bộ phần cứng, trở thành một trong những công cụ cốt lõi của an toàn giao thông thông minh.

Thẻ: yolov12 Phát hiện đối tượng PySide6 Học sâu Xe máy

Đăng vào ngày 12 tháng 7 lúc 00:02