Chuyển đến nội dung

Phát triển Siêu tham số cho YOLOv5

📚 Hướng dẫn này giải thích về quá trình 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 máy học kiểm soát các khía cạnh khác nhau của quá trình huấn luyện và việc tìm kiếm 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 theo lưới có thể nhanh chóng trở nên khó khăn do:

  1. Không gian tìm kiếm chiều cao
  2. Các tương quan chưa biết giữa các chiều
  3. Bản chất tốn kém của việc đánh giá mức độ phù hợp tại mỗi điểm

Điều này làm cho thuật toán di truyền 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 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. Mô hìnhbộ dữ liệu được tải xuống tự động từ phiên bản phát hành YOLOv5 mới nhất.

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 huấn luyện khác nhau. Chúng được xác định trong *.yaml các tệp trong /data/hyps thư mục. Các 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 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 huấn luyện YOLOv5 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. Xác Định Độ Thích Nghi

Độ phù hợp là giá trị chúng ta tìm cách tối đa hóa. Trong YOLOv5, chúng ta định nghĩa một hàm độ phù hợp 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 số và mAP@0.5:0.95 đóng góp 90% còn lại, với Độ chính xác PĐộ nhớ lại R vắng mặt. Bạn có thể điều chỉnh những điều này khi thấy phù hợp hoặc sử dụng định nghĩa độ phù hợp mặc định trong utils/metrics.py (được 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. Phát Triển

Quá trình tiến hóa được thực hiện dựa trên một kịch bản cơ sở 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 trong 10 epochs bằng cách sử dụng YOLOv5s được huấn luyện 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 ta được xác định trong Phần 1., và tối đa hóa độ thích nghi được định nghĩa trong Mục 2., hãy thêm --evolve:

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

# Multi-GPU with delay
for i in {0..7}; do
  sleep $((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

# Continuous training (use with caution)
# for i in {0..7}; do
#   sleep $((30 * i))  # 30-second delay (optional)
#   echo "Starting continuous training on GPU $i..."
#   (
#     while true; do
#       python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache --device $i --evolve > "evolve_gpu_$i.log"
#     done
#   ) &
# done

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

Các toán tử di truyền chính là lai ghépđột biến. Trong nghiên cứu 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 các 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 lại vào runs/evolve/exp/evolve.csv, và thế hệ con có độ thích nghi cao nhất được lưu lại mỗi thế hệ dưới dạng 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 tiến hành tối thiểu 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ơ bản được huấn luyện hàng trăm lần, có thể đòi hỏi hàng trăm hoặc hàng nghìn giờ GPU.

4. Trực quan hóa

evolve.csv được vẽ dưới dạng evolve.png bởi utils.plots.plot_evolve() sau khi quá trình tiến hóa kết thúc với một biểu đồ con cho mỗi siêu tham số hiển thị độ thích nghi (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 bố dọc cho biết rằng một tham số đã bị tắt và không bị đột biến. Điều này do người dùng lựa chọn trong từ điển meta trong train.py và rất hữu ích để cố định các tham số và ngăn chúng tiến hóa.

evolve

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ần phụ thuộc thiết yếu như CUDA, CUDNN, PythonPyTorch, để khởi động các dự án của bạn.

Trạng thái dự án

YOLOv5 CI

Huy hiệu này cho biết rằng 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: huấn luyện, xác thực, suy luận, xuấtđ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 thực hiện sau mỗi 24 giờ và sau mỗi cam kết mới.



📅 Đã tạo 1 năm trước ✏️ Cập nhật 5 tháng trước

Bình luận