Pose Estimation으로 사람 탐지 오탐 해결하기
들어가며
"저기 사람이 있어요!" AI 비전 시스템이 자신 있게 보고했습니다. 하지만 화면 속에는 빈 의자와 그 위에 걸쳐진 코트뿐이었습니다.
AI의 사람 인식 기술은 놀랍도록 발전했지만, 화려한 데모 영상과 달리 실제 현장은 훨씬 더 혼란스럽습니다. 특히 우리가 주로 다루는 환경에서는 그 문제가 더 두드러졌습니다.
- 🏢 사무실: 빈 의자와 의자에 걸린 옷들
- 🔬 실험실: 실험복이나 가운이 걸린 공간
- 💼 근무 환경: 회의실, 휴게실 등 사람이 비어 있는 구역
이런 오탐(False Positive)은 단순히 “조금 틀린 결과”가 아니라, 시스템 전체의 신뢰도와 효율성에 직접적인 영향을 줍니다.
예를 들어, 에너지 절약 시스템은 잘못된 인원 수를 기준으로 조명과 냉난방을 제어하고, 보안 시스템은 ‘없는 사람’을 감시하느라 리소스를 낭비할 수도 있습니다.

예시. 빈 의자를 "앉아있는 사람"으로 오인한 사례
VLM 기반 비전 시스템이 직면하는 오탐 문제
Vision-Language Model(VLM)을 활용한 지능형 영상 분석 시스템에서 사람 탐지 오탐은 흔히 발생하는 문제입니다.
가장 대표적인 패턴은 다음과 같습니다:
패턴 1: 빈 의자를 사람으로 인식
- 객체 탐지 모델이 의자 등받이를 "사람의 상체"로 오인
- 학습 데이터에서 "의자에는 보통 사람이 앉아 있다"는 패턴을 과도하게 학습한 결과
- VLM까지 전달되어 "의자에 앉아 업무 중인 사람"으로 해석
패턴 2: 걸린 옷을 사람으로 인식
- 의자나 옷걸이에 걸린 두툼한 코트, 실험복 등을 사람으로 판단
- "사람은 옷을 입고 있다"는 데이터 편향을 학습한 영향
- VLM이 "코트를 입은 직원이 서 있음"과 같은 비현실적 분석 생성
패턴 3: 마네킹이나 포스터
- 외형만으로는 사람과 구분하기 어려운 시각적 유사성
- 평면적인 이미지나 정적인 모형을 실제 사람으로 오판
무언가 근본적인 해결책이 필요했습니다.
EVA는 이 문제를 해결하기 위해, 객체 탐지와 VLM 사이에 'Pose Estimation(자세 추정)' 검증 단계를 도입했습니다. 다음은 그 과정과 성과를 공유합니다.
탐지 과정: OD에서 VLM까지
먼저 전체 시스템 구조를 이해해 봅시다.
지능형 영상 분석 파이프라인
EVA의 AI 비전 솔루션은 크게 3단계로 구성됩니다:
[1단계: 객체 탐지 (Object Detection)]
이미지/영상 입력 → OmDet-Turbo → 객체 위치 + 클래스 검출
↓
[2단계: 결과 검증 및 필터링] ← 🎯 이 글의 주제!
탐지된 "사람" 객체들 → Pose Estimation 검증
↓
[3단계: 고수준 이해 (Vision-Language Model)]
검증된 탐지 결과 → VLM 분석 → 의미 이해 및 응답
↓
"2명의 고객이 상품을 살펴보고 있습니다"
왜 중간 필터링이 중요한가?
VLM은 강력하지만 비용이 높은 AI입니다.
대규모 언어 모델과 비전 모델을 결합한 VLM은 객체 탐지 모델보다 훨씬 많은 GPU 리소스를 소모하고, 처리 시간도 오래 걸립니다.
더 중요한 것은 정확도입니다. VLM이 아무리 뛰어나도, 잘못된 입력을 받으면 정확한 분석을 할 수 없습니다. 마치 고급 레스토랑의 셰프도 상한 재료로는 훌륭한 요리를 만들 수 없는 것처럼 말이죠.
따라서 VLM에 도달하기 전에 정확한 정보만 전달하는 것이 핵심입니다. 이를 위해 우리는 다음 두 가지 목표를 동시에 달성해야 했습니다:
| 목표 | 설명 |
|---|---|
| 정확도 향상 | 실제 사람이 아닌 객체를 사전에 필터링하여 VLM이 정확한 분석을 수행하도록 지원 |
| 효율성 증대 | 불필요한 VLM 호출을 줄여 GPU 리소스를 절약하고 처리 속도 개선 |
Pose Estimation은 이 두 목표를 동시에 달성할 수 있는 이상적인 솔루션입니다. 빠르고 가벼운 모델로 사전 검증을 수행하여, 비싼 VLM 리소스를 실제로 필요한 경우에만 사용합니다.
필터링이 없다면?
만약 마네킹을 "사람"으로 잘못 탐지한 채 VLM에 전달하면:
시나리오: 쇼핑몰 매장 모니터링
❌ 필터링 없는 파이프라인:
객체 탐지 결과: "사람 3명 탐지"
→ VLM 분석: "3명의 고객이 매장 내부를 둘러보고 있습니다"
→ 실제 상황: 손님 1명 + 마네킹 2개
→ 결과: 잘못된 고객 수 집계, 부정확한 운영 데이터
→ 비용: 불필요한 VLM 호출로 GPU 리소스 낭비
Pose Estimation 필터링 적용 후:
✅ 필터링 적용 파이프라인:
Pose 검증: "3개 객체 중 1개만 실제 사람의 관절 구조 확인"
→ VLM 전달: 검증된 1명의 정보만 전달
→ VLM 분석: "1명의 고객이 매장을 둘러보고 있습니다"
→ 결과: 정확한 고객 수, 신뢰할 수 있는 데이터
→ 효과: VLM 호출 감소, 정확도 향상
핵심: 빠르고 가벼운 Pose Estimation으로 사전 검증하여, 비싼 VLM 리소스를 실제로 필요한 경우에만 사용합니다.
Pose Estimation이란?
사람의 자세를 이해하는 기술
Pose Estimation(자세 추정)은 이미지나 영상 속 사람의 자세를 파악하는 AI 기술입니다. 마치 사람의 골격을 투시하듯이, 신체의 주요 관절 위치를 찾아냅니다.

사람 이미지 → AI 분석 → 키포인트 검출
├─ 코
├─ 양쪽 눈
├─ 양쪽 귀
├─ 양쪽 어깨
├─ 양쪽 팔꿈치
├─ 양쪽 손목
├─ 양쪽 엉덩이
├─ 양쪽 무릎
└─ 양쪽 발목
이렇게 검출된 17개의 키포인트(Keypoint)를 연결하면 사람의 현재 자세를 알 수 있습니다. 걷는 중인지, 서 있는지, 앉아있는지, 심지어 어떤 동작을 하고 있는지까지 파악할 수 있죠.
실제 사람과 오탐 객체의 차이
문제를 깊이 분석하면서 중요한 통찰을 얻었습니다. 실제 사람은 자연스러운 3차원 자세를 가지며, 명확한 관절 위치가 존재합니다. 반면 의자, 코트, 마네킹, 포스터는 사람처럼 보일 수는 있어도, 키포인트 검출이 제대로 되지 않습니다.
바로 여기에 해결의 실마리가 있었습니다!
키포인트로 구분하는 법
| 대상 | 외형 유사도 | 키포인트 검출 | 판별 결과 |
|---|---|---|---|
| ✅ 실제 사람 | 사람 모양 | 17개 관절 정확히 검출 | 진짜 사람 |
| ❌ 의자 | 어깨+등받이 유사 | 관절 없음 또는 2~3개만 불완전하게 검출 | 사람 아님 |
| ❌ 의자+옷 | 앉은 사람과 비슷 | 옷감 주름으로 일부 검출되나 관절 구조 부정확 | 사람 아님 |
| ❌ 실험복/코트 | 사람 형태 유사 | 옷감이라 관절 없음, 부정확한 검출 | 사람 아님 |
실제 검증 예시
의자 오탐 케이스를 예로 들어보겠습니다.
객체 탐지 모델은 의자 등받이를 "사람"으로 분류했지만, Pose Estimation으로 검증하면 이야기가 달라집니다. 어깨 위치는 불명확하고, 팔꿈치나 손목, 엉덩이 같은 주요 관절은 전혀 검출되지 않습니다. 결국 1~2개의 키포인트만 검출되는데, 이는 우리가 설정한 임계값인 4개에 한참 못 미칩니다. 따라서 "실제 사람 아님"으로 판정되어 VLM에 전달되지 않습니다.
코트 오탐도 비슷합니다. 의자에 걸린 코트는 앉은 사람처럼 보일 수 있지만, 자세히 검증하면 머리가 없고, 어깨는 옷걸이 형태로 부정확하며, 구부러진 소매에서 일부 키포인트가 검출되긴 하지만 하체는 전혀 검출되지 않습니다. 관절 구조가 부자연스럽고 신뢰도가 낮아 오탐으로 걸러집니다.
핵심은 이겁니다. 외형만 보는 객체 탐지와 달리, Pose Estimation은 인체의 관절 구조를 검증하여 진짜 사람인지 판별합니다.
사람을 진짜 사람으로
기존 방식의 한계
기존에는 객체 탐지 모델(OmDet-Turbo) 하나만으로 사람을 인식했습니다:
이미지 입력 → 객체 탐지 모델 → "사람" 감지 → 결과 출력
이 방식은 빠르고 효율적이지만, "사람처럼 보이는 것"을 모두 사람으로 판단하는 치명적 약점이 있었습니다.
실제 오탐 사례 분석
사례 1: 의자 등받이 ≈ 사람 상체?
🪑 빈 의자:
등받이 (세로 형태) → "머리와 상체"로 오인
의자 다리 (수직 구조) → "사람의 다리"로 오인
→ 결과: "앉아있는 사람" 탐지 ❌
사례 2: 코트 + 의자 = 사람?
🧥 의자에 걸린 코트:
코트의 상체 부분 → "사람의 몸통"으로 판단
소매 부분 → "팔"처럼 보임
→ 결과: "의자에 앉은 사람" 탐지 ❌
→ VLM: "업무 중인 직원이 있습니다" 라고 분석 ❌
사례 3: 실험복도 연구원?
🥼 의자에 걸린 실험복:
흰색 실험복 형태 → "앉아있는 연구원"으로 탐지
→ 재실 인원 통계 오류 발생
→ VLM: "실험실에 3명의 연구원이 작업 중" (실제는 1명 + 실험복 2개) ❌
문제의 핵심:
객체 탐지 모델은 외형만으로 판단하기 때문에, 사람의 실제 특성(자연스러운 자세, 관절 구조)을 검증하지 못합니다. 더 심각한 건 학습 데이터의 편향입니다. "사람은 옷을 입고 있다", "의자에는 사람이 앉아 있다"는 패턴을 과도하게 학습한 나머지, 옷만 있거나 빈 의자만 있어도 사람으로 오인하게 된 것입니다.
새로운 접근: VLM 전에 검증하라
우리는 OD와 VLM 사이에 지능형 필터링 계층을 구축했습니다:
[1단계: Object Detection]
이미지 입력 → OmDet-Turbo → "사람일 수도 있는 것들" 찾기
↓
[2단계: Verification Layer] 🎯 핵심 혁신!
Pose Estimation 검증
↓
실제 사람만 통과 / 마네킹 제거
↓
[3단계: Vision-Language Model]
검증된 탐지 결과만 VLM에 전달
↓
정확한 고수준 분석 수행
1단계: 후보 찾기 (Object Detection) OmDet-Turbo 모델이 이미지에서 "사람처럼 보이는 모든 것"을 빠르게 찾아냅니다. 이 단계에서는 민감하게 반응하여 실제 사람을 놓치지 않도록 합니다.
2단계: 진짜 검증 (Pose Estimation Filter) 찾아낸 후보들을 VitPose 모델에 통과시킵니다. 각 후보의 키포인트를 분석하여:
- ✅ 충분한 키포인트가 정확하게 검출되면 → 실제 사람으로 판정, VLM에 전달
- ❌ 키포인트가 부족하거나 부정확하면 → 마네킹/포스터로 판단, VLM 호출 생략
3단계: 고수준 분석 (VLM) 검증된 실제 사람 정보만 VLM에 전달되어, 정확한 상황 이해와 의미 분석이 이루어집니다.
왜 VitPose++를 선택했나?
여러 Pose Estimation 모델을 검토한 끝에 VitPose++를 선택했습니다. Vision Transformer 기반이라 정확도가 높으면서도, 경량화된 small 버전을 사용하여 실시간 처리가 가능했습니다. 무엇보다 다양한 자세와 환경에서 안정적으로 동작한다는 점이 결정적이었습니다. 실제 서비스 환경은 연구실과 달리 예측 불가능한 상황이 많으니까요.
실제 적용 효과
Before & After
적용 전 (객체 탐지만 사용)
🏢 사무실/실험실 환경 분석 결과:
- 감지된 사람: 28명
├─ 실제 인원: 15명
├─ 빈 의자: 5개 (학습 편향: "의자=앉은 사람")
├─ 의자+옷(코트/실험복): 8개 (학습 편향: "옷=사람")
└─ 기타 오탐: 0개
→ 오탐률: 46% 😰
→ VLM이 "28명이 근무/연구 중"이라고 잘못 분석
적용 후 (객체 탐지 + Pose Estimation)
🏢 동일 환경 재분석 결과:
- 감지된 사람: 15명
├─ 실제 인원: 15명
├─ 빈 의자: 0개 (완전 제거 ✅)
├─ 의자+옷: 0개 (완전 제거 ✅)
└─ 기타 오탐: 0개
