Bỏ qua nội dung

Mô hình cắt tỉa và thưa thớt trong YOLOv5

📚 Hướng dẫn này giải thích cách áp dụng cắt tỉa cho YOLOv5 🚀 các mô hình giúp tạo ra mạng lưới hiệu quả hơn trong khi vẫn duy trì hiệu suất.

Cắt tỉa mô hình là gì?

Cắt tỉa mô hình là một kỹ thuật được sử dụng để giảm kích thước và độ phức tạp của mạng nơ-ron bằng cách loại bỏ các 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 mô hình hiệu quả hơn với một số lợi ích:

  • Giảm kích thước mô hình để triển khai dễ dàng hơn trên các thiết bị có nguồn lực hạn chế
  • Tốc độ suy luận nhanh hơn với tác động tối thiểu đến độ chính xác
  • Giảm thiểu sử dụng bộ nhớ và tiêu thụ năng lượng
  • Cải thiện hiệu quả tổng thể cho các ứng dụng thời gian thực

Việc 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 tối thiểu vào hiệu suất của mô hình, tạo ra một mô hình nhẹ hơn với độ chính xác tương tự.

Trước khi bạn bắt đầu

Sao chép kho lưu trữ và cài đặt requirements.txt trong môi trường Python >=3.8.0 , bao gồm PyTorch >=1.8 . Các mô hìnhtập dữ liệu tự động tải xuống từ phiên bản mới nhất YOLOv5 giải phóng .

git clone https://github.com/ultralytics/yolov5 # clone
cd yolov5
pip install -r requirements.txt # install

Kiểm tra hiệu suất cơ sở

Trước khi cắt tỉa, hãy thiết lập hiệu suất cơ sở để so sánh. Lệnh này kiểm tra YOLOv5x trên COCO val2017 ở kích thước hình ảnh 640 pixel. yolov5x.pt là mô hình 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.pthoặc điểm kiểm tra của riêng bạn từ việc đào tạo một tập dữ liệu tùy chỉnh ./weights/best.pt. Để biết chi tiết về tất cả các mẫu có sẵn, hãy xem README bàn.

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_hybrid=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/exp

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

Chúng ta có thể áp dụng cắt tỉa cho mô hình bằng cách sử dụng torch_utils.prune() lệnh. Để kiểm tra một mô hình đã cắt tỉa, chúng tôi cập nhật val.py để cắt tỉa YOLOv5x thành độ thưa thớt 0,3 (30% trọng số được đặt thành 0):

Ảnh chụp màn hình hiển thị mã để cắt tỉa YOLOv5x xuống mức thưa thớt 30%

30% sản lượng được cắt tỉa:

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_hybrid=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ừ kết quả, chúng ta có thể quan sát:

  • Đạt được độ thưa thớt 30%: 30% các tham số trọng số của mô hình trong nn.Conv2d các lớp bây giờ là số không
  • Thời gian suy luận vẫn không thay đổi : Mặc dù đã cắt tỉa, tốc độ xử lý về cơ bản vẫn như vậy
  • Tác động tối thiểu đến hiệu suất : mAP giảm nhẹ từ 0,507 xuống 0,489 (chỉ giảm 3,6%)
  • Giảm kích thước mô hình : Mô hình được cắt tỉa cần ít bộ nhớ hơn để lưu trữ

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

Tinh chỉnh các mô hình đã cắt tỉa

Để có kết quả tốt nhất, các mô hình đã cắt tỉa nên được tinh chỉnh sau khi cắt tỉa để phục hồi độ chính xác. Điều này có thể được thực hiện bằng cách:

  1. Áp dụng cắt tỉa với mức độ thưa thớt mong muốn
  2. Đào tạo mô hình đã cắt tỉa trong một vài thời kỳ với tốc độ học thấp hơn
  3. Đánh giá mô hình cắt tỉa tinh chỉnh so với mô hình cơ sở

Quá trình này giúp các tham số còn lại thích ứng để bù đắp cho các kết nối bị loại bỏ, thường khôi phục hầu hết 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 đều được cài đặt sẵn các thành phần phụ thuộc cần thiết như CUDA , CUDNN , PythonPyTorch để khởi động dự án của bạn.

Tình trạng dự án

YOLOv5 CI

Huy hiệu này cho biết tất cả các thử nghiệm Tích hợp liên tục (CI) YOLOv5 GitHub Actions đều vượt qua thành công. Các thử nghiệm CI này kiểm tra nghiêm ngặt chức năng và hiệu suất của YOLOv5 trên nhiều khía cạnh chính: đào tạo , xác thực , suy luận , xuấtchuẩn . 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 tra được tiến hành sau mỗi 24 giờ và sau mỗi lần cam kết mới.

📅 Được tạo ra cách đây 1 năm ✏️ Đã cập nhật cách đây 8 ngày

Bình luận