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 dependenciesCơ 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 layersKhá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 detectionCá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 10Chiế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 24Phươ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 10Kế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.
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*
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.
Bộ nhớ GPU được cấp phát (%)
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:
- 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ý.
- 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.
- 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.
- 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 sắc thái của transfer learning trong mục thuật ngữ của chúng tôi và cân nhắc hyperparameter evolution để tối ưu hóa 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, Python và PyTorch được cài đặt sẵn.
- Notebook GPU miễn phí:
- Google Cloud: Hướng dẫn bắt đầu nhanh GCP
- Amazon: Hướng dẫn bắt đầu nhanh AWS
- Azure: Hướng dẫn bắt đầu nhanh AzureML
- Docker: Hướng dẫn bắt đầu nhanh với Docker
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 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, export và benchmark. 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.
FAQ#
Nó đóng băng
Nmodule đầu tiên củamodel.model, do đó trọng số của chúng được giữ cố định và không nhận gradient nào.--freeze 10đóng băng backbone, và--freeze 24đóng băng toàn bộ ngoại trừDetectmodule cuối cùng.Trong thí nghiệm VOC ở trên, việc train tất cả các layer mang lại mAP tốt nhất, việc đóng băng backbone làm giảm một chút độ chính xác, và việc đóng băng tất cả trừ detection head tiêu tốn nhiều nhất. Đổi lại, các lần chạy đóng băng train nhanh hơn và sử dụng ít bộ nhớ GPU hơn đáng kể.
Khi hình ảnh của bạn chia sẻ các đặc trưng bậc thấp với dữ liệu pretraining, dataset của bạn nhỏ, hoặc bạn cần một baseline nhanh trên phần cứng hạn chế. Train tất cả các layer khi dataset lớn lên hoặc khi bạn cần những điểm mAP cuối cùng.
Có. Bắt đầu một lượt chạy mới từ
best.ptcủa model đã đóng băng mà không có--freezeđể fine-tune toàn bộ mạng, thường là với learning rate thấp hơn.