YOLO Vision 2026:

Cắt tỉa Model và Độ thưa trong YOLOv5#

📚 Hướng dẫn này giải thích cách áp dụng cắt tỉa cho các model YOLOv5 🚀 để tạo ra các mạng hiệu quả hơn mà vẫn duy trì hiệu năng.

Cắt tỉa Model là gì?#

Cắt tỉa model là một kỹ thuật được sử dụng để giảm kích thước và độ phức tạp của các mạng neural bằng cách loại bỏ những tham số ít quan trọng hơn (trọng số và kết nối). Quá trình này tạo ra một model hiệu quả hơn với một số lợi ích:

  • Giảm kích thước model để dễ triển khai hơn trên các thiết bị có tài nguyên hạn chế
  • Tốc độ inference nhanh hơn với tác động tối thiểu đến độ chính xác
  • Giảm mức sử dụng bộ nhớ và mức tiêu thụ năng lượng
  • Cải thiện hiệu quả tổng thể cho các ứng dụng real-time

Cắt tỉa hoạt động bằng cách xác định và loại bỏ các tham số đóng góp rất ít vào hiệu năng của model, từ đó tạo ra một model nhẹ hơn với độ chính xác tương đương.

Trướ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. Modeldataset sẽ tự động được 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 tra Hiệu năng Baseline#

Trước khi cắt tỉa, hãy thiết lập hiệu năng baseline để so sánh. Lệnh này kiểm tra 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 tùy chọn khác là yolov5s.pt, yolov5m.ptyolov5l.pt, hoặc checkpoint của riêng bạn từ quá trình train trên một dataset tùy chỉnh ./weights/best.pt. Để biết chi tiết về tất cả các model hiện có, hãy xem bảng trong README.

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

Đầu ra:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, 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, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:12<00:00,  2.16it/s]
                 all       5000      36335      0.732      0.628      0.683      0.496
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- base speed

Evaluating pycocotools mAP... saving runs/val/exp2/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.507  # <--- base mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.689
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.552
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.345
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.559
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.652
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.381
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.630
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.682
 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.731
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.829
Results saved to runs/val/exp2

Áp dụng Cắt tỉa cho YOLOv5x (Độ thưa 30%)#

Chúng ta có thể áp dụng cắt tỉa cho model bằng lệnh torch_utils.prune() được định nghĩa trong utils/torch_utils.py. Để kiểm tra model đã cắt tỉa, chúng ta cập nhật val.py để cắt tỉa YOLOv5x đến độ thưa 0.3 (30% trọng số được đặt thành 0):

YOLOv5 model pruning to 30% sparsity code

Đầu ra sau khi cắt tỉa 30%:

val: data=/content/yolov5/data/coco.yaml, weights=['yolov5x.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.65, task=val, device=, workers=8, 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, dnn=False
YOLOv5 🚀 v6.0-224-g4c40933 torch 1.10.0+cu111 CUDA:0 (Tesla V100-SXM2-16GB, 16160MiB)

Fusing layers...
Model Summary: 444 layers, 86705005 parameters, 0 gradients
Pruning model...  0.3 global sparsity
val: Scanning '/content/datasets/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100% 5000/5000 [00:00<?, ?it/s]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100% 157/157 [01:11<00:00,  2.19it/s]
                 all       5000      36335      0.724      0.614      0.671      0.478
Speed: 0.1ms pre-process, 5.2ms inference, 1.7ms NMS per image at shape (32, 3, 640, 640)  # <--- prune speed

Evaluating pycocotools mAP... saving runs/val/exp3/yolov5x_predictions.json...
...
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.489  # <--- prune mAP
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.677
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.537
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.334
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.542
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.635
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.370
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.612
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.664
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.496
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.722
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.803
Results saved to runs/val/exp3

Phân tích Kết quả#

Từ các kết quả, chúng ta có thể nhận thấy:

  • Đạt độ thưa 30%: 30% tham số trọng số của model trong các layer nn.Conv2d hiện bằng 0
  • Thời gian inference không đổi: Mặc dù đã cắt tỉa, tốc độ xử lý về cơ bản vẫn giữ nguyên
  • Tác động tối thiểu đến hiệu năng: mAP giảm nhẹ từ 0.507 xuống 0.489 (chỉ giảm 3.6%)
  • Giảm kích thước model: Model đã cắt tỉa cần ít bộ nhớ hơn để lưu trữ

Điều này cho thấy cắt tỉa có thể giảm đáng kể độ phức tạp của model với chỉ tác động nhỏ đến hiệu năng, khiến đây trở thành một kỹ thuật tối ưu hóa hiệu quả để triển khai trong các môi trường có tài nguyên hạn chế.

Fine-tune các Model đã Cắt tỉa#

Để đạt kết quả tốt nhất, các model đã cắt tỉa nên được fine-tune sau khi cắt tỉa để khôi phục độ chính xác. Có thể thực hiện việc này bằng cách:

  1. Áp dụng cắt tỉa với mức độ thưa mong muốn
  2. Train model đã cắt tỉa trong một vài epoch với learning rate thấp hơn
  3. Đánh giá model đã cắt tỉa và fine-tune bằng cách so sánh với baseline

Quá trình này giúp các tham số còn lại thích nghi để bù đắp cho những kết nối đã bị loại bỏ, thường khôi phục được phần lớn hoặc toàn bộ độ chính xác ban đầu.

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, PythonPyTorch, giúp bạn nhanh chóng bắt đầu các project.

Trạng thái dự án#

YOLOv5 CI

Huy hiệu này cho biết tất cả các bài kiểm thử GitHub Actions của YOLOv5 về Tích hợp liên tục (CI) đều đã vượt qua 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 quan trọng: huấn luyện, validation, suy luận, exportbenchmark. Chúng đảm bảo hoạt động nhất quán và đáng tin cậy trên macOS, Windows và Ubuntu, với các bài kiểm thử được thực hiện mỗi 24 giờ và sau mỗi commit mới.

Bình luận