Transfer 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 triển khai transfer learning. Transfer learning là một kỹ thuật machine learning (ML) mạnh mẽ cho phép bạn nhanh chóng huấn luyện lại một model 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 lớp ban đầu và chỉ cập nhật các 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 huấn luyện. Tuy nhiên, phương pháp này có thể ảnh hưởng nhẹ đến accuracy cuối cùng của model.
Trước khi Bắt đầu#
Đầu 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 models đã huấn luyện trước và datasets cần thiết sẽ được tải xuống tự động từ release YOLOv5 mới nhất.
git clone https://github.com/ultralytics/yolov5 # clone repository
cd yolov5
pip install -r requirements.txt # install dependenciesCá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 không cho các tham số (trọng số và bias) của chú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 thiết lập thuộc tính requires_grad của các tensor trong lớp thành False. Do đó, gradient không được tính toán cho các lớp này trong quá trình backpropagation, giúp tiết kiệm tính toán và bộ nhớ.
Dưới đây là cách YOLOv5 thực hiện việc đóng băng lớp trong training script của mình:
# 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 layersKhá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 feature extraction, và một phần head (các lớp còn lại) thực hiện việc 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 detectionCác tùy chọn đóng băng#
Bạn có thể điều khiển những lớp nào được đóng băng bằng cách sử dụng đối số --freeze trong câu lệnh huấn luyện. Đối số này chỉ định chỉ số của module chưa được đóng băng đầu tiên; tất cả các module trước chỉ số 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 chỉ số nào tương ứng với một block cụ thể.
Chỉ đóng băng Backbone#
Để đóng băng toàn bộ backbone (từ lớp 0 đến 9), điều này thường phổ biến 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 chung đã học từ một COCO dataset lớn:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 10Chiế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.
Đóng băng tất cả ngoại trừ các lớp phát hiện cuối cùng#
Để đóng băng hầu như toàn bộ mạng, chỉ giữ 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) có thể huấn luyện:
python train.py --weights yolov5m.pt --data your_dataset.yaml --freeze 24Phương pháp này hữu ích khi bạn chủ yếu cần điều chỉnh model cho một số lượng class đầu ra khác nhau trong khi giữ nguyên phần lớn các đặc trưng đã học. Nó đòi hỏi ít tài nguyên tính toán nhất cho việc fine-tuning.
So sánh hiệu năng#
Để minh họa ả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 Pascal VOC dataset trong 50 epochs, bắt đầu từ weights đã được huấn luyện trước chính thức của COCO (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 10Kế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 đóng băng nhiều lớp hơn mang lại thời gian huấn luyện nhanh hơn nhưng đánh đổi bằng hiệuem suất có thể thấp hơn.
So sánh mAP50 trong quá trình huấn luyện
So sánh mAP50-95 trong quá trình huấn luyện
*Summary table of performance metrics*
Sử 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 model lớn hơn hoặc sử dụng kích thước ảnh lớn hơn so với bình thường.
Phần trăm Bộ nhớ GPU được phân bổ (%)
Hiệu suất sử dụng Bộ nhớ GPU (%)
Khi 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:
- 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ý.
- Small Datasets: Khi dataset mục tiêu của bạn nhỏ hơn đáng kể so với dataset huấn luyện trước ban đầu, việc đóng băng giúp ngăn ngừa overfitting.
- 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.
- 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 glossary entry của chúng tôi và cân nhắc các kỹ thuật như hyperparameter tuning để tối ưu hóa hiệu năng.
Cá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, Python, và PyTorch đã được cài đặt sẵn.
- Free GPU Notebooks:
- Google Cloud: GCP Quickstart Guide
- Amazon: AWS Quickstart Guide
- Azure: AzureML Quickstart Guide
- Docker: Docker Quickstart Guide
Trạng thái Dự án#
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) của YOLOv5 GitHub Actions đều đang vượt qua thành công. Các bài kiểm tra CI này đánh giá nghiêm ngặt tính năng và hiệu năng của YOLOv5 trên các hoạt động chính: training, validation, inference, export, và benchmarks. 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 commit code mới.