Kiến trúc Ultralytics YOLOv5#
YOLOv5 (v6.0/6.1) là một thuật toán phát hiện đối tượng mạnh mẽ do Ultralytics phát triển. Bài viết này đi sâu vào kiến trúc YOLOv5, các chiến lược tăng cường dữ liệu, phương pháp training và kỹ thuật tính toán loss. Hiểu biết toàn diện này sẽ giúp cải thiện việc ứng dụng thực tế công nghệ phát hiện đối tượng trong nhiều lĩnh vực, bao gồm giám sát, phương tiện tự hành và nhận dạng hình ảnh.
1. Cấu trúc model#
Kiến trúc YOLOv5 gồm ba phần chính:
- Backbone: Đây là phần chính của network. Đối với YOLOv5, backbone được thiết kế bằng cấu trúc
CSPDarknet53, một biến thể của kiến trúc Darknet được sử dụng trong các phiên bản trước. - Neck: Phần này kết nối backbone và head. Trong YOLOv5, các cấu trúc
SPPF(Spatial Pyramid Pooling - Fast) vàPANet(Path Aggregation Network) được sử dụng. - Head: Phần này chịu trách nhiệm tạo output cuối cùng. YOLOv5 sử dụng
YOLOv3 Headcho mục đích này.
Cấu trúc của model được minh họa trong hình bên dưới. Có thể xem chi tiết cấu trúc model tại models/yolov5l.yaml.

YOLOv5 giới thiệu một số cải tiến đáng chú ý so với các phiên bản tiền nhiệm:
- Cấu trúc
Focus, được sử dụng trong các phiên bản trước, được thay thế bằng cấu trúc6x6 Conv2d. Thay đổi này nâng cao hiệu quả #4825. - Cấu trúc
SPPđược thay thế bằngSPPF. Thay đổi này giúp tốc độ xử lý tăng hơn gấp đôi trong khi vẫn duy trì cùng output.
Có thể sử dụng đoạn code sau để kiểm tra tốc độ của SPP và SPPF:
SPP vs SPPF speed profiling example (click to open)
import time
import torch
from torch import nn
class SPP(nn.Module):
def __init__(self):
"""Initializes an SPP module with three different sizes of max pooling layers."""
super().__init__()
self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)
def forward(self, x):
"""Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
o1 = self.maxpool1(x)
o2 = self.maxpool2(x)
o3 = self.maxpool3(x)
return torch.cat([x, o1, o2, o3], dim=1)
class SPPF(nn.Module):
def __init__(self):
"""Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
super().__init__()
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
def forward(self, x):
"""Applies sequential max pooling and concatenates results with input tensor."""
o1 = self.maxpool(x)
o2 = self.maxpool(o1)
o3 = self.maxpool(o2)
return torch.cat([x, o1, o2, o3], dim=1)
def main():
"""Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
input_tensor = torch.rand(8, 32, 16, 16)
spp = SPP()
sppf = SPPF()
output1 = spp(input_tensor)
output2 = sppf(input_tensor)
print(torch.equal(output1, output2))
t_start = time.time()
for _ in range(100):
spp(input_tensor)
print(f"SPP time: {time.time() - t_start}")
t_start = time.time()
for _ in range(100):
sppf(input_tensor)
print(f"SPPF time: {time.time() - t_start}")
if __name__ == "__main__":
main()result:
True
SPP time: 0.5373051166534424
SPPF time: 0.207807064056396482. Kỹ thuật tăng cường dữ liệu#
YOLOv5 sử dụng nhiều kỹ thuật tăng cường dữ liệu để cải thiện khả năng khái quát hóa của model và giảm overfitting. Các kỹ thuật này bao gồm:
-
Mosaic Augmentation: Một kỹ thuật xử lý hình ảnh kết hợp bốn ảnh training thành một theo cách giúp các model phát hiện đối tượng xử lý tốt hơn nhiều tỷ lệ và phép dịch chuyển đối tượng.

-
Copy-Paste Augmentation: Một phương pháp tăng cường dữ liệu cải tiến, sao chép các vùng ngẫu nhiên từ một ảnh rồi dán chúng lên một ảnh khác được chọn ngẫu nhiên, qua đó tạo ra một sample training mới.

-
Random Affine Transformations: Bao gồm xoay, scale, dịch chuyển và shear ảnh một cách ngẫu nhiên.

-
MixUp Augmentation: Một phương pháp tạo ảnh tổng hợp bằng cách lấy tổ hợp tuyến tính của hai ảnh và các label tương ứng của chúng.

-
Albumentations: Một thư viện tăng cường ảnh mạnh mẽ, hỗ trợ nhiều kỹ thuật tăng cường. Tìm hiểu thêm về cách sử dụng các phép tăng cường của Albumentations.
-
HSV Augmentation: Thay đổi ngẫu nhiên Hue, Saturation và Value của ảnh.

-
Random Horizontal Flip: Một phương pháp tăng cường lật ảnh theo chiều ngang một cách ngẫu nhiên.

3. Chiến lược training#
YOLOv5 áp dụng một số chiến lược training nâng cao để cải thiện hiệu suất của model. Các chiến lược này bao gồm:
- Multiscale Training: Trong quá trình training, ảnh đầu vào được thay đổi scale ngẫu nhiên trong phạm vi từ 0.5 đến 1.5 lần kích thước ban đầu.
- AutoAnchor: Chiến lược này tối ưu hóa các anchor box prior để phù hợp với các đặc trưng thống kê của ground truth box trong dữ liệu tùy chỉnh của bạn.
- Warmup and Cosine LR Scheduler: Một phương pháp điều chỉnh learning rate để cải thiện hiệu suất model.
- Exponential Moving Average (EMA): Một chiến lược sử dụng giá trị trung bình của các parameter qua những step trước đó để ổn định quá trình training và giảm lỗi khái quát hóa.
- Training Mixed Precision: Một phương pháp thực hiện các phép toán ở định dạng precision một nửa, giúp giảm mức sử dụng bộ nhớ và tăng tốc độ tính toán.
- Hyperparameter Evolution: Một chiến lược tự động điều chỉnh hyperparameter để đạt hiệu suất tối ưu. Tìm hiểu thêm về điều chỉnh hyperparameter.
4. Các tính năng bổ sung#
4.1 Tính toán loss#
Loss trong YOLOv5 được tính là sự kết hợp của ba thành phần loss riêng biệt:
- Loss phân loại (BCE Loss): Loss Binary Cross-Entropy, đo lỗi của tác vụ phân loại.
- Loss objectness (BCE Loss): Một loss Binary Cross-Entropy khác, tính lỗi trong việc xác định có hay không có đối tượng trong một cell cụ thể của grid.
- Loss vị trí (CIoU Loss): Loss Complete IoU, đo lỗi trong việc định vị đối tượng bên trong cell của grid.
Hàm loss tổng thể được minh họa như sau:
4.2 Cân bằng loss#
Các loss objectness của ba layer dự đoán (P3, P4, P5) được gán trọng số khác nhau. Các trọng số cân bằng lần lượt là [4.0, 1.0, 0.4]. Phương pháp này đảm bảo các dự đoán ở những scale khác nhau đóng góp phù hợp vào total loss.
4.3 Loại bỏ độ nhạy của grid#
Kiến trúc YOLOv5 thực hiện một số thay đổi quan trọng đối với chiến lược dự đoán box so với các phiên bản YOLO trước đó. Trong YOLOv2 và YOLOv3, tọa độ box được dự đoán trực tiếp bằng activation của layer cuối.
Tuy nhiên, trong YOLOv5, công thức dự đoán tọa độ box đã được cập nhật để giảm độ nhạy của grid và ngăn model dự đoán các kích thước box không bị giới hạn.
Các công thức được điều chỉnh để tính bounding box dự đoán như sau:
So sánh độ lệch của điểm trung tâm trước và sau khi scale. Phạm vi độ lệch của điểm trung tâm được điều chỉnh từ (0, 1) thành (-0.5, 1.5). Do đó, độ lệch có thể dễ dàng đạt 0 hoặc 1.
So sánh tỷ lệ scale chiều cao và chiều rộng (so với anchor) trước và sau khi điều chỉnh. Các phương trình box yolo/darknet ban đầu có một khiếm khuyết nghiêm trọng. Width và Height hoàn toàn không bị giới hạn vì chúng đơn giản là out=exp(in), điều này nguy hiểm do có thể dẫn đến gradient tăng không kiểm soát, mất ổn định, loss NaN và cuối cùng là training thất bại hoàn toàn. Tham khảo issue này để biết thêm chi tiết.
4.4 Xây dựng target#
Quy trình build target trong YOLOv5 rất quan trọng đối với hiệu quả training và độ chính xác của model. Quy trình này bao gồm việc gán các ground truth box vào những cell grid thích hợp trong output map và matching chúng với các anchor box phù hợp.
Quy trình này gồm các bước sau:
- Tính tỷ lệ giữa kích thước của ground truth box và kích thước của từng anchor template.
- Nếu tỷ lệ được tính nằm trong ngưỡng, hãy match ground truth box với anchor tương ứng.
- Gán anchor đã match vào các cell phù hợp, lưu ý rằng do độ lệch điểm trung tâm đã được điều chỉnh, một ground truth box có thể được gán cho nhiều anchor vì phạm vi độ lệch điểm trung tâm được điều chỉnh từ (0, 1) thành (-0.5, 1.5), cho phép thực hiện thêm các phép matching.
Nhờ đó, quy trình build target đảm bảo mỗi đối tượng ground truth được gán và match chính xác trong quá trình training, giúp YOLOv5 học tác vụ phát hiện đối tượng hiệu quả hơn.
Kết luận#
YOLOv5 là một bước tiến có ý nghĩa trong quá trình phát triển của công nghệ phát hiện đối tượng theo thời gian thực. Các lựa chọn kiến trúc, chiến lược training và tinh chỉnh engineering của model mang lại hiệu suất và hiệu quả cao so với các phiên bản YOLO trước đó.
Các cải tiến chính trong YOLOv5 bao gồm việc sử dụng kiến trúc động, nhiều kỹ thuật tăng cường dữ liệu, các chiến lược training cải tiến, cùng những điều chỉnh quan trọng trong việc tính loss và quy trình xây dựng target. Tất cả cải tiến này nâng cao đáng kể độ chính xác và hiệu quả của việc phát hiện đối tượng mà vẫn duy trì tốc độ cao — đặc điểm nổi bật của các model YOLO.