Bỏ để qua phần nội dung

Chuyển giao việc học với các lớp đông lạnh

📚 This guide explains how to freeze YOLOv5 🚀 layers when transfer learning. Transfer learning is a useful way to quickly retrain a model on new data without having to retrain the entire network. Instead, part of the initial weights are frozen in place, and the rest of the weights are used to compute loss and are updated by the optimizer. This requires less resources than normal training and allows for faster training times, though it may also result in reductions to final trained accuracy.

Trước khi bắt đầu

Sao chép repo và cài đặt requirements.txt trong một PythonMôi trường >=3.8.0 , bao gồm PyTorch>=1,8. Mô hìnhbộ dữ liệu tải xuống tự động từ phiên bản mới nhất YOLOv5 phát hành.

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

Đóng băng xương sống

Tất cả các lớp phù hợp với train.py freeze Danh sách trong train.py sẽ được đóng băng bằng cách đặt gradient của chúng về 0 trước khi đào tạo bắt đầu.

# Freeze
freeze = [f"model.{x}." for x in range(freeze)]  # layers to freeze
for k, v in model.named_parameters():
    v.requires_grad = True  # train all layers
    if any(x in k for x in freeze):
        print(f"freezing {k}")
        v.requires_grad = False

Để xem danh sách tên mô-đun:

for k, v in model.named_parameters():
    print(k)

"""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
...
model.23.m.0.cv2.bn.weight
model.23.m.0.cv2.bn.bias
model.24.m.0.weight
model.24.m.0.bias
model.24.m.1.weight
model.24.m.1.bias
model.24.m.2.weight
model.24.m.2.bias
"""

Nhìn vào kiến trúc mô hình chúng ta có thể thấy rằng xương sống mô hình là các lớp 0-9:

# YOLOv5 v6.0 backbone
backbone:
    # [from, number, module, args]
    - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2
    - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
    - [-1, 3, C3, [128]]
    - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
    - [-1, 6, C3, [256]]
    - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
    - [-1, 9, C3, [512]]
    - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
    - [-1, 3, C3, [1024]]
    - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv5 v6.0 head
head:
    - [-1, 1, Conv, [512, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 6], 1, Concat, [1]] # cat backbone P4
    - [-1, 3, C3, [512, False]] # 13

    - [-1, 1, Conv, [256, 1, 1]]
    - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
    - [[-1, 4], 1, Concat, [1]] # cat backbone P3
    - [-1, 3, C3, [256, False]] # 17 (P3/8-small)

    - [-1, 1, Conv, [256, 3, 2]]
    - [[-1, 14], 1, Concat, [1]] # cat head P4
    - [-1, 3, C3, [512, False]] # 20 (P4/16-medium)

    - [-1, 1, Conv, [512, 3, 2]]
    - [[-1, 10], 1, Concat, [1]] # cat head P5
    - [-1, 3, C3, [1024, False]] # 23 (P5/32-large)

    - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

Vì vậy, chúng ta có thể định nghĩa danh sách đóng băng để chứa tất cả các mô-đun với 'model.0.' - 'model.9.' trong tên của chúng:

python train.py --freeze 10

Đóng băng tất cả các lớp

Để đóng băng mô hình đầy đủ ngoại trừ các lớp tích chập đầu ra cuối cùng trong Detect(), chúng tôi đặt danh sách đóng băng để chứa tất cả các mô-đun có 'model.0.' - 'model.23.' trong tên của chúng:

python train.py --freeze 24

Kết quả

Chúng tôi đào tạo YOLOv5m trên VOC trên cả hai tình huống trên, cùng với mô hình mặc định (không đóng băng), bắt đầu từ COCO chính thức được đào tạo trước --weights yolov5m.pt:

train.py --batch 48 --weights yolov5m.pt --data voc.yaml --epochs 50 --cache --img 512 --hyp hyp.finetune.yaml

So sánh độ chính xác

The results show that freezing speeds up training, but reduces final accuracy slightly.

Đóng băng kết quả đào tạo mAP50

Kết quả huấn luyện đóng băng mAP50-95

Bảng kết quả

GPU So sánh sử dụng

Điều thú vị là càng nhiều mô-đun bị đóng băng thì càng ít GPU bộ nhớ là cần thiết để đào tạo, và thấp hơn GPU Sử dụng. Điều này chỉ ra rằng các mô hình lớn hơn, hoặc các mô hình được đào tạo ở kích thước hình ảnh lớn hơn có thể được hưởng lợi từ việc đóng băng để đào tạo nhanh hơn.

Đào tạo GPU phần trăm bộ nhớ được phân bổ

Đào tạo GPU Phần trăm sử dụng bộ nhớ

Môi trường được hỗ trợ

Ultralytics Cung cấp một loạt các môi trường sẵn sàng sử dụng, mỗi môi trường được cài đặt sẵn với các phụ thuộc thiết yếu như CUDA, CUDNN,PythonPyTorch, để khởi động các dự án của bạn.

Tình trạng dự án

YOLOv5 CI

Huy hiệu này cho biết rằng tất cả YOLOv5 Các bài kiểm tra Tích hợp liên tục (CI) GitHub Actions đã vượt qua thành công. Các bài kiểm tra CI này kiểm tra nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên các khía cạnh chính khác nhau: đào tạo, xác nhận, suy luận, xuất khẩuđ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, với các thử nghiệm được tiến hành 24 giờ một lần và theo mỗi cam kết mới.

📅 Được tạo ra cách đây 1 năm ✏️ Đã cập nhật cách đây 1 tháng

Ý kiến