Mẹo đạt kết quả huấn luyện YOLOv5 tốt nhất

📚 Hướng dẫn này giải thích cách đạt được mAP và kết quả huấn luyện tốt nhất với YOLOv5 🚀.

Phần lớn thời gian, bạn có thể đạt được kết quả tốt mà không cần thay đổi model hoặc thiết lập huấn luyện, với điều kiện dataset của bạn đủ lớn và được dán nhãn kỹ lưỡng. Nếu ban đầu bạn không nhận được kết quả tốt, có những bước bạn có thể thực hiện để cải thiện, nhưng chúng tôi luôn khuyến nghị người dùng trước tiên hãy huấn luyện với tất cả các thiết lập mặc định trước khi cân nhắc bất kỳ thay đổi nào. Việc này giúp thiết lập một mức hiệu suất cơ sở và xác định các khu vực cần cải thiện.

Nếu bạn có câu hỏi về kết quả huấn luyện của mình, chúng tôi khuyến nghị bạn cung cấp thông tin đầy đủ nhất có thể nếu muốn nhận được phản hồi hữu ích, bao gồm các biểu đồ kết quả (train losses, val losses, P, R, mAP), đường cong PR, confusion matrix, mosaic huấn luyện, kết quả kiểm thử và hình ảnh thống kê dataset như labels.png. Tất cả những thứ này nằm trong thư mục project/name của bạn, thường là yolov5/runs/train/exp.

Chúng tôi đã tổng hợp một hướng dẫn đầy đủ cho người dùng muốn đạt được kết quả tốt nhất khi huấn luyện YOLOv5 dưới đây.

Tập dữ liệu

  • Số ảnh trên mỗi lớp. ≥ 1500 ảnh mỗi lớp được khuyến nghị
  • Số lượng instances trên mỗi lớp. ≥ 10000 instances (đối tượng được dán nhãn) mỗi lớp được khuyến nghị
  • Sự đa dạng của ảnh. Phải mang tính đại diện cho môi trường triển khai. Đối với các trường hợp sử dụng thực tế, chúng tôi khuyến nghị ảnh từ các thời điểm khác nhau trong ngày, các mùa khác nhau, thời tiết khác nhau, ánh sáng khác nhau, các góc độ khác nhau, các nguồn khác nhau (lấy từ trực tuyến, thu thập tại chỗ, các camera khác nhau) v.v.
  • Tính nhất quán của nhãn. Tất cả các instance của mọi lớp trong mọi ảnh phải được dán nhãn. Việc dán nhãn một phần sẽ không hiệu quả.
  • Độ chính xác của nhãn. Nhãn phải bao quanh sát từng đối tượng. Không nên có khoảng cách giữa đối tượng và bounding box của nó. Không đối tượng nào được thiếu nhãn.
  • Nguyên tắc chia tập huấn luyện/kiểm thử (Train/val split). Đảm bảo rằng ảnh validation và ảnh kiểm thử không bao giờ xuất hiện trong tập huấn luyện để tránh các số liệu lạc quan thái quá. Giữ cho phân phối các lớp tương đồng giữa các tập.
  • Xác minh nhãn. Xem train_batch*.jpg khi bắt đầu huấn luyện để xác minh nhãn của bạn hiển thị đúng, ví dụ xem mosaic example.
  • Ảnh nền (Background images). Ảnh nền là những ảnh không có đối tượng, được thêm vào dataset để giảm thiểu False Positives (FP). Chúng tôi khuyến nghị khoảng 0-10% ảnh nền để giúp giảm FPs (COCO có 1000 ảnh nền để tham khảo, chiếm 1% tổng số). Không cần nhãn cho ảnh nền.

Phân tích phân phối lớp dataset COCO

Lựa chọn Model

Các model lớn hơn như YOLOv5x và YOLOv5x6 sẽ mang lại kết quả tốt hơn trong hầu hết các trường hợp, nhưng có nhiều tham số hơn, đòi hỏi nhiều bộ nhớ CUDA hơn để huấn luyện và chạy chậm hơn. Đối với các triển khai trên mobile, chúng tôi khuyến nghị YOLOv5s/m; đối với triển khai trên cloud, chúng tôi khuyến nghị YOLOv5l/x. Xem bảng trong README của chúng tôi để so sánh đầy đủ tất cả các model.

YOLOv5 Models

  • Bắt đầu từ weights đã được huấn luyện trước (Pretrained weights). Khuyến nghị cho các dataset kích thước nhỏ đến trung bình (ví dụ: VOC, VisDrone, GlobalWheat). Truyền tên của model vào đối số --weights. Các model sẽ tự động tải xuống từ bản phát hành YOLOv5 mới nhất.

    python train.py --data custom.yaml --weights yolov5s.pt
    python train.py --data custom.yaml --weights yolov5m.pt
    python train.py --data custom.yaml --weights yolov5l.pt
    python train.py --data custom.yaml --weights yolov5x.pt
    python train.py --data custom.yaml --weights custom_pretrained.pt
  • Bắt đầu từ đầu (From Scratch). Khuyến nghị cho các dataset lớn (ví dụ: COCO, Objects365, OIv6). Truyền YAML kiến trúc model mà bạn quan tâm, cùng với một đối số --weights '' trống:

    python train.py --data custom.yaml --weights '' --cfg yolov5s.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5m.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5l.yaml
    python train.py --data custom.yaml --weights '' --cfg yolov5x.yaml

Thiết lập Huấn luyện

Trước khi sửa đổi bất cứ điều gì, trước tiên hãy huấn luyện với các thiết lập mặc định để thiết lập hiệu suất cơ sở. Danh sách đầy đủ các thiết lập của train.py có thể được tìm thấy trong argparser của train.py.

  • Epochs. Bắt đầu với 300 epochs. Nếu xảy ra quá khớp (overfit) sớm, bạn có thể giảm số lượng epochs. Nếu overfitting không xảy ra sau 300 epochs, hãy huấn luyện lâu hơn, ví dụ: 600, 1200 epochs, v.v.
  • Kích thước ảnh. COCO huấn luyện ở độ phân giải gốc --img 640, mặc dù do số lượng đối tượng nhỏ trong dataset lớn nên có thể hưởng lợi từ việc huấn luyện ở độ phân giải cao hơn như --img 1280. Nếu có nhiều đối tượng nhỏ, các dataset tùy chỉnh sẽ hưởng lợi từ việc huấn luyện ở độ phân giải gốc hoặc cao hơn. Kết quả suy luận tốt nhất đạt được ở cùng giá trị --img khi chạy huấn luyện, ví dụ: nếu bạn huấn luyện ở --img 1280 thì bạn cũng nên kiểm thử và phát hiện ở --img 1280.
  • Batch size. Sử dụng --batch-size lớn nhất mà phần cứng của bạn cho phép. Các batch size nhỏ tạo ra các thống kê batch normalization kém và nên tránh. Bạn có thể sử dụng --batch-size -1 để tự động chọn batch size tối ưu cho GPU của mình.
  • Tốc độ học (Learning rate). Lịch trình tốc độ học mặc định hoạt động tốt trong hầu hết các trường hợp. Để hội tụ nhanh hơn, bạn có thể thử sử dụng cờ --cos-lr để kích hoạt lịch trình tốc độ học cosine, giúp giảm dần tốc độ học theo đường cong cosine qua các epochs.
  • Tăng cường dữ liệu (Data augmentation). YOLOv5 bao gồm nhiều kỹ thuật tăng cường khác nhau như mosaic, kết hợp nhiều ảnh huấn luyện. Đối với một vài epoch cuối, hãy cân nhắc sử dụng --close-mosaic 10 để vô hiệu hóa tăng cường mosaic, giúp ổn định quá trình huấn luyện.
  • Siêu tham số (Hyperparameters). Các siêu tham số mặc định nằm trong hyp.scratch-low.yaml. Chúng tôi khuyến nghị bạn huấn luyện với các siêu tham số mặc định trước khi nghĩ đến việc sửa đổi bất kỳ cái nào. Nhìn chung, việc tăng các siêu tham số tăng cường sẽ giảm và trì hoãn quá trình quá khớp, cho phép huấn luyện lâu hơn và đạt mAP cuối cùng cao hơn. Việc giảm các siêu tham số tăng thành phần mất mát như hyp['obj'] sẽ giúp giảm quá khớp trong các thành phần mất mát cụ thể đó. Để biết phương pháp tối ưu hóa các siêu tham số này một cách tự động, hãy xem Hướng dẫn Tiến hóa Siêu tham số của chúng tôi.
  • Huấn luyện độ chính xác hỗn hợp (Mixed precision). Kích hoạt huấn luyện độ chính xác hỗn hợp với --amp để tăng tốc độ huấn luyện và giảm mức sử dụng bộ nhớ mà không làm giảm độ chính xác của model.
  • Huấn luyện Multi-GPU. Nếu bạn có nhiều GPU, hãy sử dụng --device 0,1,2,3 để phân phối quá trình huấn luyện trên chúng, điều này có thể giảm đáng kể thời gian huấn luyện.
  • Dừng sớm (Early stopping). Sử dụng --patience 50 để dừng huấn luyện nếu các số liệu validation không cải thiện trong 50 epochs, giúp tiết kiệm thời gian và ngăn ngừa quá khớp.

Kỹ thuật tối ưu hóa nâng cao

  • Transfer learning. Đối với các dataset chuyên biệt, hãy bắt đầu với weights được huấn luyện trước và dần dần mở khóa (unfreeze) các lớp trong quá trình huấn luyện để thích nghi model với nhiệm vụ cụ thể của bạn.
  • Cắt tỉa model (Model pruning). Sau khi huấn luyện, hãy cân nhắc cắt tỉa model của bạn để loại bỏ các trọng số dư thừa và giảm kích thước model mà không làm mất hiệu suất đáng kể.
  • Tập hợp model (Model ensemble). Đối với các ứng dụng quan trọng, hãy huấn luyện nhiều model với các cấu hình khác nhau và kết hợp các dự đoán của chúng để cải thiện độ chính xác.
  • Tăng cường khi kiểm thử (Test-time augmentation). Kích hoạt TTA trong quá trình suy luận với --augment để cải thiện độ chính xác dự đoán bằng cách lấy trung bình kết quả từ các phiên bản tăng cường của ảnh đầu vào.

Đọc thêm

Nếu bạn muốn biết thêm, một nơi tốt để bắt đầu là 'Công thức huấn luyện Neural Networks' của Karpathy, nơi có những ý tưởng tuyệt vời cho việc huấn luyện áp dụng rộng rãi trên tất cả các lĩnh vực ML: https://karpathy.github.io/2019/04/25/recipe/

Để biết thêm thông tin chi tiết về các thiết lập và cấu hình huấn luyện, hãy tham khảo tài liệu về thiết lập train của Ultralytics, cung cấp các giải thích toàn diện về tất cả các tham số có sẵn.

Chúc bạn may mắn 🍀 và hãy cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào khác!

Câu hỏi thường gặp (FAQ)

Làm thế nào để tôi biết liệu model của mình có đang bị quá khớp (overfitting) không?

Model của bạn có thể đang bị quá khớp nếu loss huấn luyện tiếp tục giảm trong khi loss validation bắt đầu tăng. Hãy theo dõi mAP validation - nếu nó đi ngang hoặc giảm trong khi loss huấn luyện vẫn tiếp tục cải thiện, đó là dấu hiệu của quá khớp. Các giải pháp bao gồm thêm nhiều dữ liệu huấn luyện, tăng cường dữ liệu hoặc triển khai các kỹ thuật chính quy hóa (regularization).

Batch size tối ưu để huấn luyện YOLOv5 là bao nhiêu?

Batch size tối ưu phụ thuộc vào bộ nhớ GPU của bạn. Các batch size lớn hơn thường mang lại thống kê batch normalization tốt hơn và sự ổn định khi huấn luyện. Sử dụng batch size lớn nhất mà phần cứng của bạn có thể xử lý mà không bị hết bộ nhớ. Bạn có thể sử dụng --batch-size -1 để tự động xác định batch size tối ưu cho thiết lập của mình.

Làm thế nào tôi có thể tăng tốc độ huấn luyện YOLOv5?

Để tăng tốc huấn luyện, hãy thử: kích hoạt huấn luyện độ chính xác hỗn hợp với --amp, sử dụng nhiều GPU với --device 0,1,2,3, lưu đệm (cache) dataset của bạn với --cache và tối ưu hóa batch size của bạn. Cũng hãy cân nhắc sử dụng một biến thể model nhỏ hơn như YOLOv5s nếu độ chính xác tuyệt đối không phải là yếu tố quan trọng.

Bình luận