Cộng đồng Thị giác máy tính chắc hẳn không còn xa lạ gì với YOLO (You Only Look Once) – mô hình phát hiện đối tượng nổi trội về tốc độ và độ chính xác. Kể từ lần đầu tiên được giới thiệu vào năm 2016 bởi Joseph Redmon và cộng sự, YOLO đã được phát triển nhiều phiên bản khác nhau, với YOLOv8 hiện là phiên bản mới nhất.
Trước đó, YOLOv7 được đánh giá là gặp khó khăn trong việc phát hiện các đối tượng nhỏ, ở các tỷ lệ khác nhau, dưới sự thay đổi về ánh sáng hoặc các điều kiện môi trường khác. Vậy với sự ra đời của v8, liệu những hạn chế kể trên có được nhà YOLO khắc phục?
FriData tuần này sẽ mang tới cho các bạn cái nhìn toàn cảnh về YOLOv8, từ đó rút ra điểm vượt trội của v8 so với các phiên bản trước đó. Hãy đọc đến cuối để không bỏ sót bất cứ thông tin hữu ích nào!
YOLOv8 là gì?
YOLOv8 là phiên bản mới nhất trong dòng mô hình YOLO. YOLO là viết tắt của cụm từ “You Only Look Once”, tức chỉ khả năng dự đoán tất cả các đối tượng có mặt trong một hình ảnh chỉ trong một lần truyền dữ liệu.
Điểm khác biệt chính mà YOLO mang lại là cách đặt vấn đề. Tác giả đã đặt lại vấn đề phát hiện đối tượng dưới dạng một bài toán hồi quy (dự đoán tọa độ hộp giới hạn) thay vì phân loại.
Các mô hình YOLO được huấn luyện trước trên các bộ dữ liệu lớn như COCO và ImageNet. Điều này cho phép chúng vừa có khả năng cung cấp dự đoán cực kỳ chính xác với các lớp đã được huấn luyện, vừa có thể học các lớp mới một cách tương đối dễ dàng.
Các mô hình YOLO cũng có tốc độ huấn luyện nhanh hơn, với độ chính xác cao và kích thước mô hình nhỏ. Chúng có thể được huấn luyện trên các GPU đơn, do đó dễ tiếp cận hơn đối với các nhà phát triển.
Được công bố vào đầu năm 2023, YOLOv8 đã mang lại nhiều điểm tích cực so với phiên bản tiền nhiệm, như phát hiện không dùng anchor, giới thiệu lớp tích chập C3 và tăng cường mosaic.
YOLOv8 có là mã nguồn mở không?
YOLOv8 là mô hình SOTA mã nguồn mở được xây dựng và duy trì bởi nhóm Ultralytics. Nó được phân phối dưới Giấy phép Công cộng GNU, cho phép người dùng chia sẻ, sửa đổi và phân phối phần mềm một cách tự do. Cộng đồng YOLOv8 đang phát triển và rất sôi động.
Ai là tác giả của YOLOv8?
YOLOv8 được viết và duy trì bởi nhóm Ultralytics. Các mô hình YOLO ban đầu do Joseph Redmon, một nhà khoa học máy tính, tạo ra. Ông đã phát triển ba phiên bản YOLO, với phiên bản thứ ba là YOLOv3, được viết bằng kiến trúc Darknet. Glenn Jocher đã sử dụng phiên bản YOLOv3 trong PyTorch với một số thay đổi nhỏ và đặt tên nó là YOLOv5. Kiến trúc YOLOv5 sau đó đã được điều chỉnh để phát triển YOLOv8.
YOLOv8 được ra mắt vào ngày 10 tháng 1 năm 2023. Hiện tại, nó vẫn đang được tích cực nghiên cứu và phát triển.
Các thông số kỹ thuật quan trọng và kết quả
Hiện tại, vẫn chưa có bài báo chính thức nào. Nhưng nhờ người dùng GitHub RangeKing, ta có tệp yolov8-p2.yaml, với hình minh họa sau:
Ta cũng có thể tự hình dung kiến trúc YOLOv8 bằng cách chuyển đổi nó sang định dạng ONNX. ONNX viết tắt của Open Neural Network Exchange. Đây là định dạng mở được sử dụng để biểu thị các mô hình học máy. Nó có thể được xem như một đại diện chung cho các mô hình ML, bởi vì tính phổ biến cho bất kỳ mô hình nào, dù code mô hình được viết trong PyTorch, TensorFlow hoặc các framework nào khác.
Việc chuyển đổi bất kỳ mô hình YOLO nào sang định dạng ONNX cũng khá dễ dàng. Chỉ cần sao chép và chạy code dưới đây:
Giờ đây, ta có thể lấy tệp .onnx này và tải lên ứng dụng Netron. Netron là một ứng dụng giúp hiển thị hình ảnh của các mạng thần kinh.
Dưới đây là hình ảnh của YOLOv8n trong Netron:
Từ đây, ta có thể so sánh những thay đổi trong YOLOv8 với phiên bản trước của nó, YOLOv5. Có hai thay đổi chính:
- Anchor-Free Detection
- Mosaic Augmentation
Hãy xem xét từng thay đổi này một cách cụ thể:
1. Anchor-Free Detection
Để hiểu về Anchor-Free Detection, chúng ta trước tiên cần hiểu về anchor boxes.
Anchor boxes giải quyết một vấn đề lớn trong phát hiện đối tượng. Trước khi có anchor boxes, một đối tượng được gán cho một ô lưới chứa điểm giữa của đối tượng đã cho. Nếu hai đối tượng có cùng điểm trung tâm, việc xây dựng hộp giới hạn và phân bổ chúng vào các lớp riêng lẻ trở nên rất phức tạp.
Ví dụ, xem xét tình huống trong đó một con người và một con ngựa có cùng điểm trung tâm. Làm thế nào chúng ta nên xây dựng một hộp giới hạn trong trường hợp như vậy?
Anchor boxes có thể được coi là các mẫu cookie-cutter. Xem xét trường hợp ta có hai anchor boxes: Anchor Box 1 và Anchor Box 2.
Bây giờ, ta sẽ kiểm tra trong danh sách các anchor boxes xem anchor boxes nào có chỉ số IoU cao nhất với hộp giới hạn thực tế và gán anchor boxes đó cho lớp tương ứng.
Như được minh họa dưới đây, anchor boxes 1 hữu ích cho các hình dáng ngang như ngựa, và anchor boxes 2 hữu ích cho các hình dáng dọc thẳng như con người.
Anchor box nói chung đã cải thiện quá trình huấn luyện bằng cách tăng mAP (mean Average Precision). Chúng đã được tích hợp vào các phiên bản YOLO trước đó. Tuy nhiên, trong YOLOv8, kiến trúc đã bỏ qua việc sử dụng Anchor box với một số lý do:
- Thiếu tính tổng quát: Huấn luyện với các Anchor box có sẵn làm cho mô hình trở nên cứng nhắc và khó phù hợp với dữ liệu mới.
- Không có Anchor box phù hợp trong tình huống không đều: Các tình huống không đều không thể được ánh xạ một cách rõ ràng bằng các Anchor box hình đa giác.
2. Kỹ thuật Tăng cường Dữ liệu Mosaic
Trong quá trình huấn luyện, YOLOv8 thực hiện nhiều kỹ thuật tăng cường cho ảnh huấn luyện. Một trong những kỹ thuật này là tăng cường dữ liệu mosaic.
Tăng cường dữ liệu mosaic là một kỹ thuật đơn giản, trong đó bốn hình ảnh khác nhau được nối lại với nhau và đưa vào mô hình như đầu vào. Điều này giúp mô hình học được các đối tượng thực sự từ các vị trí khác nhau và trong trạng thái bị che khuất.
Việc thực hiện tăng cường dữ liệu Mosaic đã cho thấy làm giảm hiệu suất, vì vậy nó đã được chuyển sang sử dụng cho 10 epoch cuối cùng.
YOLOv8 có gì cải tiến so với phiên bản trước đó?
Như chúng ta có thể thấy từ biểu đồ, YOLOv8 có nhiều tham số hơn so với các phiên bản tiền nhiệm như YOLOv5, nhưng ít tham số hơn so với YOLOv6. Nó cung cấp khoảng 33% mAP nhiều hơn cho các mô hình kích thước n và mAP lớn hơn nói chung.
Từ biểu đồ thứ hai, chúng ta có thể thấy YOLOv8 có thời gian suy luận nhanh hơn so với tất cả các phiên bản YOLO khác.
Trong YOLOv8, ta có các kích thước mô hình khác nhau như yolov8- n – nano, s – small, m – medium, l – large và x – extra large.
Kích thước mô hình tương ứng tuyến tính với mAP và nghịch đảo tương ứng với thời gian suy luận. Các mô hình lớn mất nhiều thời gian suy luận để phát hiện đối tượng một cách chính xác với mAP cao hơn. Các mô hình nhỏ có thời gian suy luận nhanh hơn nhưng có mAP tương đối thấp hơn. Các mô hình lớn hơn tốt hơn nếu chúng ta có ít dữ liệu. Các mô hình nhỏ hơn hiệu quả hơn nếu ta có ít không gian (các tình huống biên).
Ứng dụng của YOLOv8
YOLOv8 có thể được áp dụng cho ba tác vụ quan trọng trong thị giác máy tính.
1. Phân loại (Classification)
Phân loại là một tác vụ đơn giản, với kết quả bao gồm class index và confidence score. Nhiệm vụ phân loại hữu ích khi chỉ cần xác định sự hiện diện của một lớp cụ thể trong hình ảnh đầu vào, mà không xác định vị trí chính xác của đối tượng.
Tạo một bộ phân loại với YOLOv8 rất dễ dàng – chỉ cần thêm tiền tố -cls vào mô hình YOLOv8 mong muốn của bạn. YOLOv8 có các kích thước khác nhau: yolov8n (Nano), yolov8s (Small), yolov8m (Medium), yolov8l (Large) và yolov8x (Extra Large). Khả năng phân loại mạnh mẽ của nó xuất phát từ việc được huấn luyện trước trên tập dữ liệu ImageNet lớn, chứa hàng triệu hình ảnh.
Với cấu hình yolov8n của YOLOv8, hãy tiến hành tạo bộ phân loại.
2. Nhận dạng đối tượng (Object detection)
Nhận dạng đối tượng là một tác vụ phát triển từ Phân loại. Trong tác vụ Nhận dạng Đối tượng, ta cần xác định các lớp khác nhau có mặt trong hình ảnh và phát hiện vị trí chính xác của chúng. Vị trí của các đối tượng này được thể hiện trực quan thông qua các hộp giới hạn (Bounding Boxes).
Các mô hình YOLOv8 đã được huấn luyện trước trên tập dữ liệu COCO (tập dữ liệu hình ảnh khác rất lớn). Nó có thể thực hiện Nhận dạng Đối tượng ngay sau khi được triển khai.
Không cần thêm tiền tố nào.
Dưới đây là một ví dụ về việc thực hiện Nhận dạng Đối tượng trên một hình ảnh:
3. Phân đoạn (Segmentation)
Phân đoạn nằm ở bước tiếp theo sau Nhận dạng Đối tượng. Trong Nhận dạng Đối tượng, ta đã xác định vị trí của các đối tượng và ước tính vị trí của chúng thông qua các hộp giới hạn. Phân đoạn là nhiệm vụ trong đó ta xác định các pixel riêng lẻ thuộc về một đối tượng. Nó chính xác hơn nhiều so với Nhận dạng Đối tượng và có tiềm năng ứng dụng rất lớn, như Hình ảnh Y tế, Hình ảnh Vệ tinh, v.v.
Thực hiện Phân đoạn với YOLOv8 dễ dàng hơn. Bạn chỉ cần thêm tiền tố -seg.