Meet YOLO26: next-gen vision AI.

Link to this sectionTiế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ố (hyperparameter evolution) 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 khác nhau của quá trình huấn luyện, 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ư grid search có thể nhanh chóng trở nên không khả thi do:

  1. Không gian tìm kiếm có số chiều cao
  2. Các mối tương quan chưa biết giữa các chiều
  3. Bản chất đắt đỏ của việc đánh giá độ thích nghi (fitness) tại mỗi điểm

Điều này làm cho các thuật toán di truyền trở thành một ứng cử viên phù hợp cho việc tìm kiếm siêu tham số.

Link to this sectionTrướ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. Các modeltập dữ liệu sẽ tự động tải xuống từ bản phát hành mới nhất của YOLOv5.

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

Link to this section1. 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 huấn luyện khác nhau. Các tham số này được định nghĩa trong các tệp *.yaml trong thư mục /data/hyps. Những dự đoán khởi đầu 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 quá trình 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)

Link to this section2. Xác định Độ thích nghi (Fitness)#

Fitness là giá trị mà chúng ta muốn tối đa hóa. Trong YOLOv5, chúng ta định nghĩa hàm fitness mặc định là một sự kết hợp có trọng số của các chỉ số: 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 precision (P)recall (R) không được tính. Bạn có thể điều chỉnh các giá trị này nếu thấy phù hợp hoặc sử dụng định nghĩa fitness 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)

Link to this section3. Tiến hóa (Evolve)#

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 sử dụng YOLOv5s đã được huấn luyện trước. 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 đầu được định nghĩa ở Mục 1., và tối đa hóa fitness được định nghĩa ở 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 thiết lập tiến hóa mặc định sẽ chạy kịch bản cơ sở 300 lần, tức là 300 thế hệ. Bạn có thể thay đổi số thế hệ thông qua đối số --evolve, ví dụ: python train.py --evolve 1000.

Các toán tử di truyền chính là lai ghép (crossover)đột biến (mutation). 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 thế hệ con mới dựa trên sự kết hợp của cá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ó fitness cao nhất được lưu sau 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 nghị tối thiểu 300 thế hệ tiến hóa để đạt được kết quả tốt nhất. Lưu ý rằng tiến hóa thường đắt đỏ và tốn thời gian, vì kịch bản cơ sở được huấn luyện hàng trăm lần, có thể tiêu tốn 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 tái sử dụng các thiết lập đã tìm thấy bằng cách trỏ lệnh huấn luyện vào tệp đã lưu, ví dụ: python train.py --hyp runs/evolve/exp/hyp_evolve.yaml --data your.yaml --weights yolov5s.pt.

Link to this sectionTrực quan hóa#

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

Kết quả fitness tiến hóa siêu tham số YOLOv5

Link to this sectionCác 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 đều được cài đặt sẵn các phụ thuộc thiết yếu như CUDA, CUDNN, Python, và PyTorch để giúp bạn bắt đầu dự án của mình.

Link to this sectionTrạng thái 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) của 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 qua các khía cạnh chính: huấn luyện, xác thực, suy luận, xuất, và benchmarks. Chúng đảm bảo hoạt động nhất quán và tin cậy trên macOS, Windows và Ubuntu, với các thử nghiệm được tiến hành mỗi 24 giờ và sau mỗi commit mới.

Bình luận