← kwjin.dev
프로젝트 · rect-input

비정사각(16:9) 입력으로 포즈 검출기 CPU 연산 40% 절감

2026.09 · 재검토 2026.10 웹캠용 경량 얼굴 · 사람 포즈 검출기

웹캠 영상은 16:9인데 검출기는 640×640 정사각으로 레터박스해서 추론하고 있었습니다. 위아래 여백까지 계산하는 셈이라, YOLO11n 기반 얼굴 · 사람 포즈 모델을 640×384 직사각 입력으로 다시 학습했습니다. 연산량과 CPU 지연이 약 40% 줄었고, 정확도 손실은 AP50 0.01 미만이었습니다.

기간
2026.09.28 ~ 09.30, 사후 재검토 10.03
모델
YOLO11n 기반 포즈 모델 — 얼굴 · 사람 박스와 키포인트
측정 환경
배포 환경과 같은 CPU · OpenVINO INT8 (1 · 4 · 16코어)
기술
Ultralytics · PyTorch · OpenVINO (NNCF) · 커스텀 트레이너
연산량 −40% 6.79 → 4.07 GFLOPs
CPU 지연 (INT8 · 1코어) −40.4% 92.2 → 54.9 ms · 4 · 16코어도 약 −40%
정확도 대가 AP50 −0.0065 얼굴 기준 · 사람은 −0.002 이내
배경

정사각 입력이 계산하던 빈 여백

1280×720 웹캠 프레임을 가로 640에 맞추면 그림은 640×360입니다. 정사각 640×640에 넣으면 위아래 280줄이 레터박스 여백이고, 검출기는 그 여백까지 합성곱을 돌립니다.

여백 여백 640×640 정사각 여백 280줄
이전 · 640×64016:9 그림(640×360) 위아래에 레터박스 여백이 붙습니다.
640×384 직사각 여백 24줄
이후 · 640×384같은 그림에 여백은 24줄만 남고, 입력 화소가 40% 줄어듭니다.
작업

학습 파이프라인 수정 → 측정 → 사후 재검토

01 — 비정사각 학습을 직접 붙였습니다

문제

Ultralytics는 학습 입력 크기를 한 값(정사각)으로만 받고, 직사각 배치(rect)는 멀티 GPU 학습에서 꺼집니다. 학습은 정사각, 추론만 직사각으로 하면 학습과 추론의 입력 분포가 어긋납니다.

접근

증강 캔버스의 높이를 에폭마다 바꿔 직사각 입력으로 학습하는 커스텀 트레이너를 작성했습니다.

02 — 증강 단계에서 라벨이 사라지던 문제

문제

학습 후반 모자이크 증강이 꺼진 구간에서 원본 이미지가 잘려, 잘린 쪽의 박스와 키포인트가 사라지는 현상을 찾았습니다.

접근

아핀 변환 앞에서 레터박스를 먼저 맞추도록 순서를 바꿔, 그림이 캔버스 밖으로 잘리지 않게 했습니다.

03 — GPU가 아니라 배포 환경(CPU)으로 판단

관찰

GPU에서 배치 1로 재면 해상도를 줄여도 지연이 거의 같았습니다. 지연의 77.6%가 커널 디스패치 오버헤드라 입력 크기가 지연에 드러나지 않았습니다.

결정

실제 배포 환경인 CPU · OpenVINO INT8에서 1 · 4 · 16코어로 측정해 판단했습니다.

640×640 정사각 640×384 직사각

CPU 지연은 OpenVINO INT8 · 1코어 기준입니다. 4코어 · 16코어에서도 감소폭은 약 40%로 비슷했습니다.

04 — 결과와 사후 재검토 2026.10.03

  • 정확도 — 같은 조건의 정사각 모델 대비 얼굴 AP50 −0.0065, 사람 AP50 −0.002 이내. 다만 16px 미만의 아주 작은 얼굴은 손실이 더 컸습니다.
  • 재검토 — 결과를 정리한 뒤 다시 검토하다가 커스텀 트레이너의 증강 버그를 스스로 찾아, 처음 보고한 정확도 대가를 바로잡았습니다.
화면

증강 샘플

공개 이미지로 새로 만들어 넣을 자리입니다.

그림 레터박스 교정 전후 증강 샘플 — 잘려서 사라지던 박스 · 키포인트가 남는 모습. 공개 이미지로 제작 예정 aug-before-after.webp
메인으로 돌아가기
영상보안 솔루션 촬영기기 탐지 집중 스프린트 — 탐지 모델 라인 총점검 X-ray 위해물품 탐지 카지노 영상분석 MATE — 데이터 엔진 워크벤치 Center — AI 코딩 에이전트 지휘 보드