Mẹo để đạt kết quả tốt nhất khi huấn luyện YOLOv5#
📚 Hướng dẫn này giải thích cách đạt mAP và kết quả huấn luyện tốt nhất với YOLOv5 🚀.
Trong hầu hết trường hợp, bạn có thể đạt được kết quả tốt mà không cần thay đổi model hoặc các thiết lập huấn luyện, miễn là dataset của bạn đủ lớn và được gắn nhãn tốt. Nếu ban đầu chưa đạt kết quả tốt, bạn có thể thực hiện một số bước để cải thiện, nhưng chúng tôi luôn khuyến nghị người dùng trước tiên huấn luyện với tất cả thiết lập mặc định rồi mới cân nhắc thay đổi. Điều này giúp thiết lập baseline hiệu năng 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, chúng tôi khuyến nghị bạn cung cấp lượng thông tin tối đa có thể nếu mong 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, ma trận nhầm lẫn, các ảnh mosaic trong quá trình huấn luyện, kết quả kiểm thử và ảnh thống kê dataset như labels.png. Tất cả đều nằm trong thư mục project/name, thường là yolov5/runs/train/exp.
Dưới đây là hướng dẫn đầy đủ dành cho người dùng muốn đạt kết quả tốt nhất khi huấn luyện YOLOv5.
Dataset#
- Số lượng ảnh trên mỗi class. Khuyến nghị ≥ 1500 ảnh trên mỗi class
- Số lượng instance trên mỗi class. Khuyến nghị ≥ 10000 instance (đối tượng được gắn nhãn) trên mỗi class
- Đa dạng ả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 trong thực tế, chúng tôi khuyến nghị sử dụng ảnh được chụp vào các thời điểm khác nhau trong ngày, các mùa khác nhau, điều kiện thời tiết khác nhau, điều kiện ánh sáng khác nhau, từ các góc khác nhau và từ các nguồn khác nhau (thu thập trên mạng, thu thập cục bộ, các camera khác nhau), v.v.
- Tính nhất quán của nhãn. Tất cả instance thuộc mọi class trong mọi ảnh đều phải được gắn nhãn. Việc gắ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 sát từng đối tượng. Không được có khoảng trống giữa đối tượng và bounding box của đối tượng. Không được bỏ sót nhãn của bất kỳ đối tượng nào.
- Tính kỷ luật khi chia train/val. Đảm bảo ảnh validation và test không bao giờ xuất hiện trong training set để tránh các metric quá lạc quan. Duy trì phân phối class tương tự giữa các phần dữ liệu.
- Xác minh nhãn. Xem
train_batch*.jpgkhi bắt đầu train để xác minh nhãn hiển thị chính xác, tức là xem ảnh mosaic ví dụ. - Ảnh background. Ảnh background là những ảnh không chứa đối tượng, được thêm vào dataset để giảm False Positives (FP). Chúng tôi khuyến nghị khoảng 0-10% ảnh background để giúp giảm FP (COCO có 1000 ảnh background để tham khảo, chiếm 1% tổng số ảnh). Không cần nhãn cho ảnh background.
Lựa chọn model#
Các model lớn hơn như YOLOv5x và YOLOv5x6 sẽ cho kết quả tốt hơn trong gần như mọi trường hợp, nhưng có nhiều parameter hơn, yêu cầu nhiều bộ nhớ CUDA hơn để huấn luyện và chạy chậm hơn. Đối với triển khai mobile, chúng tôi khuyến nghị YOLOv5s/m; đối với triển khai cloud, chúng tôi khuyến nghị YOLOv5l/x. Xem bảng trong README để so sánh đầy đủ tất cả model.

-
Bắt đầu từ pretrained weights. Được khuyến nghị cho các dataset có kích thước nhỏ đến trung bình (ví dụ: VOC, VisDrone, GlobalWheat). Truyền tên model vào argument
--weights. Model sẽ tự động được 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. Được 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 argument
--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 kỳ đ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 baseline hiệu năng. Bạn có thể tìm thấy danh sách đầy đủ các thiết lập của train.py trong argparser của train.py.
- Epoch. Bắt đầu với 300 epoch. Nếu xảy ra overfitting sớm, bạn có thể giảm số epoch. Nếu không xảy ra overfitting sau 300 epoch, hãy huấn luyện lâu hơn, chẳng hạn 600, 1200, v.v. epoch.
- Kích thước ảnh. COCO được huấn luyện ở độ phân giải gốc
--img 640, tuy nhiên do dataset có nhiều đối tượng nhỏ 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ả inference tốt nhất đạt được khi sử dụng cùng--imgvới độ phân giải đã dùng khi huấn luyện, tức là nếu bạn huấn luyện ở--img 1280thì cũng nên kiểm thử và detect ở--img 1280. - Kích thước batch. Sử dụng
--batch-sizelớn nhất mà phần cứng của bạn hỗ trợ. Kích thước batch nhỏ tạo ra các thống kê batch normalization kém chính xác và nên tránh sử dụng. Bạn có thể dùng--batch-size -1để tự động chọn kích thước batch tối ưu cho GPU của mình. - Learning rate. Lịch learning rate mặc định hoạt động tốt trong hầu hết trường hợp. Để hội tụ nhanh hơn, bạn có thể thử sử dụng flag
--cos-lrnhằm bật lịch learning rate cosine, trong đó learning rate được giảm dần theo đường cong cosine qua các epoch. - Data augmentation. YOLOv5 tích hợp nhiều kỹ thuật augmentation như mosaic, kết hợp nhiều ảnh huấn luyện. Điều chỉnh cường độ augmentation thông qua hyperparameter
mosaictrong file--hypđể giúp ổn định quá trình huấn luyện. - Hyperparameter. Các hyperparameter mặc định nằm trong hyp.scratch-low.yaml. Chúng tôi khuyến nghị trước tiên huấn luyện với các hyperparameter mặc định trước khi cân nhắc sửa đổi. Nhìn chung, tăng các hyperparameter augmentation sẽ giảm và trì hoãn overfitting, cho phép huấn luyện lâu hơn và đạt mAP cuối cùng cao hơn. Giảm các hyperparameter gain của thành phần loss như
hyp['obj']sẽ giúp giảm overfitting trong các thành phần loss cụ thể đó. Để biết phương pháp tự động tối ưu hóa các hyperparameter này, hãy xem Hướng dẫn tiến hóa Hyperparameter. - Huấn luyện mixed precision. YOLOv5 tự động bật Automatic Mixed Precision (AMP) khi phát hiện 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 Multi-GPU. Nếu 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 đó, qua đó có thể giảm đáng kể thời gian huấn luyện. - Dừng sớm. Sử dụng
--patience 50để dừng huấn luyện nếu các metric validation không cải thiện trong 50 epoch, giúp tiết kiệm thời gian và ngăn overfitting.
Các 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 pretrained weights và dần unfreeze các layer trong quá trình huấn luyện để điều chỉnh model cho task cụ thể của bạn.
- Model pruning. Sau khi huấn luyện, hãy cân nhắc pruning model để loại bỏ các weight dư thừa 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 prediction của chúng để cải thiện độ chính xác.
- Test-time augmentation. Bật TTA trong quá trình inference bằng
--augmentđể cải thiện độ chính xác prediction bằng cách lấy trung bình các kết quả từ những phiên bản đã augmentation của ảnh đầu vào.
Đọc thêm#
Nếu 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, trong đó có nhiều ý tưởng huấn luyện áp dụng rộng rãi cho mọi lĩnh vực ML: https://karpathy.github.io/2019/04/25/recipe/
Để biết thông tin chi tiết hơn 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 thiết lập train của Ultralytics, trong đó giải thích toàn diện tất cả parameter hiện có.
Chúc bạn may mắn 🍀 và hãy cho chúng tôi biết nếu bạn có câu hỏi nào khác!
FAQ#
Model của bạn có thể đang bị overfitting nếu training loss tiếp tục giảm trong khi validation loss bắt đầu tăng. Hãy theo dõi mAP validation — nếu chỉ số này chững lại hoặc giảm trong khi training loss vẫn tiếp tục cải thiện, đó là dấu hiệu overfitting. Các giải pháp bao gồm bổ sung dữ liệu huấn luyện, tăng data augmentation hoặc triển khai các kỹ thuật regularization.
Batch size tối ưu phụ thuộc vào bộ nhớ GPU của bạn. Batch size lớn hơn thường cung cấp statistic batch normalization và độ ổn định huấn luyện tốt hơn. Hãy 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 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.Để tăng tốc huấn luyện, hãy thử: sử dụng nhiều GPU với
--device 0,1,2,3, cache dataset bằng--cachevà tối ưu batch size (mixed precision được tự động bật trên các GPU được hỗ trợ). Ngoài ra, 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 quá quan trọng.
