콘텐츠로 건너뛰기

YOLOv5의 모델 가지치기 및 희소성

📚 본 가이드에서는 성능을 유지하면서 보다 효율적인 네트워크를 만들기 위해 YOLOv5 🚀 모델에 가지치기를 적용하는 방법을 설명합니다.

모델 가지치기란 무엇입니까?

모델 가지치기는 중요도가 낮은 파라미터(가중치 및 연결)를 제거하여 신경망의 크기와 복잡성을 줄이는 데 사용되는 기술입니다. 이 프로세스는 다음과 같은 여러 이점을 통해 보다 효율적인 모델을 생성합니다.

  • 리소스가 제한된 장치에 더 쉽게 배포할 수 있도록 모델 크기 축소
  • 정확도에 미치는 영향은 최소화하면서 더 빠른 추론 속도
  • 더 낮은 메모리 사용량 및 에너지 소비
  • 실시간 애플리케이션을 위한 전반적인 효율성 향상

가지치기는 모델 성능에 미미한 영향을 미치는 파라미터를 식별하고 제거하여 유사한 정확도를 유지하면서 더 가벼운 모델을 만드는 방식으로 작동합니다.

시작하기 전에

requirements.txt를 복제하고 Python>=3.8.0 환경에 설치합니다. 여기에는 PyTorch>=1.8이 포함됩니다. 모델데이터 세트는 최신 YOLOv5 릴리스에서 자동으로 다운로드됩니다.

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

기준 성능 테스트

가지치기 전에 비교할 기준 성능을 설정하십시오. 이 명령은 이미지 크기 640 픽셀에서 COCO val2017에 대해 YOLOv5x를 테스트합니다. yolov5x.pt 은(는) 사용 가능한 모델 중 가장 크고 정확도가 높습니다. 다른 옵션으로는 yolov5s.pt, yolov5m.ptyolov5l.pt, 또는 사용자 정의 데이터 세트를 학습하여 얻은 자체 체크포인트 ./weights/best.pt입니다. 사용 가능한 모든 모델에 대한 자세한 내용은 README를 참조하십시오. 표를 참조하십시오..

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

출력:

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

YOLOv5x에 가지치기 적용 (30% 희소성)

다음과 같이 모델에 가지치기를 적용할 수 있습니다. torch_utils.prune() 명령어. 가지치기된 모델을 테스트하려면 다음을 업데이트합니다. val.py YOLOv5x를 0.3 희소성(가중치의 30%가 0으로 설정됨)으로 가지치기하려면:

YOLOv5x를 30% 희소성으로 가지치기하는 코드 스크린샷

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

결과 분석

결과에서 다음을 관찰할 수 있습니다.

  • 30% 의 희소성 도달: 모델 가중치 변수의 30% 가 nn.Conv2d 레이어가 이제 0입니다.
  • 추론 시간은 변경되지 않았습니다: 가지치기에도 불구하고 처리 속도는 기본적으로 동일합니다.
  • 최소한의 성능 영향: mAP가 0.507에서 0.489로 약간 감소했습니다(3.6% 감소).
  • 모델 크기 축소: 가지치기된 모델은 저장 공간을 위해 더 적은 메모리가 필요합니다.

이는 가지치기가 성능에 미치는 영향이 미미한 반면 모델 복잡성을 크게 줄일 수 있음을 보여주며, 리소스가 제한된 환경에 배포하기 위한 효과적인 최적화 기술입니다.

가지치기된 모델 미세 조정

최상의 결과를 얻으려면 가지치기 후 정확도를 복구하기 위해 미세 조정해야 합니다. 이는 다음을 통해 수행할 수 있습니다.

  1. 원하는 희소성 수준으로 가지치기 적용
  2. 가지치기된 모델을 더 낮은 학습률로 몇 번의 epoch 동안 훈련합니다.
  3. 미세 조정된 가지치기 모델을 기준선과 비교하여 평가합니다.

이 프로세스는 제거된 연결을 보상하기 위해 나머지 파라미터가 적응하도록 도와주며, 종종 원래 정확도의 대부분 또는 전부를 회복합니다.

지원되는 환경

Ultralytics는 CUDA, CUDNN, PythonPyTorch와 같은 필수 종속성이 미리 설치된 다양한 즉시 사용 가능한 환경을 제공하여 프로젝트를 시작할 수 있도록 합니다.

프로젝트 상태

YOLOv5 CI

이 배지는 모든 YOLOv5 GitHub Actions 지속적 통합(CI) 테스트가 성공적으로 통과되었음을 나타냅니다. 이러한 CI 테스트는 학습, 유효성 검사, 추론, 내보내기벤치마크와 같은 다양한 주요 측면에서 YOLOv5의 기능과 성능을 엄격하게 검사합니다. macOS, Windows 및 Ubuntu에서 일관되고 안정적인 작동을 보장하며, 테스트는 24시간마다 그리고 새로운 커밋마다 수행됩니다.



📅 1년 전에 생성됨 ✏️ 2개월 전에 업데이트됨

댓글