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

Tiến hóa siêu tham số

📚 Hướng dẫn này giải thích sự tiến hóa siêu tham số cho YOLOv5 🚀 Tiến hóa siêu tham số là một phương pháp Tối ưu hóa siêu tham số bằng cách sử dụng Thuật toán di truyền (GA) để tối ưu hóa.

Các siêu tham số trong ML kiểm soát các khía cạnh khác nhau của đào tạo và việc tìm ra các giá trị tối ưu cho chúng có thể là một thách thức. Các phương pháp truyền thống như tìm kiếm lưới có thể nhanh chóng trở nên khó hiểu do 1) không gian tìm kiếm chiều cao, 2) mối tương quan không xác định giữa các kích thước và 3) tính chất tốn kém của việc đánh giá sự phù hợp tại mỗi điểm, làm cho GA trở thành một ứng cử viên phù hợp cho các tìm kiếm siêu tham số.

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

1. Khởi tạo siêu tham số

YOLOv5 có khoảng 30 siêu tham số được sử dụng cho các cài đặt đào tạo khác nhau. Chúng được định nghĩa trong *.yaml các tệp trong /data/hyps thư mục. Dự đoán ban đầu tốt hơn sẽ tạo ra kết quả cuối cùng tốt hơn, vì vậy điều quan trọng là phải khởi tạo các giá trị này đúng cách trước khi phát triển. Nếu nghi ngờ, chỉ cần sử dụng các giá trị mặc định, được tối ưu hóa cho YOLOv5 COCO đào tạo từ đầu.

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials

lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 0.05  # box loss gain
cls: 0.5  # cls loss gain
cls_pw: 1.0  # cls BCELoss positive_weight
obj: 1.0  # obj loss gain (scale with pixels)
obj_pw: 1.0  # obj BCELoss positive_weight
iou_t: 0.20  # IoU training threshold
anchor_t: 4.0  # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.5  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.0  # image mixup (probability)
copy_paste: 0.0  # segment copy-paste (probability)

2. Xác định thể dục

Thể dục là giá trị mà chúng tôi tìm cách tối đa hóa. Trong YOLOv5 Chúng tôi định nghĩa chức năng thể dục mặc định là sự kết hợp có trọng số của các chỉ số: mAP@0.5 đóng góp 10% trọng lượng và mAP@0.5:0.95 đóng góp 90% còn lại, với Chính xác P và Thu hồi R vắng mặt. Bạn có thể điều chỉnh những điều này khi bạn thấy phù hợp hoặc sử dụng định nghĩa thể dục mặc định trong tiện ích / metrics.py (được khuyến nghị).

def fitness(x):
    # Model fitness as a weighted combination of metrics
    w = [0.0, 0.0, 0.1, 0.9]  # weights for [P, R, mAP@0.5, mAP@0.5:0.95]
    return (x[:, :4] * w).sum(1)

3. Phát triển

Sự tiến hóa được thực hiện về một kịch bản cơ bản mà chúng tôi tìm cách cải thiện. Kịch bản cơ sở trong ví dụ này là tinh chỉnh COCO128 cho 10 kỷ nguyên bằng cách sử dụng YOLOv5 được đào tạo trước. Lệnh huấn luyện kịch bản cơ sở là:

python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache

Để phát triển các siêu tham số Cụ thể cho kịch bản này, bắt đầu từ các giá trị ban đầu của chúng tôi được xác định trong Mục 1.và tối đa hóa thể lực được xác định trong Mục 2.thêm --evolve:

# Single-GPU
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --evolve

# Multi-GPU
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 30 \* $i) &&  # 30-second delay (optional)
  echo 'Starting GPU '$i'...' &&
  nohup python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > evolve_gpu_$i.log &
done

# Multi-GPU bash-while (not recommended)
for i in 0 1 2 3 4 5 6 7; do
  sleep $(expr 30 \* $i) &&  # 30-second delay (optional)
  echo 'Starting GPU '$i'...' &&
  "$(while true; do nohup python train.py... --device $i --evolve 1 > evolve_gpu_$i.log; done)" &
done

Cài đặt tiến hóa mặc định sẽ chạy kịch bản cơ sở 300 lần, tức là trong 300 thế hệ. Bạn có thể sửa đổi các thế hệ thông qua --evolve lập luận, tức là python train.py --evolve 1000.

Các nhà khai thác di truyền chính là Crossoverđột biến. Trong công việc này, đột biến được sử dụng, với xác suất 80% và phương sai 0,04 để tạo ra con cái mới dựa trên sự kết hợp của cha mẹ tốt nhất từ tất cả các thế hệ trước. Kết quả được ghi vào runs/evolve/exp/evolve.csv, và con cái có thể lực cao nhất được cứu mỗi thế hệ như runs/evolve/hyp_evolved.yaml:

# YOLOv5 Hyperparameter Evolution Results
# Best generation: 287
# Last generation: 300
#    metrics/precision,       metrics/recall,      metrics/mAP_0.5, metrics/mAP_0.5:0.95,         val/box_loss,         val/obj_loss,         val/cls_loss
#              0.54634,              0.55625,              0.58201,              0.33665,             0.056451,             0.042892,             0.013441

lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 0.05  # box loss gain
cls: 0.5  # cls loss gain
cls_pw: 1.0  # cls BCELoss positive_weight
obj: 1.0  # obj loss gain (scale with pixels)
obj_pw: 1.0  # obj BCELoss positive_weight
iou_t: 0.20  # IoU training threshold
anchor_t: 4.0  # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.5  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.0  # image mixup (probability)
copy_paste: 0.0  # segment copy-paste (probability)

Chúng tôi khuyến nghị tối thiểu 300 thế hệ tiến hóa để có kết quả tốt nhất. Lưu ý rằng quá trình tiến hóa nói chung là tốn kém và tốn thời gian, vì kịch bản cơ bản được đào tạo hàng trăm lần, có thể đòi hỏi hàng trăm hoặc hàng ngàn giờ GPU.

4. Hình dung

evolve.csv được vẽ như sau: evolve.png bằng cách utils.plots.plot_evolve() Sau khi tiến hóa kết thúc với một biểu đồ con trên mỗi siêu tham số hiển thị các giá trị thể dục (trục y) so với các giá trị siêu tham số (trục x). Màu vàng cho biết nồng độ cao hơn. Phân phối dọc chỉ ra rằng một tham số đã bị vô hiệu hóa và không biến đổi. Đây là người dùng có thể lựa chọn trong meta từ điển trong train.py, và rất hữu ích để sửa các tham số và ngăn chúng phát triển.

tiến hoá

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 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.



Đã tạo 2023-11-12, Cập nhật 2023-12-03
Tác giả: glenn-jocher (2)

Ý kiến