Ultralytics YOLO27:
Get Started

Kết hợp model YOLOv5#

📚 Hướng dẫn này giải thích cách sử dụng kết hợp model Ultralytics YOLOv5 🚀 trong quá trình kiểm thử và suy luận để cải thiện mAP và Recall.

Từ học tập hợp:

Mô hình tập hợp là quy trình tạo nhiều model đa dạng để dự đoán một kết quả, bằng cách sử dụng nhiều thuật toán mô hình hóa khác nhau hoặc các bộ dữ liệu huấn luyện khác nhau. Sau đó, model tập hợp tổng hợp dự đoán của từng model cơ sở để đưa ra một dự đoán cuối cùng cho dữ liệu chưa từng thấy. Mục đích sử dụng model tập hợp là giảm sai số khái quát hóa của dự đoán. Khi các model cơ sở đa dạng và độc lập, sai số dự đoán của model sẽ giảm khi áp dụng phương pháp tập hợp. Phương pháp này tận dụng trí tuệ tập thể để đưa ra dự đoán. Dù model tập hợp chứa nhiều model cơ sở, nó vẫn hoạt động và thể hiện như một model duy nhất.

Trước khi bắt đầu#

Clone repository và cài đặt requirements.txt trong môi trường Python>=3.8.0, bao gồm PyTorch>=1.8. Model và dataset được tự động 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 # install

Kiểm thử thông thường#

Trước khi kết hợp model, hãy xác lập hiệu suất cơ sở của một model đơn. Lệnh này kiểm thử YOLOv5x trên COCO val2017 với kích thước ảnh 640 pixel. yolov5x.pt là model lớn nhất và chính xác nhất hiện có. Các lựa chọn khác gồm yolov5n.pt, yolov5s.pt, yolov5m.pt và yolov5l.pt, hoặc checkpoint của riêng bạn được tạo khi huấn luyện trên tập dữ liệu tùy chỉnh, chẳng hạn runs/train/exp/weights/best.pt. Để biết chi tiết về tất cả model hiện có, hãy xem bảng checkpoint pretrained.

python val.py --weights yolov5x.pt --data coco.yaml --img 640 --half

Đầu ra:

val: data=./data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients

val: Scanning '../datasets/coco/val2017' images and labels...4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:01<00:00, 2846.03it/s]
val: New cache created: ../datasets/coco/val2017.cache
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [02:30<00:00,  1.05it/s]
                 all       5000      36335      0.746      0.626       0.68       0.49
Speed: 0.1ms pre-process, 22.4ms inference, 1.4ms NMS per image at shape (32, 3, 640, 640)  # <--- baseline speed

Evaluating pycocotools mAP... saving runs/val/exp/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.504  # <--- baseline mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.688
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.546
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.351
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.551
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.644
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.382
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.628
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.681  # <--- baseline mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.524
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.735
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.826

Kiểm thử kết hợp model#

Có thể kết hợp nhiều model pretrained trong quá trình kiểm thử và suy luận bằng cách thêm các model vào tham số --weights trong bất kỳ lệnh val.py hoặc detect.py hiện có nào. Ví dụ này kiểm thử kết hợp 2 model:

  • YOLOv5x
  • YOLOv5l6
python val.py --weights yolov5x.pt yolov5l6.pt --data coco.yaml --img 640 --half

Bạn có thể liệt kê bao nhiêu checkpoint tùy ý, bao gồm cả các trọng số tùy chỉnh như runs/train/exp5/weights/best.pt. YOLOv5 sẽ tự động chạy từng model, rồi nối các dự đoán theo từng ảnh trước khi thực hiện NMS.

Đầu ra:

val: data=./data/coco.yaml, weights=['yolov5x.pt', 'yolov5l6.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, task=val, device=, single_cls=False, augment=False, verbose=False, save_txt=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=True
YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients  # Model 1
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients  # Model 2
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']  # Ensemble notice

val: Scanning '../datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupted: 100% 5000/5000 [00:00<00:00, 49695545.02it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [03:58<00:00,  1.52s/it]
                 all       5000      36335      0.747      0.637      0.692      0.502
Speed: 0.1ms pre-process, 39.5ms inference, 2.0ms NMS per image at shape (32, 3, 640, 640)  # <--- ensemble speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.515  # <--- ensemble mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.699
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.557
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.356
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.563
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.668
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.387
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.638
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.689  # <--- ensemble mAR
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.526
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.743
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.844

Suy luận kết hợp model#

Thêm các model vào tham số --weights để chạy suy luận kết hợp:

python detect.py --weights yolov5x.pt yolov5l6.pt --img 640 --source data/images

Đầu ra:

YOLOv5 🚀 v5.0-267-g6a3ee7c torch 1.9.0+cu102 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)

Fusing layers...
Model Summary: 476 layers, 87730285 parameters, 0 gradients
Fusing layers...
Model Summary: 501 layers, 77218620 parameters, 0 gradients
Ensemble created with ['yolov5x.pt', 'yolov5l6.pt']

image 1/2 /content/yolov5/data/images/bus.jpg: 640x512 4 persons, 1 bus, 1 tie, Done. (0.063s)
image 2/2 /content/yolov5/data/images/zidane.jpg: 384x640 3 persons, 2 ties, Done. (0.056s)
Results saved to runs/detect/exp2
Done. (0.223s)
YOLO inference result

Lợi ích của việc kết hợp model#

Kết hợp model với YOLOv5 mang lại một số lợi ích:

  1. Độ chính xác cao hơn: Như minh họa trong các ví dụ trên, kết hợp nhiều model giúp tăng mAP từ 0.504 lên 0.515 và mAR từ 0.681 lên 0.689.
  2. Khả năng khái quát hóa tốt hơn: Kết hợp các model đa dạng giúp giảm overfitting và cải thiện hiệu suất trên dữ liệu đa dạng.
  3. Độ bền vững cao hơn: Các model tập hợp thường có khả năng chống chịu tốt hơn trước nhiễu và giá trị ngoại lai trong dữ liệu.
  4. Thế mạnh bổ trợ lẫn nhau: Các model khác nhau có thể vượt trội trong việc phát hiện những loại đối tượng khác nhau hoặc trong các điều kiện môi trường khác nhau.

Đánh đổi chính là thời gian suy luận tăng lên, như thể hiện trong các chỉ số tốc độ (22.4ms với model đơn so với 39.5ms với model tập hợp).

Khi nào nên kết hợp model#

Hãy cân nhắc kết hợp model trong các trường hợp sau:

  • Khi độ chính xác quan trọng hơn tốc độ suy luận
  • Với các ứng dụng trọng yếu cần giảm thiểu false negative
  • Khi xử lý ảnh khó với điều kiện ánh sáng, che khuất hoặc tỷ lệ kích thước đa dạng
  • Trong các cuộc thi hoặc hoạt động benchmark đòi hỏi hiệu suất tối đa

Với ứng dụng thời gian thực có yêu cầu nghiêm ngặt về độ trễ, suy luận bằng model đơn có thể phù hợp hơn.

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 bắt đầu dự án nhanh chóng.

Trạng thái dự án#

YOLOv5 CI

Huy hiệu này cho biết tất cả bài kiểm thử Continuous Integration (CI) của GitHub Actions cho YOLOv5 đều đã chạy 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 chính: huấn luyện, validation, inference, export và benchmark. Các bài kiểm thử đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu; chúng được thực hiện mỗi 24 giờ và sau mỗi commit mới.

Câu hỏi thường gặp#

  • Không giới hạn số lượng. Liệt kê từng checkpoint sau --weights, ví dụ --weights yolov5x.pt yolov5l6.pt runs/train/exp/weights/best.pt. Thời gian suy luận tăng gần tương ứng với số lượng model.

  • Có. Dự đoán được nối trước khi thực hiện NMS, vì vậy mọi model phải được huấn luyện trên cùng một danh sách class theo cùng thứ tự. Kích thước đầu vào và kiến trúc có thể khác nhau.

  • Có. Thêm --augment vào cùng lệnh val.py hoặc detect.py để áp dụng TTA cho mọi model trong ensemble.

  • Việc kết hợp model được xử lý bởi module Ensemble của PyTorch trong models/experimental.py, vì vậy chỉ áp dụng cho các checkpoint .pt. Hãy export riêng từng model nếu bạn cần file ONNX hoặc TensorRT.

Bình luận