YOLO Vision 2026:

Transfer Learning với các Layer bị đóng băng trong YOLOv5#

📚 Hướng dẫn này giải thích cách đóng băng các layer của YOLOv5 🚀 khi triển khai transfer learning. Transfer learning là một kỹ thuật học máy (ML) mạnh mẽ, cho phép bạn nhanh chóng huấn luyện lại model trên dữ liệu mới mà không cần huấn luyện lại toàn bộ network từ đầu. Bằng cách đóng băng các trọng số của những layer ban đầu và chỉ cập nhật tham số của các layer phía 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 huấn luyện. Tuy nhiên, phương pháp này có thể ảnh hưởng nhẹ đến độ chính xác cuối cùng của model.

Trướ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ột môi trường Python>=3.8.0 đã cài đặt PyTorch>=1.8. Các model pretrained và dataset cần thiết sẽ được tự động tải xuống từ bản phát hành YOLOv5 mới nhất.

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

Cơ chế đóng băng Layer#

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

Sau đây là cách YOLOv5 triển khai việc đóng băng layer trong training script:

# 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

Khám phá kiến trúc Model#

Hiểu cấu trúc của model YOLOv5 là yếu tố quan trọng để quyết định nên đóng băng layer nào. Bạn có thể kiểm tra tên của tất cả module và tham số của chúng bằ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 gồm một backbone (các layer 0-9 trong những 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, và một head (các layer còn lại) thực hiện phát hiện đối tượng.

# 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

Các tùy chọn đóng băng#

Bạn có thể kiểm soát layer nào được đóng băng bằng đối số --freeze trong lệnh huấn luyện. Đối số này chỉ định index của module đầu tiên không bị đóng băng; tất cả module trước index này sẽ có trọng số bị đóng băng. 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 index nào tương ứng với một block cụ thể.

Chỉ đóng băng Backbone#

Để đóng băng toàn bộ backbone (các layer từ 0 đến 9), một cách thường dùng khi điều chỉnh model cho các class đố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 dataset lớn như COCO:

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

Chiến lược này hiệu quả khi dataset mục tiêu có các đặc trưng hình ảnh cấp thấp (cạnh, texture) tương tự dữ liệu huấn luyện ban đầu (ví dụ: COCO) nhưng chứa các category đối tượng khác nhau.

Đóng băng tất cả trừ các Layer phát hiện cuối cùng#

Để đóng băng gần như toàn bộ network, chỉ để các layer 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) có thể huấn luyện:

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 model cho số lượng class đầu ra khác nhau trong khi vẫn giữ nguyên phần lớn đặc trưng đã học. Phương pháp này yêu cầu ít tài nguyên tính toán nhất cho fine-tuning.

So sánh hiệu năng#

Để minh họa tác động của việc đóng băng layer, chúng tôi đã huấn luyện YOLOv5m trên dataset Pascal VOC trong 50 epoch, bắt đầu từ trọng số pretrained 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ả layer (--freeze 0), đóng băng backbone (--freeze 10) và đóng băng tất cả trừ các layer 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

Kết quả độ chính xác#

Kết quả cho thấy việc đóng băng layer có thể tăng tốc đáng kể quá trình huấn luyện nhưng có thể dẫn đến mức giảm nhẹ mAP (độ chính xác trung bình) cuối cùng. Huấn luyện tất cả layer thường cho độ chính xác tốt nhất, trong khi đóng băng nhiều layer hơn giúp huấn luyện nhanh hơn nhưng có thể làm giảm hiệu năng.

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

Kết quả mAP50-95 trong quá trình huấn luyện khi so sánh 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*

Mức sử dụng tài nguyên#

Đóng băng nhiều layer hơn giúp 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 khiến transfer learning với các layer 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 model lớn hơn hoặc sử dụng kích thước ảnh lớn hơn so với khả năng thông thường.

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

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

Khi nào nên sử dụng tính năng đóng băng Layer#

Đóng băng layer 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ế: Khi bạn bị giới hạn về bộ nhớ GPU hoặc năng lực xử lý.
  2. Dataset nhỏ: Khi dataset mục tiêu nhỏ hơn đáng kể so với dataset pre-training ban đầu, việc đóng băng giúp ngăn overfitting.
  3. Tạo prototype nhanh: Khi bạn cần nhanh chóng điều chỉnh một model hiện có cho task hoặc domain mới để đánh giá ban đầu.
  4. Domain đặc trưng tương đồng: Khi các đặc trưng cấp thấp trong dataset mới rất tương tự các đặc trưng trong dataset mà model đã được pretrain.

Tìm hiểu thêm về các khía cạnh của transfer learning trong mục chú giải thuật ngữ của chúng tôi và cân nhắc các kỹ thuật như tinh chỉnh hyperparameter để tối ưu hiệu năng.

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.

Trạ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 thử GitHub Actions của YOLOv5 về Tích hợp liên tục (CI) đều hoàn tất thành công. Các bài kiểm thử CI này đánh giá nghiêm ngặt chức năng và hiệu năng của YOLOv5 trên những thao tác chính: huấn luyện, validation, inference, exportbenchmark. Chúng đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu, tự động chạy mỗi 24 giờ và sau mỗi commit code mới.

Bình luận