Bỏ qua 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 của siêu tham số cho YOLOv5 🚀. Tiến hóa siêu tham số là phương pháp tối ưu hóa siêu tham số sử dụng thuật toán di truyền (GA) để tối ưu hóa.

Siêu tham số trong ML kiểm soát nhiều khía cạnh khác nhau của quá trình đà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ó khăn do 1) không gian tìm kiếm có chiều cao 2) mối tương quan chưa biết giữa các chiều và 3) bản chất tốn kém của việc đánh giá độ phù hợp tại mỗi điểm, khiến GA trở thành ứng cử viên phù hợp cho tìm kiếm siêu tham số.

Trước khi bạn bắt đầu

Sao chép kho lưu trữ và cài đặt requirements.txt trong môi trường Python >=3.8.0 , bao gồm PyTorch >=1.8 . Các mô hìnhtập dữ liệu tự động tải xuống từ phiên bản mới nhất YOLOv5 giải phóng .

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 thiết lập đào tạo khác nhau. Chúng được định nghĩa trong *.yaml các tập tin trong /data/hyps thư mục. Những phỏng đ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 tiến hóa. 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 Đào tạo COCO 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. Định nghĩa về thể lực

Thể lực là giá trị mà chúng ta muốn tối đa hóa. Trong YOLOv5 chúng tôi định nghĩa hàm thể lực mặc định là sự kết hợp có trọng số của các số liệu: 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 PNhớ lại R vắng mặt. Bạn có thể điều chỉnh những điều này theo ý muốn hoặc sử dụng định nghĩa thể lực mặc định trong utils/metrics.py (khuyến nghị).

def fitness(x):
    """Return model fitness as the sum of weighted metrics [P, R, mAP@0.5, mAP@0.5:0.95]."""
    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. Tiến hóa

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

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

Để phát triển siêu tham số cụ thể cho tình huống 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 mức độ phù hợp được xác định trong Mục 2., thêm vào --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 toán tử di truyền chính là sự giao nhauđột biến. Trong công trình 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 thế hệ con mới dựa trên sự kết hợp của các bậc 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.csvvà con cái có sức khỏe tốt nhất được lưu lại qua mỗi thế hệ 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 bạn nên có ít nhất 300 thế hệ tiến hóa để có kết quả tốt nhất. Lưu ý rằng tiến hóa thường tốn kém và mất thời gian , vì kịch bản cơ sở được đào tạo hàng trăm lần, có thể yêu cầu hàng trăm hoặc hàng nghìn GPU giờ.

4. Hình dung

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

tiến hóa

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

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

Tình trạng dự án

YOLOv5 CI

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

Bình luận