본문으로 건너뛰기

Pose Estimation으로 사람 탐지 오탐 해결하기

· 약 12분
Euisuk Chung
Euisuk Chung
AI Specialist

들어가며

"저기 사람이 있어요!" 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 기술입니다. 마치 사람의 골격을 투시하듯이, 신체의 주요 관절 위치를 찾아냅니다.

그림 출처: https://supervisely.com/blog/human-pose-estimation/

사람 이미지 → 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개
→ 오탐률: 0% 🎉
→ VLM이 "15명이 근무/연구 중"이라고 정확히 분석

특히 우리를 괴롭혔던 의자와 옷 오탐은 완전히 사라졌습니다. 관절 구조가 없거나 부자연스러워서 모두 필터링되었기 때문입니다. 객체 탐지 모델의 학습 편향("옷=사람", "의자=앉은 사람")을 Pose Estimation이 효과적으로 보정해준 것입니다.


성능 유지하면서 정확도 향상

가장 중요한 질문이 남았습니다. "속도는 얼마나 느려졌나요?"

놀랍게도 실시간 처리 성능을 유지할 수 있었습니다. 객체 탐지에 약 15ms, Pose Estimation에 추가로 10ms 정도가 소요되어 전체적으로 25ms 안에 처리가 완료됩니다. 초당 40프레임을 처리할 수 있는 수준이죠.

비밀은 선택적 실행에 있습니다. 이미지에 사람이 없으면 Pose Estimation을 아예 건너뛰므로 추가 시간이 전혀 발생하지 않습니다. 반대로 사람이 많이 감지되면 한 번에 배치로 처리하여 효율성을 확보합니다.


실제 서비스 개선 사례

케이스 1: 사무실 재실 인원 모니터링

서론에서 언급했던 사무실 재실 인원 문제는 완벽하게 해결되었습니다. 빈 의자와 코트가 더 이상 "직원"으로 집계되지 않았고, 재실 인원 정확도가 46%에서 94%로 대폭 향상되었습니다. 무엇보다 반가운 건 계절에 관계없이 안정적인 성능을 보인다는 점이었습니다. 겨울에 코트를 걸어둬도, 여름에 의자를 비워둬도 문제없었습니다.

부수적인 효과도 있었습니다. 의자와 코트에 대한 불필요한 VLM 호출이 사라지면서 전체 VLM 호출 횟수가 40%나 감소했습니다. 정확도도 올라가고 비용도 절감되는, 일석이조였죠.


케이스 2: 실험실 안전 모니터링

실험실 환경에서도 큰 개선이 있었습니다. 실험복이나 보호 장비를 걸어둔 것을 "연구원"으로 오인하는 문제가 완전히 해결되었습니다. 특히 안전 관리 측면에서 중요했는데, 실제로 연구실에 몇 명이 있는지 정확히 파악할 수 있게 되면서 비상 상황 대응 능력이 크게 향상되었습니다. VLM이 "3명의 연구원이 실험 진행 중"이라고 정확히 보고하니, 안전 관리자들의 신뢰도가 높아졌습니다.


케이스 3: 회의실 사용 분석

회의실 모니터링에서도 효과가 있었습니다. 빈 의자들을 "회의 참석자"로 잘못 카운팅하던 문제가 사라지면서, 실제 회의실 사용률을 정확히 파악할 수 있게 되었습니다. "회의실에 5명이 회의 중"이 아니라 "회의실에 실제 2명만 있음 (나머지는 빈 의자)"를 구분할 수 있게 된 거죠.




기술적 하이라이트

VLM 기반 분석 시스템에서 가장 중요한 것은 정확한 입력을 확보하는 일입니다. 아무리 뛰어난 분석 능력을 가진 모델이라 할지라도, 잘못된 객체가 입력으로 전달되면 결국 엉뚱한 결론을 만들어내기 때문이죠.

그래서 우리는 객체 탐지(Object Detection) 이후에 바로 VLM으로 결과를 넘기던 기존 방식을 바꾸었습니다. OD 결과 중 사람으로 탐지된 객체들이 정말로 실제 사람인지를 먼저 확인하는 과정을 새롭게 추가한 것입니다. 즉, 파이프라인의 초점을 VLM이 아닌 입력 검증 계층으로 이동시킨 셈입니다.

이를 위해 빠르고 가벼운 Pose Estimation 모델을 사용해 실제 사람만 선별하고, 마네킹이나 의자에 걸린 옷처럼 관절 구조가 없는 객체는 VLM 분석 단계에서 완전히 제외했습니다. 그 결과는 매우 만족스러웠습니다.

  • VLM 응답 정확도 35% 개선
  • 전체 처리 속도 20% 단축
  • 오탐 제거로 인해 전체 파이프라인의 신뢰도 크게 향상

특히 흥미로웠던 건, 이 개선이 단순히 잘못된 분석을 줄이는 차원을 넘어서 시스템 리소스 자체를 효율적으로 사용하는 방향으로 연결되었다는 점입니다.

Pose Estimation은 OD보다 조금 무겁지만 VLM에 비하면 매우 저렴합니다. 즉, 저비용 필터 하나가 고비용 모델의 연산을 날카롭게 최적화해준 것이죠. “필요한 객체에만 집중한다”는 아주 기본적인 원칙이 실제로는 가장 큰 효과를 낸 셈입니다.




기술적 도전과 해결

프로젝트 초기에는 키포인트 임계값을 어디에 둘 것인지가 가장 어려운 문제가었습니다. 초기 설정값이 너무 높으면 부분적으로 보이는 실제 사람을 걸러버리고, 너무 낮으면 의자나 옷처럼 사람이 아닌데 사람인 척하는 객체가 통과해버립니다.

이 임계값을 정하기 위해 수백 장의 사무실·실험실 데이터를 검증하며 여러 차례 시행착오를 반복한 끝에 다음과 같은 기준을 찾았습니다.

키포인트 4개 이상일 때 실제 사람이라고 판정

상체만 보이는 상황에서도 머리, 양쪽 어깨, 한쪽 팔꿈치 정도는 반드시 검출되므로 사람은 통과하고, 코트나 의자는 자연스럽게 걸러집니다.

또 하나 중요한 부분은 학습 데이터 편향을 이겨낸 과정입니다. 일반적인 객체 탐지 모델은 “사람은 옷을 입고 있다”, “의자엔 사람이 앉아 있다” 라는 패턴을 지나치게 학습해 빈 의자를 사람이라고 확신하는 경우가 많습니다.

이러한 편향을 해결하기 위해 키포인트 개수뿐 아니라 개별 키포인트의 신뢰도까지 함께 평가했습니다. 실제 사람의 관절은 자연스러운 위치에 존재하지만 사람이 아닌 객체의 “유사 키포인트”는 대개 부정확하거나 불안정하니까요.

추가적인 지연이 발생하지 않도록 경량화된 VitPose-small을 사용하고, 감지된 모든 후보를 한 번에 배치 처리(batch)하여 성능을 유지한 것도 효율적인 운영 측면에서 중요한 설계였다고 생각합니다.




배운 점과 향후 계획

이번 개선을 통해 가장 크게 느낀 점은 단순합니다.

“현장은 우리가 생각하는 것보다 훨씬 더 단순하고, 훨씬 더 복잡하다.”

빈 의자에 걸린 코트조차 사람이라고 믿어버리는 AI를 보며 이론이 아닌 실제 환경에서 반복 테스트를 하는 것이 얼마나 중요한지 다시 깨달았습니다. 또한 사람을 “진짜 사람처럼” 바라보게 만든 기준은 거창한 AI 모델이 아니라 인체의 자연스러운 자세라는 기본적인 도메인 지식이었습니다.

결국 AI 시스템을 잘 만든다는 것은 새로운 모델을 계속 쌓는 것이 아니라, 각 단계의 역할을 정확하게 이해하고 적절한 계층을 설계하여 서로 보완하게 만드는 일입니다.

앞으로도 현장에서 발생하는 문제를 기술적으로 해결해나가며 그 경험을 꾸준히 공유할 예정입니다.




마치며

"AI 파이프라인은 가장 약한 고리만큼만 강하다"

아무리 뛰어난 Vision-Language Model을 사용해도, 잘못된 객체 탐지 결과를 입력으로 받으면 정확한 분석이 불가능합니다.

우리는 OD와 VLM 사이에 Pose Estimation 기반 검증 계층을 추가하는 것만으로 많은 것을 달성했습니다. VLM에 정확한 정보만 전달하게 되었고, 시스템 전체의 신뢰도가 향상되었으며, 불필요한 연산 비용이 절감되었습니다. 결국 최종 사용자에게 더 나은 경험을 제공할 수 있게 된 거죠.

단순히 최신 모델을 쌓아 올리는 것이 아니라, 각 단계의 역할을 명확히 정의하고 적절한 도구를 조합하는 것이 실전 AI 시스템의 핵심입니다.

앞으로도 실제 현장의 문제를 기술로 해결하며, 그 경험을 공유하겠습니다.