여러 대의 카메라가 설치된 환경에서 특정 인물을 지속적으로 추적하기 위해서는 각 카메라에 포착된 인물이 동일인인지 판별하는 기술인 Person Re-identification (Re-ID)이 필수적입니다.

Re-ID 분야에서 여러 모델들이 제안되고 있지만, 정제된 데이터셋에서 높은 정확도를 달성하는 모델들이 실제 환경에서는 실시간으로 동작하기 어렵거나, 폐쇄(occlusion) 상황에서 성능이 급격히 떨어지는 경우가 많습니다. 또한 필요 이상의 복잡한 모델 구조로 인해 모바일 및 엣지 환경에서의 활용이 제한적입니다. 저는 이번 프로젝트를 통해 모바일 및 엣지 환경에서도 실시간으로 동작하면서도, 현실적인 상황에서도 강건하게 동작하는 Re-ID 모델을 직접 설계하고 구현해 보았습니다.

모델 설계의 핵심 목표

Re-ID 모델을 설계하면서 제가 가장 집중한 부분은 두 가지입니다.

  1. 실시간성 (Efficiency): 저사양 기기에서 실시간으로 처리할 수 있도록 모델의 크기와 연산량을 최소화.
  2. 강건함 (Robustness): 사람의 몸 일부가 가려지거나(Occlusion), 카메라의 각도가 바뀌어도 동일인을 잘 찾아내야 함.

모델 아키텍처

단순히 이미지 전체에서 하나의 임베딩 벡터를 추출하는 방식은 일부가 가려졌을 때 성능이 급격히 떨어집니다. 이를 해결하기 위해 사람의 몸을 5개의 신체부위(머리, 상체, 하체, 양팔, 양다리 등)으로 나누어 각각의 특징을 추출하는 Part-based representation 방식을 채택했습니다. 본 모델의 아키텍처는 BPBReID(Body Part-based Re-Identification) 에서 영감을 받았습니다.

  • Input: RGB Image Tensor
  • Output 1: 각 신체부위별 Visibility Score
  • Output 2: 각 신체부위별 Embedding Vector

특징 추출: Backbone + FPN + Attention

본 모델은 빠른 추론 속도를 위해 Backbone으로 MobileNetV3를 사용했으며, 고해상도의 세밀한 특징과 고차원의 추상적인 특징을 모두 활용하기 위해 FPN(Feature Pyramid Network) 구조를 적용했습니다.

특징 추출 모델의 아이디어는 분할 맵(Segmentation Map)을 Attention 메커니즘으로 활용하는 것입니다.

feature extraction architecture
분할 맵을 Attention으로 활용하여 각 신체부위의 가시성에 따라 특징에 가중치를 주는 방식

입력 이미지를 5개의 신체부위으로 나누는 분할 맵과 각 위치별 특징을 나타내는 임베딩 맵 (Embedding Map)을 동시에 추출합니다. 이후 임베딩 맵을 분할 맵에 대해 가중합하여 각 신체부위별 Embedding Vector를 생성합니다.

분할 맵과 임베딩 맵의 추출 방식에 약간의 차이를 두었습니다. 분할 맵은 국소적인 특징과 전역적인 특징을 모두 활용하기 위해 FPN의 여러 레벨에서 추출한 feature map을 활용하는 반면, 임베딩 맵은 국소적인 특징을 중점적으로 활용하기 위해 FPN의 낮은 레벨에서 추출한 feature map만을 활용하도록 설계했습니다.

Visibility Score는 분할 맵에서 각 신체부위가 얼마나 잘 보이는지를 나타내는 지표로, 각 신체부위별 분할 맵에서 최대값을 취하여 계산합니다. 이는 이후 유사도 측정에서 각 신체부위의 중요도를 조절하는 데 활용됩니다.

두 이미지의 유사도는 각 신체부위별 Embedding Vector 간의 코사인 유사도를 계산한 후, 이를 Visibility Score에 따라 가중하여 전체 유사도를 계산하는 방식으로 측정합니다.

similarity comparison diagram
각 신체부위별 유사도 계산

전체 유사도 계산 방식으로 흔히 Weighted Mean 방식을 생각해볼 수 있습니다. 그러나, 우리가 관심 있는 것은 ‘전체적으로 비슷한가?’가 아니라 ‘각 부분이 모두 비슷한가?’입니다. 두 이미지가 다른 사람임을 판단할 때, 결정적으로 다른 부분 하나만 있으면 충분하기 때문입니다. 예를 들어 신발 하나의 차이 같이 말입니다. 쇠사슬의 강도는 가장 약한 고리에 의해 결정된다는 의미로 Weakest Link 원칙이라고 이름을 붙여봤습니다.

Weakest Link를 구현할 수 있는 여러 메트릭을 고민해봤으며, 그 중 Product 방식을 소개합니다.

$$ Similarity_{total} = \prod_{i=1}^{n} (1-v_i) + v_i \cdot \text{remap}_i(\text{cos_sim}(f_i, g_i)) $$

각 부분별 유사도를 구한 뒤, 곱을 취합니다. 이 과정에서 Visibility Score $v_i$가 0에 가까울수록 해당 부분의 유사도가 전체 유사도에 미치는 영향이 줄어들도록 설계했습니다.

또한 각 부분별 유사도는 단순히 코사인 유사도를 사용하기보다는, 코사인 유사도의 범위를 [0, 1]로 리맵핑하는 함수를 적용하여 계산했습니다. 코사인 유사도가 음수인 경우는 동일인일 가능성이 없으므로 0으로 하한을 두었으며(clamping), 이를 통해 각 부분별 descriptive power 또는 commonality의 차이에 따라 적정 임계값이 다를 수 있다는 점을 고려했습니다.

리맵핑 함수는 다음과 같이 정의했습니다.

$$ \text{remap}_i(x) = \frac{1}{1 + \frac{1 - V}{V} \left( \frac{\tau_i}{1 - \tau_i} \cdot \frac{1 - x}{x} \right)^k }, \quad x \in (0, 1) $$

여기서 $\tau_i$는 각 부위별 적정 임계값이며, $V$은 $x=\tau_i$일 때 부여할 값입니다. $k$는 결정 경계에서의 곡률(steepness)을 조절합니다. 기본 값으로 $V=0.7$와 $k=2$을 사용했습니다.

적정 임계값($\tau_i$)은 서로 다른 인물 간의 명확한 변별력을 유지하면서도, true positives을 극대화하도록 선택되었습니다. 핵심 철학은 ‘확실히 다른’ 후보는 단호하게 배제하고, ‘동일인일 가능성이 있는’ 후보는 최대한 보존하는 것입니다. 아래과 같이 적정 임계값을 설정했습니다.

similarity score distribution for head similarity score distribution for torso similarity score distribution for arms similarity score distribution for upper legs similarity score distribution for lower legs

모델 학습

모델은 다음과 같이 멀티 태스크(multi-task) 방식으로 학습되었습니다.

  • 분할(Segmentation): Focal Loss를 사용하여 COCO DensePose 데이터셋으로 학습되었습니다.
  • 특징 추출(Feature Extraction): Classification Loss와 Triplet Loss를 조합하여 AI Hub(한국 정부 지원 플랫폼)의 한국인 재식별 이미지 데이터셋으로 학습되었습니다.

현실적인 환경을 재현하기 위해 Random Crop과 저해상도 상황을 구현하기 위해 Random Resizing을 적용하여 학습 데이터를 증강했습니다.

웹 데모

실용성을 확인하기 위해 ONNX Runtime Web을 사용하여 웹 브라우저 상에서 CPU만으로 실시간 추론이 가능한 데모를 구현했습니다.

https://juhonamnam.github.io/realtime-re-id/

별도의 서버 없이도 사용자의 브라우저에서 직접 딥러닝 모델이 돌아가는 모습을 보며, 엣지 컴퓨팅의 가능성을 다시 한번 확인할 수 있었습니다.

마치며

이번 프로젝트를 통해 딥러닝 모델의 구조 설계부터 학습, 그리고 웹 환경으로의 배포까지 전 과정을 경험할 수 있었습니다. 특히 논문에서 보았던 구조들을 그대로 따라 하기보다, 제가 정한 목적에 맞게 모델을 설계했습니다.

최종 모델 구조를 선정하는 과정에서 다양한 아이디어로 여러 시도를 해봤으며, 성공적이지 못한 시도들 조차 검증하는데 많은 시간이 소요되었습니다.

본 모델은 실시간성을 위해 경량화된 모델이기에, 높은 정확도는 일부 희생될 수밖에 없습니다. 따라서 본 모델을 단독으로 사용하기보다는, 동일인 후보군을 좁히는 1차 필터링 단계로 활용하고, 이후에 더 정밀한 모델을 적용하는 방식으로 활용할 수 있을 것으로 기대합니다.

자세한 소스 코드는 제 GitHub 저장소에서 확인하실 수 있습니다.

댓글남기기