Chuyển đến nội dung

Chuyển giao học tập với các lớp đóng băng trong YOLOv5

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

Trước Khi Bắt Đầu

Đầu tiên, hãy clone kho lưu trữ YOLOv5 và cài đặt các dependency cần thiết được liệt kê trong requirements.txt. Hảy đảm bảo bạn có một Python>=3.8.0 môi trường với PyTorch>=1.8 đã được cài đặt. Các mô hình mô hình và yêu cầu các bộ dữ liệu sẽ được tải xuống tự động từ YOLOv5 mới nhất phát hành.

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

Cách đóng băng Layer Hoạt Động

Khi bạn đóng băng các layer trong một mạng nơ-ron, bạn ngăn cản các tham số của chúng (weights and biases) không được cập nhật trong quá trình huấn luyện. Trong PyTorch, điều này đạt được bằng cách đặt requires_grad thuộc tính của các tensor của lớp thành False. Do đó, gradient không được tính toán cho các layer này trong lan truyền ngược, giảm thiểu tính toán và bộ nhớ.

Đây là cách YOLOv5 triển khai đóng băng lớp trong tập lệnh 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

Khám phá kiến trúc mô hình

Hiểu cấu trúc của mô hình YOLOv5 là rất quan trọng để quyết định lớp nào sẽ đóng băng. Bạn có thể kiểm tra tên của tất cả các mô-đun 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 bao gồm một backbone (mạng nền) (các lớp 0-9 trong 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 lớp 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

Tùy chọn đóng băng

Bạn có thể kiểm soát những layer nào bị đóng băng bằng cách sử dụng --freeze đối số trong lệnh huấn luyện. Đối số này chỉ định chỉ mục của không đóng băng module; tất cả các module trước chỉ mục này sẽ bị đóng băng trọng số.

Chỉ đóng băng Backbone

Để đóng băng toàn bộ backbone (các lớp từ 0 đến 9), thường được sử dụng 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 đượ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 hiệu quả khi tập dữ liệu mục tiêu của bạn có các đặc trưng trực quan cơ bản tương tự (cạnh, kết cấu) với dữ liệu đào tạo ban đầu (ví dụ: COCO) nhưng chứa các danh mục đối tượng khác nhau.

Đóng băng tất cả 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 Detect module, thường là module cuối cùng, ví dụ: module 24 trong YOLOv5s) có thể huấn luyện được:

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

Cách tiếp cận 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 được. Nó đòi hỏi ít tài nguyên tính toán nhất để tinh chỉnh.

So sánh hiệu suất

Để minh họa các ảnh hưởng của việc đóng băng các lớp, chúng tôi đã huấn luyện YOLOv5m trên Bộ dữ liệu Pascal VOC cho 50 epochs, bắt đầu từ COCO được huấn luyện trước chính thức weights (yolov5m.pt). Chúng tôi đã so sánh ba trường hợp: đào tạo tất cả các lớp (--freeze 0), đóng băng backbone (--freeze 10), và đóng băng tất cả 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 hyp.finetune.yaml --freeze 10

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

Kết quả cho thấy rằng việc đóng băng các lớp có thể tăng tốc đáng kể quá trình huấn luyện nhưng có thể dẫn đến giảm nhẹ mAP (mean Average Precision - Độ chính xác trung bình) 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 đóng băng nhiều lớp hơn giúp huấn luyện nhanh hơn với chi phí có thể làm giảm hiệu suất.

Kết quả đào tạo mAP50 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ả đào tạo mAP50-95 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

Bảng tóm tắt kết quả hiệu suất Bảng tóm tắt các chỉ số hiệu suất

Sử dụng tài nguyên

Việc đóng băng nhiều lớp hơn sẽ 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 việc chuyển giao học tập với các lớp đóng băng trở thành một lựa chọn hấp dẫn khi làm việc với các tài nguyên phần cứng hạn chế, cho phép đào tạo các mô hình lớn hơn hoặc sử dụng kích thước hình ảnh lớn hơn so với khả năng có thể.

Tỷ lệ bộ nhớ GPU được cấp phát trong quá trình đào tạo Bộ nhớ GPU được cấp phát (%)

Tỷ lệ sử dụng bộ nhớ GPU trong quá trình đào tạo Mức sử dụng GPU (%)

Khi nào nên sử dụng đóng băng lớp (Layer Freezing)

Đóng băng lớp trong quá trình chuyển giao học tập đặ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 có những hạn chế về bộ nhớ GPU hoặc sức mạnh xử lý.
  2. Bộ Dữ Liệu Nhỏ: Khi bộ dữ liệu mục tiêu của bạn nhỏ hơn đáng kể so với bộ dữ liệu huấn luyện trước ban đầu, việc đóng băng giúp ngăn ngừa quá khớp (overfitting).
  3. Tạo mẫu nhanh: Khi bạn cần nhanh chóng điều chỉnh một mô hình hiện có cho một nhiệm vụ hoặc miền 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 bộ dữ liệu mới của bạn rất giống với các đặc trưng trong bộ dữ liệu mà mô hình đã được huấn luyện trước.

Tìm hiểu thêm về các sắc thái của học chuyển giao trong mục từ điển thuật ngữ của chúng tôi và xem xét các kỹ thuật như điều chỉnh siêu tham số để tối ưu hóa hiệu suất.

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 phụ thuộc thiết yếu như CUDA, CuDNN, PythonPyTorch được cài đặt sẵn.

Trạng thái dự án

Trạng thái tích hợp liên tục của YOLOv5

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) 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điểm chuẩn. 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 cứ sau 24 giờ và trên mỗi lần commit mã mới.



📅 Đã tạo 1 năm trước ✏️ Cập nhật 4 tháng trước

Bình luận