Meet YOLO26: next-gen vision AI.

Link to this sectionTransfer Learning với các lớp bị đóng băng trong YOLOv5#

📚 Hướng dẫn này giải thích cách đóng băng (freeze) các lớp của YOLOv5 🚀 khi thực hiện transfer learning. Transfer learning là một kỹ thuật machine learning (ML) mạnh mẽ cho phép bạn đào tạo lại mô hình trên dữ liệu mới một cách nhanh chóng mà không cần phải đào tạo lại toàn bộ mạng từ đầu. Bằng cách đóng băng trọng số của các lớp ban đầu và chỉ cập nhật tham số của các lớp sau đó, bạn có thể giảm đáng kể yêu cầu về tài nguyên tính toán và thời gian đào tạo. Tuy nhiên, phương pháp này có thể ảnh hưởng nhẹ đến độ chính xác (accuracy) của mô hình cuối cùng.

Link to this sectionTrước khi Bắt đầu#

Trước tiên, hãy clone repository YOLOv5 và cài đặt các dependency cần thiết được liệt kê trong requirements.txt. Đảm bảo bạn có môi trường Python>=3.8.0 với PyTorch>=1.8 đã được cài đặt. Các model đã được huấn luyện trước và các dataset cần thiết sẽ được tải xuống tự động từ bản release mới nhất của YOLOv5.

git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependencies

Link to this sectionCách thức hoạt động của việc đóng băng lớp (Layer Freezing)#

Khi bạn đóng băng các lớp trong một neural network, bạn ngăn các tham số (trọng số và bias) của chúng bị cập nhật trong quá trình huấn luyện. Trong PyTorch, điều này đạt được bằng cách thiết lập thuộc tính requires_grad của các tensor trong lớp đó thành False. Kết quả là, gradient sẽ không được tính toán cho các lớp này trong quá trình lan truyền ngược (backpropagation), giúp tiết kiệm tính toán và bộ nhớ.

Dưới đây là cách YOLOv5 triển khai đóng băng lớp trong script huấn luyện của nó:

# Freeze specified layers
freeze = [f"model.{x}." for x in range(freeze)]  # Define layers to freeze based on module index
for k, v in model.named_parameters():
    v.requires_grad = True  # Ensure all parameters are initially trainable
    if any(x in k for x in freeze):
        print(f"Freezing layer: {k}")
        v.requires_grad = False  # Disable gradient calculation for frozen layers

Link to this sectionKhám phá kiến trúc Model#

Việc hiểu cấu trúc của model YOLOv5 là rất quan trọng để quyết định xem nên đóng băng các lớp nào. Bạn có thể kiểm tra tên của tất cả các module và tham số của chúng bằng cách sử dụng đoạn mã Python sau:

# Assuming 'model' is your loaded YOLOv5 model instance
for name, param in model.named_parameters():
    print(name)

"""
Example Output:
model.0.conv.conv.weight
model.0.conv.bn.weight
model.0.conv.bn.bias
model.1.conv.weight
model.1.bn.weight
model.1.bn.bias
model.2.cv1.conv.weight
model.2.cv1.bn.weight
...
"""

Kiến trúc YOLOv5 thường bao gồm một backbone (các lớp 0-9 trong các cấu hình tiêu chuẩn như YOLOv5s/m/l/x) chịu trách nhiệm trích xuất đặc trưng (feature extraction), và một phần đầu (các lớp còn lại) thực hiện phát hiện đối tượng (object detection).

# Example YOLOv5 v6.0 backbone structure
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]]  # Layer 0: Initial convolution (P1/2 stride)
    - [-1, 1, Conv, [128, 3, 2]] # Layer 1: Downsampling convolution (P2/4 stride)
    - [-1, 3, C3, [128]]          # Layer 2: C3 module
    - [-1, 1, Conv, [256, 3, 2]] # Layer 3: Downsampling convolution (P3/8 stride)
    - [-1, 6, C3, [256]]          # Layer 4: C3 module
    - [-1, 1, Conv, [512, 3, 2]] # Layer 5: Downsampling convolution (P4/16 stride)
    - [-1, 9, C3, [512]]          # Layer 6: C3 module
    - [-1, 1, Conv, [1024, 3, 2]]# Layer 7: Downsampling convolution (P5/32 stride)
    - [-1, 3, C3, [1024]]         # Layer 8: C3 module
    - [-1, 1, SPPF, [1024, 5]]    # Layer 9: Spatial Pyramid Pooling Fast

# Example YOLOv5 v6.0 head structure
head:
    - [-1, 1, Conv, [512, 1, 1]] # Layer 10
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # Layer 11
    - [[-1, 6], 1, Concat, [1]] # Layer 12: Concatenate with backbone P4 (from layer 6)
    - [-1, 3, C3, [512, False]] # Layer 13: C3 module
    # ... subsequent head layers for feature fusion and detection

Link to this sectionCác tùy chọn đóng băng#

Bạn có thể kiểm soát các lớp nào bị đóng băng bằng cách sử dụng đối số --freeze trong lệnh huấn luyện. Đối số này chỉ định chỉ số của module chưa bị đóng băng đầu tiên; tất cả các module trước chỉ số này sẽ bị đóng băng trọng số. Hãy sử dụng model.model (một nn.Sequential) để kiểm tra thứ tự module nếu bạn cần xác nhận chỉ số nào tương ứng với một block cụ thể.

Link to this sectionChỉ đóng băng Backbone#

Để đóng băng toàn bộ backbone (các lớp 0 đến 9), điều này thường được thực hiện khi điều chỉnh mô hình cho các lớp đối tượng mới trong khi vẫn giữ lại khả năng trích xuất đặc trưng tổng quát đã học từ một tập dữ liệu lớn như COCO:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10

Chiến lược này rất hiệu quả khi tập dữ liệu mục tiêu của bạn chia sẻ các đặc trưng trực quan cấp thấp (cạnh, kết cấu) tương tự với dữ liệu huấn luyện gốc (ví dụ: COCO) nhưng chứa các danh mục đối tượng khác nhau.

Link to this sectionĐóng băng tất cả ngoại trừ các lớp phát hiện cuối cùng#

Để đóng băng gần như toàn bộ mạng, chỉ để lại các lớp convolution đầu ra cuối cùng (một phần của module Detect, thường là module cuối cùng, ví dụ: module 24 trong YOLOv5s) là có thể huấn luyện được:

python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24

Phương pháp này hữu ích khi bạn chủ yếu cần điều chỉnh mô hình cho một số lượng lớp đầu ra khác nhau trong khi vẫn giữ nguyên phần lớn các đặc trưng đã học. Nó yêu cầu ít tài nguyên tính toán nhất cho việc tinh chỉnh (fine-tuning).

Link to this sectionSo sánh hiệu năng#

Để minh họa tác động của việc đóng băng các lớp, chúng tôi đã huấn luyện YOLOv5m trên tập dữ liệu Pascal VOC trong 50 epoch, bắt đầu từ weights tiền huấn luyện COCO chính thức (yolov5m.pt). Chúng tôi đã so sánh ba kịch bản: huấn luyện tất cả các lớp (--freeze 0), đóng băng backbone (--freeze 10), và đóng băng tất cả ngoại trừ các lớp phát hiện cuối cùng (--freeze 24).

# Example command for training with backbone frozen
python train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp data/hyps/hyp.VOC.yaml --freeze 10

Link to this sectionKết quả độ chính xác#

Kết quả cho thấy việc đóng băng các lớp có thể tăng tốc độ huấn luyện đáng kể nhưng có thể dẫn đến việc giảm nhẹ mAP (mean Average Precision) cuối cùng. Huấn luyện tất cả các lớp thường mang lại độ chính xác tốt nhất, trong khi việc đóng băng nhiều lớp hơn giúp huấn luyện nhanh hơn với chi phí là hiệu suất có thể thấp hơn.

So sánh kết quả mAP50 trong quá trình huấn luyện sử dụng các chiến lược đóng băng khác nhau So sánh mAP50 trong quá trình huấn luyện

So sánh kết quả mAP50-95 trong quá trình huấn luyện sử dụng các chiến lược đóng băng khác nhau So sánh mAP50-95 trong quá trình huấn luyện

YOLOv5 frozen layer training performance *Summary table of performance metrics*

Link to this sectionSử dụng tài nguyên#

Việc đóng băng nhiều lớp hơn làm giảm đáng kể yêu cầu về bộ nhớ GPU và mức sử dụng tổng thể. Điều này làm cho transfer learning với các lớp bị đóng băng trở thành một lựa chọn hấp dẫn khi làm việc với tài nguyên phần cứng hạn chế, cho phép huấn luyện các mô hình lớn hơn hoặc sử dụng kích thước ảnh lớn hơn so với cách thông thường.

Phần trăm bộ nhớ GPU được phân bổ trong quá trình huấn luyện Bộ nhớ GPU được phân bổ (%)

Phần trăm sử dụng GPU trong quá trình huấn luyện Sử dụng GPU (%)

Link to this sectionKhi nào nên sử dụng việc đóng băng lớp#

Việc đóng băng lớp trong quá trình transfer learning đặc biệt có lợi trong một số tình huống:

  1. Tài nguyên tính toán hạn chế: Nếu bạn bị hạn chế về bộ nhớ GPU hoặc sức mạnh xử lý.
  2. Tập dữ liệu nhỏ: Khi tập dữ liệu mục tiêu của bạn nhỏ hơn đáng kể so với tập dữ liệu tiền huấn luyện ban đầu, việc đóng băng giúp ngăn chặn overfitting.
  3. Tạo mẫu nhanh (Rapid Prototyping): Khi bạn cần nhanh chóng điều chỉnh một mô hình hiện có cho một tác vụ hoặc lĩnh vực mới để đánh giá ban đầu.
  4. Các miền đặc trưng tương tự: Nếu các đặc trưng cấp thấp trong tập dữ liệu mới của bạn rất giống với các đặc trưng trong tập dữ liệu mà mô hình đã được tiền huấn luyện.

Khám phá thêm về các sắc thái của transfer learning trong mục từ vựng (glossary) của chúng tôi và cân nhắc các kỹ thuật như tinh chỉnh siêu tham số (hyperparameter tuning) để tối ưu hóa hiệu suất.

Link to this sectionCác Môi trường được Hỗ trợ#

Ultralytics cung cấp nhiều môi trường sẵn sàng sử dụng với các dependency thiết yếu như CUDA, CuDNN, PythonPyTorch đã được cài đặt sẵn.

Link to this sectionTrạng thái Dự án#

YOLOv5 Continuous Integration Status

Huy hiệu này xác nhận rằng tất cả các bài kiểm tra Tích hợp liên tục (CI) trên YOLOv5 GitHub Actions đều đã vượt qua thành công. Các bài kiểm tra CI này đánh giá nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên các hoạt động chính: huấn luyện, xác thực, suy luận, xuất mô hìnhbenchmark. Chúng đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu, chạy tự động mỗi 24 giờ và trên mỗi commit code mới.

Bình luận