- 주제: Face Mask 착용 여부를 분류하는 Binary classification Task
- 데이터셋
- Kaggle Dataset 사용(https://www.kaggle.com/datasets/vijaykumar1799/face-mask-detection)
- with_mask: 1,620장, 128x128, RGB
- without_mask: 1,656장, 128x128, RGB
- 사용 입출력 장치: 카메라
- Base 모델
- 학습 코드
- 테스트 코드
젯슨 나노에서 모델을 inference 해 실시간 추론을 시행
infer_webcam 함수
- 노트북 상에서 inference한 모델을 웹캠을 사용해 test 하는 코드
- 추론 시간(실행 시간)을 측정
- cv2의
cascade classifier를 사용해 얼굴을 먼저 detect한 후, 마스크 착용 여부를 구별
infer_csi_camera 함수
- Jetson-Nano의 CSI 카메라를 사용해 실시간으로 추론하는 함수
- 추론 시간(실행 시간)을 측정
GStreamer사용- cv2의
cascade classifier를 사용해 얼굴을 먼저 detect한 후, 마스크 착용 여부를 구별
count_parameters 함수
- 파라미터 개수를 count
- zero 파라미터와 non-zero 파라미터를 구분
calculate_flops 함수
from thop import profile사용- profile로 구한 것은 MACs 이기 때문에, FLOPs 구하기 위해 macs *2 계산
get_model_size 함수
- 모델 사이즈를 계산
Student 모델의 설계 간소화
SmallMaskClassifier 모델의 설계 간소화:
- 합성곱 계층의 필터 수를 대폭 감소
- Teacher 모델: 32→64→128 채널
- Small 모델: 8→16→32 채널 (약 75% 감소된 채널 수)
- Dropout 층 제거로 구조 단순화
- Teacher 모델: Dropout(0.2) 사용
- Small 모델: Dropout 층 완전히 제거
- 구조를 크게 간소화하여 파라미터 수 93% 이상 감소
- Teacher 모델: 93,954개 파라미터
- Small 모델: 6,210개 파라미터
MediumMaskClassifier 모델 설계 간소화:
- 합성곱 계층의 필터 수를 중간 정도로 감소
- Teacher 모델: 32→64→128 채널
- Medium 모델: 24→48→96 채널 (약 25% 감소된 채널 수)
- Dropout 비율 조정
- Teacher 모델: 0.2
- Medium 모델: 0.1 (더 적은 정규화)
- 구조는 Teacher와 동일하게 유지하면서 파라미터 수만 약 43% 감소
- Teacher 모델: 93,954개 파라미터
- Medium 모델: 53,186개 파라미터
Knowledge Distillation 적용:
- Teacher 모델에서 얻은 소프트 라벨(출력)을 Student 모델에 전달하여 학습 성능을 유지.
- Knowledge Distillation을 통해 Student 모델이 Teacher 모델의 지식을 효율적으로 압축 및 학습하도록 설계.
- Student Model 학습 코드
- 경량화 전 후의 파라미터 비교
apply_pruning 함수:
torch_pruning사용MagnitudePruner를 사용하여 채널의 중요도가 낮은 순서대로 제거- 마지막 분류 층(classifier)은 프루닝에서 제외
- 30%, 50%, 70% 로 Pruning Ratio를 다르게 해 경량화
- 경량화 전 후의 파라미터 비교
- 잿슨나노의 CSI 카메라 사용 시의 추론 시간 비교
- 파라미터 수 비교
- 모델 사이즈 비교
- FLOPs 비교
- 추론 시간 비교(100회 추론 비교)
💡
Knowledge Distillation을 통해 Student 모델들의 크기를 대폭 줄이면서(Small: 93.4%, Medium: 43.4% 감소) 성능은 유지했습니다. Small Student 모델의 경우 파라미터 수가 6,210개로 크게 감소했고, 추론 시간도 Teacher 모델(72.48ms)에 비해 상당히 개선되어 20.76ms로 단축되었습니다.
실제 젯슨나노 CSI 카메라를 사용해 테스트 했을 때, Base 모델의 대부분의 파라미터를 감소시킨 Small Student Model에서 without mask를 classification하는데 성능이 약간 떨어짐을 볼 수 있었습니다.
- 잿슨나노의 CSI 카메라 사용 시의 추론 시간 비교
- 파라미터 수 비교
- 모델 사이즈 비교
- FLOPs 비교
- 추론 시간 비교(100회 평균)
💡
채널 프루닝을 적용한 결과, 원본 모델(93,954 파라미터, 0.36MB)에 비해 30% 프루닝 시 45,195 파라미터(0.17MB)로 감소하고 추론 속도는 25.71ms에서 15.77ms로 개선되었습니다. 50% 프루닝의 경우 23,938 파라미터(0.09MB)로 줄었으며 추론 시간은 12.19ms로 단축되었고, 70% 프루닝에서는 8,556 파라미터(0.03MB)와 8.98ms의 추론 시간을 달성했습니다. FPS도 원본 모델의 5.1에서 각각 5.5(30%), 6.5(50%), 6.8(70%)로 점진적으로 향상되었습니다.
실제 젯슨나노 CSI 카메라를 사용해 테스트 했을 때, 70%, 50% 비율로 Pruning시킨 모델의 성능은 Base Model과 비슷하였으나, 30% 비율로 Pruning시킨 모델의 성능은 약간 떨어졌으나, 대부분 classification에 성공하였음을 볼 수 있었습니다.
- training.ipynb: Base Model 학습 코드
- training_distillation_total.ipynb: Distillation(Small Student, Medium Student) Model 학습 코드
- training_prune_total.ipynb: Pruning(30%, 50%, 70%) Model 학습 코드
- inference_distillation_total.ipynb: 학습된 Distillation Model을 inference하는 코드
- inference_prune_total.ipynb: 학습된 Pruning Model을 inference하는 코드