Tiến hóa siêu tham số cho YOLOv5#
📚 Hướng dẫn này giải thích về 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ố sử dụng Thuật toán di truyền (GA) để tối ưu hóa.
Các siêu tham số trong học máy kiểm soát nhiều khía cạnh của quá trình huấn luyện, và việc tì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 trên lưới có thể nhanh chóng trở nên bất khả thi do:
- Không gian tìm kiếm có số chiều cao
- Các mối tương quan chưa biết giữa các chiều
- Chi phí đánh giá độ thích nghi tại mỗi điểm cao
Điều này khiến các thuật toán di truyền trở thành lựa chọn phù hợp cho việ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ôi trường Python>=3.8.0, bao gồm PyTorch>=1.8. Model và dataset sẽ tự động được tải xuống từ 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 # install1. Khởi tạo siêu tham số#
YOLOv5 có khoảng 30 siêu tham số được sử dụng cho nhiều thiết lập huấn luyện khác nhau. Các siêu tham số này được định nghĩa trong các tệp *.yaml thuộc thư mục /data/hyps. Các giá trị khởi tạo tốt hơn sẽ tạo ra kết quả cuối cùng tốt hơn, vì vậy việc khởi tạo đúng các giá trị này trước khi tiến hóa là rất quan trọng. Nếu không chắc chắn, chỉ cần sử dụng các giá trị mặc định, vốn được tối ưu hóa cho việc huấn luyện YOLOv5 trên 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#
Fitness là giá trị chúng ta muốn tối đa hóa. Trong YOLOv5, chúng ta định nghĩa một hàm fitness mặc định dưới dạng sự kết hợp 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) và độ thu hồi (R) vắng mặt. Bạn có thể điều chỉnh các giá trị này theo ý muốn hoặc sử dụng định nghĩa fitness mặc định trong utils/metrics.py (được khuyên dùng). Fitness này quyết định kết quả nào được lưu vào hyp_evolve.yaml; bản thân thuật toán di truyền xếp hạng cha mẹ và các cá thể ưu tú chỉ dựa trên mAP@0.5, vì vậy việc thay đổi các trọng số này không làm thay đổi việc lựa chọn cha mẹ.
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#
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 ta muốn cải thiện. Kịch bản cơ sở trong ví dụ này là tinh chỉnh COCO128 trong 10 epoch bằng YOLOv5s đã được pretrained. Lệnh huấn luyện cho kịch bản cơ sở là:
python train.py --epochs 10 --data coco128.yaml --weights yolov5s.pt --cacheĐể tiến hóa các siêu tham số cụ thể cho kịch bản này, bắt đầu từ các giá trị khởi tạo được định nghĩa trong Mục 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
# ) &
# doneCài đặt tiến hóa mặc định chạy trong 300 thế hệ và mỗi thế hệ huấn luyện kịch bản cơ sở một lần cho mỗi cá thể trong số 50 cá thể của quần thể. Bạn có thể sửa đổi các thế hệ thông qua đối số --evolve, tức là python train.py --evolve 1000.
Các toán tử di truyền chính là lai ghép và đột biến. Mỗi thế hệ huấn luyện mọi cá thể và chấm điểm cá thể đó theo mAP@0.5, chọn lọc cha mẹ bằng cách lựa chọn giải đấu với các cá thể ưu tú có độ thích nghi cao nhất được thêm vào nhóm cha mẹ, và xây dựng quần thể tiếp theo thông qua lai ghép và đột biến, với tỷ lệ thích ứng theo tiến trình tiến hóa. Kết quả được ghi lại vào runs/evolve/exp/evolve.csv, và thế hệ con có fitness cao nhất được lưu lại mỗi thế hệ dưới dạng runs/evolve/exp/hyp_evolve.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 dùng tối thiểu 300 thế hệ tiến hóa để đạt kết quả tốt nhất. Lưu ý rằng quá trình tiến hóa thường tốn kém và mất thời gian, vì kịch bản cơ sở được huấn luyện hàng nghìn lần, có khả năng đòi hỏi hàng trăm hoặc hàng nghìn giờ GPU.
Khi quá trình tiến hóa hoàn tất, hãy sử dụng lại các thiết lập đã tìm được bằng cách trỏ quá trình huấn luyện đến tệp đã lưu, chẳng hạn như python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.
4. Trực quan hóa#
evolve.csv được utils.plots.plot_evolve() biểu diễn dưới dạng evolve.png sau khi quá trình tiến hóa hoàn tất, với mỗi siêu tham số có một biểu đồ con hiển thị độ thích nghi (trục y) theo các giá trị siêu tham số (trục x). Màu vàng biểu thị nồng độ cao hơn. Các phân bố dọc cho biết một tham số đã bị vô hiệu hóa và không đột biến. Bạn có thể lựa chọn điều này trong dictionary meta ở train.py; tính năng này hữu ích để cố định các tham số và ngăn chúng 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 được cài đặt sẵn các dependency thiết yếu như CUDA, CUDNN, Python và PyTorch, giúp bạn nhanh chóng bắt đầu các project.
- 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 cho biết 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 đã vượt qua thành công. Các bài kiểm thử CI này kiểm tra nghiêm ngặt chức năng và hiệu năng của YOLOv5 trên nhiều khía cạnh quan trọng: huấn luyện, validation, suy luận, 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, với các bài kiểm thử được thực hiện mỗi 24 giờ và sau mỗi commit mới.
FAQ#
Mỗi thế hệ huấn luyện kịch bản cơ sở một lần cho mỗi cá thể trong quần thể 50 thành viên, vì vậy 300 thế hệ của một lần chạy COCO128 10-epoch có chi phí gấp khoảng 15.000 lần chi phí của một lần chạy như vậy. Hãy giữ cho kịch bản cơ sở ngắn gọn và mang tính đại diện. Vòng lặp đa GPU ở trên bắt đầu một tìm kiếm độc lập trên mỗi GPU thay vì chia sẻ một tìm kiếm duy nhất, vì vậy hãy giảm
--evolvecho mỗi tiến trình nếu bạn đang làm việc với một ngân sách cố định.Có.
--evolvemặc định là 300 thế hệ; hãy truyền một số chẳng hạn như--evolve 1000để chạy nhiều hơn.Đặt giá trị đầu tiên của mục trong từ điển
metatrongtrain.pythànhFalse. Các tham số bị loại trừ giữ nguyên giá trị ban đầu của chúng và xuất hiện dưới dạng các đường thẳng đứng trongevolve.png.Truyền tệp đã lưu vào một lần chạy huấn luyện thông thường:
python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.