포스트

사람을 한 명씩 찾지 않고 군중을 세는 법: MCNN과 Density Map

사람이 겹쳐 개별 검출이 어려운 장면에서는 머리 위치로 density map을 학습하고 그 값을 합산하는 MCNN 방식이 더 직접적인 선택입니다. MCNN의 핵심은 세 개의 CNN을 쓴다는 사실보다 서로 다른 머리 크기를 각 receptive field가 나눠 보고, 점 라벨을 연속적인 밀도로 바꾸는 데 있습니다. 모델을 평가할 때는 총인원 오차뿐 아니라 밀집 위치와 크기별 누락도 함께 봐야 합니다.

왜 사람을 한 명씩 검출하지 않나

MCNN 논문Single-Image Crowd Counting via Multi-Column Convolutional Neural Network라는 문제를 다룹니다. 밀집 장면에서는 사람이 서로 가려지고, 원근 때문에 가까운 머리와 먼 머리의 크기가 크게 다릅니다. 전경 분할이 부정확하면 최종 인원수도 함께 흔들리고, 전통적인 검출 방식은 심하게 겹친 사람을 하나씩 찾기 어렵습니다.

MCNN은 이미지에서 숫자 하나만 바로 회귀하지 않습니다. 각 위치의 사람 밀도를 나타내는 map을 예측하고, 그 map을 합쳐 전체 count를 얻습니다. 이 표현은 총인원뿐 아니라 어느 구역의 밀도가 유난히 높은지도 남긴다는 장점이 있습니다.

학습에는 ShanghaiTech Dataset이 사용됩니다. Part A는 인터넷에서 모은 다양한 장면, Part B는 상하이 번화가 장면으로 구성돼 있어 밀도와 분포가 다른 영상을 함께 다룹니다.

점 라벨을 Density Map으로 바꾸는 방법

사람의 머리 중심을 점으로 표시한 라벨만으로는 주변 픽셀에 학습 신호가 없습니다. MCNN은 각 머리 위치에 Gaussian kernel을 적용해 연속적인 density map을 만듭니다. 중요한 부분은 모든 머리에 같은 폭을 쓰지 않는다는 점입니다.

각 머리 위치 xi에서 가까운 이웃들과의 평균 거리를 구하고, 그 거리에 비례하는 분산 σi를 정합니다. 머리가 작고 빽빽한 영역과 크고 드문 영역이 서로 다른 범위로 퍼지게 만드는 geometry-adaptive kernel입니다. 논문 기록에서는 이 비례 파라미터 β = 0.3이 가장 좋은 결과를 보였습니다.

MCNN density map 생성 알고리즘

이 라벨 설계는 모델 구조만큼 중요합니다. 머리 크기와 주변 거리의 관계가 약한 장면에서는 이 가정이 그대로 맞지 않을 수 있으므로, 단순히 전체 count 오차만 보지 말고 예측 density가 실제 밀집 구역에 놓이는지도 확인해야 합니다.

세 개의 CNN column이 스케일 차이를 받는 방식

한 크기의 receptive field만 쓰면 서로 다른 크기의 머리를 같은 방식으로 보기 어렵습니다. MCNN은 큰, 중간, 작은 필터에 대응하는 세 개의 CNN column을 병렬로 둡니다. 각 column의 feature map을 쌓은 뒤 1×1 convolution으로 density map에 매핑합니다.

MCNN 세 개 column 구조

구조를 읽을 때 확인할 지점은 다음과 같습니다.

  • 각 column은 서로 다른 필터 크기로 머리 스케일에 대응합니다.
  • 2×2 max pooling과 ReLU를 사용합니다.
  • 큰 필터를 쓰는 column에는 filter 수를 줄여 계산량을 조절합니다.
  • fully connected layer 대신 1×1 convolution을 사용하므로 입력 이미지를 고정 크기로 찌그러뜨리지 않아도 됩니다.
  • 출력은 사람별 box가 아니라 density map입니다.

학습 손실은 예측 density map F(xi; Θ)와 실제 density map Fi의 차이를 사용합니다.

MCNN 학습 손실

학습과 전이학습에서 생기는 현실적인 한계

훈련 이미지가 많지 않고 깊은 네트워크의 gradient가 약해질 수 있어, 원문은 각 column을 개별적으로 먼저 학습한 뒤 전체 파라미터를 함께 미세 조정하는 전략을 설명합니다. 최적화에는 SGD와 backpropagation을 사용합니다. 배치 하나만 보는 SGD는 계산이 가볍지만 노이즈가 크므로, 10~1000개 샘플을 묶는 mini-batch로 변동을 줄이는 선택도 제시합니다.

새로운 장소에 적용할 때는 앞쪽 layer 일부를 고정해 이미 배운 머리 크기 특징을 보존하고, 뒤쪽 layer를 fine-tuning해 대상 장면에 적응시킬 수 있습니다. 그러나 ShanghaiTech에서 학습한 스케일과 배치가 새 카메라의 원근, 밀도를 자동으로 대표한다는 보장은 없습니다. 데이터셋 구성이 다른 경우에는 count 수치만 비교하기 전에 density map이 어디에서 틀리는지, 작은 머리와 큰 머리 중 어느 쪽을 놓치는지부터 확인해야 합니다.

검출과 밀도 회귀 중 무엇을 선택해야 하나

사람 사이의 간격이 충분하고 개별 위치나 추적이 필요하다면 box 검출이 더 많은 정보를 줍니다. 반대로 겹침이 심해 box 경계를 정하기 어렵고 구역별 혼잡도와 전체 수가 목적이라면 density map이 자연스럽습니다. 같은 시스템 안에서도 가까운 영역은 검출, 매우 먼 영역은 밀도 회귀처럼 목적과 해상도에 따라 판단 기준이 달라질 수 있습니다.

라벨 비용도 고려해야 합니다. MCNN은 머리 중심점이 필요하고, kernel의 폭은 주변 이웃 거리라는 가정을 사용합니다. 점이 빠지거나 잘못 놓이면 해당 위치의 밀도도 직접 달라집니다. 훈련 전에 임의의 몇 장을 density map으로 변환해 전체 합이 점 개수와 일치하는지, 사람이 없는 영역에 값이 번지지 않는지 확인하면 모델 바깥의 오류를 줄일 수 있습니다.

평가에서는 하나의 평균값만 보지 않습니다. 낮은 밀도와 높은 밀도 장면을 나눠 보고, 카메라에서 가까운 큰 머리와 먼 작은 머리의 오류를 구분합니다. 예측 합이 맞더라도 density가 엉뚱한 위치에 놓이면 실제 혼잡 구역 분석에는 쓸 수 없습니다.

고정 카메라라면 시간대와 행사 유무로 장면을 나눠 회귀 테스트를 만듭니다. 전체 인원 오차뿐 아니라 구역별 density 합과 빈 구역의 거짓 밀도를 기록하면 단순한 수치 보정으로 숨겨지는 위치 오류를 찾을 수 있습니다.

함께 읽으면 이해가 이어지는 글

자주 묻는 질문

군중 계수에 일반 객체 검출 대신 density map을 쓰는 이유는 무엇인가요?

사람이 심하게 겹치고 머리 크기가 작은 장면에서는 개별 box 경계가 모호합니다. Density map은 머리 점 라벨을 연속적인 밀도로 바꾸고 전체 합으로 인원수를 얻어 밀집 위치도 함께 남깁니다.

예측 density map의 합만 맞으면 좋은 모델인가요?

아닙니다. 한 구역을 과대 추정하고 다른 구역을 과소 추정해도 합은 우연히 맞을 수 있습니다. 전체 count 오차와 함께 밀집 위치, 머리 크기별 누락을 시각적으로 확인해야 합니다.

ShanghaiTech에서 학습한 모델을 새 카메라에 바로 쓸 수 있나요?

바로 같은 품질을 기대하기 어렵습니다. 카메라 원근, 머리 크기, 밀도 분포가 달라질 수 있으므로 앞쪽 특징을 유지한 미세 조정과 새 장면의 density map 오류 검토가 필요합니다.

새 카메라에 옮길 때 어떤 표본을 먼저 모아야 하나

전체 영상을 무작위로 많이 모으기보다 장면의 실패 축을 먼저 나눕니다. 사람이 거의 없는 시간, 보통 밀도, 매우 붐비는 시간과 카메라 가까이, 중간, 멀리 영역을 함께 포함합니다. 우산이나 모자처럼 머리 모양을 가리는 조건, 화면 가장자리에서 일부만 보이는 사람도 별도 표시하면 어떤 오류가 평균 count에 숨는지 알 수 있습니다.

점 라벨을 만든 뒤에는 이미지별 점 개수와 생성된 density map의 합을 비교합니다. Kernel이 화면 밖으로 잘리거나 좌표 변환이 어긋나면 합이 달라질 수 있습니다. 몇 장은 점과 density를 겹쳐 보고 머리가 없는 배경에 밀도가 생기거나 한 사람 주변이 지나치게 넓게 퍼지는지 확인합니다.

검증 결과는 전체 MAE 하나로 끝내지 않습니다. 밀도 구간별 count 오차와 화면 영역별 밀도 오차를 나누고, 가장 크게 틀린 장면을 직접 봅니다. 새 카메라에서 먼 영역만 지속적으로 누락된다면 모델 전체를 다시 만드는 것보다 그 스케일의 라벨과 feature가 충분한지 보는 편이 구체적인 다음 행동이 됩니다.

운영에서는 frame별 숫자가 급격히 튀는지도 봅니다. MCNN 자체는 한 이미지의 density를 예측하므로 시간 방향 안정성을 자동으로 보장하지 않습니다. 같은 장면의 연속 frame에서 입력 흔들림, 조명 변화가 count에 주는 영향을 기록하고, 단일 이미지 평가와 영상 사용 조건을 구분해야 합니다.

사람별 위치나 ID가 필요한 요구에는 density map만으로 충분하지 않습니다. 혼잡도 경보와 전체 수가 목적이면 적합할 수 있지만, 출입 인원 중복 제거와 개인 경로가 필요하면 검출, 추적 정보가 추가로 필요합니다. 원하는 출력이 무엇인지 먼저 정해야 모델의 장점을 올바르게 평가할 수 있습니다.

THE END / OPSOAI

여기까지 읽었습니다

핵심 장면을 한 번 더 떠올려 보세요. 이해가 남았다면 이 책은 제 역할을 다했습니다.

다른 책 고르기
표지 1

키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.

CONTENTS

이 책의 목차

    8개 장 16 분읽는 시간