YOLO Vision 2026:

Các mẹo để có 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 kết quả mAP và kết quả huấn luyện tốt nhất với YOLOv5 🚀.

Hầu hết thời gian bạn có thể đạt được kết quả tốt mà không cần thay đổi cấu trúc model hay cài đặt huấn luyện, với điều kiện là tập dữ liệu của bạn đủ lớn và được gán nhãn tốt. Nếu ban đầu bạn không nhận được kết quả tốt, có một số 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 nên huấn luyện với tất cả các cài đặt mặc định trước khi cân nhắc bất kỳ thay đổi nào. Điều này giúp thiết lập đường cơ sở (baseline) hiệu suất và xác định các khu vực cần cải thiện.

Nếu bạn có thắc mắc về kết quả huấn luyện của mình, chúng tôi khuyên bạn nên cung cấp lượng thông tin tối đa 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ả (loss huấn luyện, loss xác thực, P, R, mAP), đường cong PR, confusion matrix, các mosaic huấn luyện, kết quả kiểm tra và các hình ảnh thống kê tập dữ liệu như labels.png. Tất cả các mục này đều 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 đủ bên dưới cho người dùng muốn đạt được kết quả tốt nhất khi huấn luyện YOLOv5.

Tập dữ liệu (Dataset)#

  • Hình ảnh mỗi lớp. Khuyến nghị ≥ 1500 hình ảnh mỗi lớp
  • Số lượng instances mỗi lớp. Khuyến nghị ≥ 10000 instances (đối tượng được gán nhãn) mỗi lớp
  • Sự đa dạng của hình ả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ị các hình ả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, góc độ khác nhau, nguồn gốc khác nhau (lấy từ Internet, thu thập cục bộ, từ các máy ảnh khác nhau), v.v.
  • Sự nhất quán của nhãn. Tất cả các instance của tất cả các lớp trong tất cả hình ảnh phải được gán nhãn. Việc gán nhãn một phần sẽ không hoạt động.
  • Độ accuracy của nhãn. Các nhãn phải bao bọc chặt chẽ từng đối tượng. Không được có khoảng trống giữa đối tượng và bounding box của nó. Không được bỏ sót nhãn của bất kỳ đối tượng nào.
  • Kỷ luật phân chia Train/val. Đảm bảo rằng hình ảnh kiểm tra (test) và xác thực (validation) không bao giờ xuất hiện trong tập huấn luyện để tránh các chỉ số quá lạc quan. Giữ cho phân phối lớp tương đương nhau giữa các tập dữ liệu.
  • Xác thực nhãn. Xem train_batch*.jpg khi bắt đầu huấn luyện để xác minh các nhãn của bạn xuất hiện chính xác, ví dụ: xem mosaic ví dụ.
  • Hình ảnh nền (Background images). Hình ảnh nền là những hình ảnh không có đối tượng, được thêm vào tập dữ liệu để giảm tỉ lệ Dương tính giả (False Positives - FP). Chúng tôi khuyến nghị khoảng 0-10% hình ảnh nền để giúp giảm FP (COCO có 1000 hình ảnh nền để tham khảo, chiếm 1% tổng số). Không cần nhãn cho hình ảnh nền.

Phân tích phân phối lớp tập dữ liệu 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 mọi 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 mobile, chúng tôi khuyên dùng YOLOv5s/m; đối với các triển khai cloud, chúng tôi khuyên dùng YOLOv5l/x. Xem bảng trong README của chúng tôi để có cái nhìn so sánh toàn diện về tất cả các model.

YOLOv5 Models

  • Bắt đầu từ weights đã huấn luyện trước (Pretrained weights). Được khuyến nghị cho các tập dữ liệu từ nhỏ đến trung bình (ví dụ: VOC, VisDrone, GlobalWheat). Truyền tên model vào đối số --weights. Các model tự động tải xuống từ phản hồi 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). Được khuyến nghị cho các tập dữ liệu lớn (ví dụ: COCO, Objects365, OIv6). Truyền cấu trúc YAML của model mà bạn quan tâm, đi kèm với đố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

Cài đặt 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 cài đặt mặc định để thiết lập đường cơ sở hiệu năng. Danh sách đầy đủ các cài đặt train.py có thể được tìm thấy trong argparser train.py.

  • Epochs. Bắt đầu với 300 epoch. Nếu hiện tượng overfit xảy ra sớm, bạn có thể giảm số epoch. Nếu hiện tượng overfitting không xảy ra sau 300 epoch, hãy huấn luyện lâu hơn, ví dụ: 600, 1200 epoch v.v.
  • Kích thước ảnh. COCO huấn luyện ở độ phân giải gốc là --img 640, mặc dù do số lượng đối tượng nhỏ lớn trong tập dữ liệu, nó có thể hưởng lợi từ việc huấn luyện ở các độ phân giải cao hơn như --img 1280. Nếu có nhiều đối tượng nhỏ, các tập dữ liệu tùy chỉnh sẽ có lợi khi huấn luyện ở độ phân giải gốc hoặc cao hơn. Kết quả inference tốt nhất thu được ở cùng một --img như khi chạy huấn luyện, tức là nếu bạn huấn luyện ở --img 1280, bạn cũng nên kiểm tra và detect ở --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. Batch size nhỏ tạo ra 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.
  • Learning rate. Lịch trình learning rate 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 để bật lập lịch learning rate theo hàm cosin (cosine), tính năng này sẽ giảm dần learning rate theo đường cong cosin qua các epoch.
  • Data augmentation. YOLOv5 bao gồm nhiều kỹ thuật augmentation khác nhau như mosaic, kết hợp nhiều ảnh huấn luyện. Điều chỉnh cường độ augmentation thông qua siêu tham số mosaic trong file --hyp của bạn để 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 bạn nê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ỳ điều gì. Nhìn chung, việc tăng các siêu tham số augmentation sẽ làm giảm và trì hoãn hiện tượng overfitting, 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 loss như hyp['obj'] sẽ giúp giảm overfitting trong các thành phần loss cụ thể đó. Để có phương pháp tự động tối ưu hóa các siêu tham số này, hãy xem Hướng dẫn Tiến hóa Siêu tham số (Hyperparameter Evolution Tutorial).
  • Huấn luyện Mixed precision. YOLOv5 tự động bật Automatic Mixed Precision (AMP) khi phát hiện thấy GPU được hỗ trợ, giúp 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 nhiều GPU (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 các GPU đó, điều này có thể làm 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 metric xác thực không cải thiện trong 50 epoch, giúp tiết kiệm thời gian và ngăn ngừa overfitting.

Các kỹ thuật tối ưu hóa nâng cao#

  • Transfer learning. Đối với các tập dữ liệu chuyên biệt, hãy bắt đầu với weights đã huấn luyện trước và dần dần bỏ đóng băng (unfreeze) các tầng trong quá trình huấn luyện để thích ứng model với tác vụ cụ thể của bạn.
  • 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 weights dự phòng và giảm kích thước model mà không làm giảm đáng kể hiệu năng.
  • 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.
  • Test-time augmentation. Bật TTA trong quá trình inference 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 được augmentation của ảnh đầu vào.

Đọc thêm#

Nếu bạn muốn tìm hiểu thêm, một điểm khởi đầu tốt là 'Recipe for Training Neural Networks' của Karpathy, chứa những ý tưởng tuyệt vời về 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ài đặt và cấu hình huấn luyện, hãy tham khảo tài liệu cài đặt train của Ultralytics, cung cấp 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#

  • Model của bạn có thể đang bị overfitting nếu loss huấn luyện tiếp tục giảm trong khi loss xác thực bắt đầu tăng. Hãy theo dõi mAP xác thực - nếu nó đi ngang hoặc giảm trong khi loss huấn luyện vẫn cải thiện, đó là dấu hiệu của overfitting. Các giải pháp bao gồm thêm 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 phụ thuộc vào bộ nhớ GPU của bạn. Các batch size lớn hơn nhìn chung cung cấp thống kê batch normalization tốt hơn và độ ổn định huấn luyện cao hơ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ị tràn 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.

  • Để tăng tốc độ huấn luyện, hãy thử: sử dụng nhiều GPU với --device 0,1,2,3, lưu đệm (cache) tập dữ liệu của bạn với --cache, và tối ưu hóa batch size của bạn (mixed precision được bật tự động trên các GPU được hỗ trợ). Cũng nên 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.

Những người đóng góp

Bình luận