IT

OpenCV-Python: 가우시안 혼합을 이용한 배경 제거 알고리즘 (2)

유병혁 2020. 6. 3. 22:14

안녕하세요? 이번 글은 Grimson et al (1999)이 제안한 '가우시안 혼합 기반 배경 제거 알고리즘'에 관해 정리해 보고자 합니다. 해당 논문은 아래 링크를 통해 PDF 파일로 다운받아 보실 수 있습니다.

 

Stauffer, C., Grimson, W. E. L. Adaptive background mixture models for real-time tracking. in Proceedings. 1999 IEEE Computer Society Conference on Computer Vision and Pattern Recognition. IEEE Computer. Soc. Part Vol. 2, 1999.

PDF 파일 다운로드 | http://www.ai.mit.edu/projects/vsam/Publications/stauffer_cvpr98_track.pdf

 

저는 국립공원에 근무하면서 '카메라 트랩(camera trap)'이라는 장비를 사용합니다. 카메라 트랩은 보호지역 내에서 서식지에 직접 접근하지 않고도 야생동물의 현황을 파악할 수 있는 이점을 가지고 있습니다.

사진 출처: https://www.theguardian.com/environment/2011/dec/06/wildlife-camera-traps-conservation

 

일반적으로 카메라 트랩을 통해 취득되는 데이터는 '동영상'이며 아래 그림과 같이 연속 영상(image sequence)으로 구성되어 있습니다. 우리가 알고자 하는 것은 배경 모형을 생성하는 것입니다. 이를 통해 궁금한 야생동물(전경 객체)에 보다 집중할 수 있을 것입니다.

사진 출처: upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Muybridge_Buffalo_sequence.jpg/800px-Muybridge_Buffalo_sequence.jpg

 

카메라 트랩은 특정 위치에 고정되어 있습니다. 시간이 지남에 따라 프레임 속에는 고라니, 오소리, 삵, 산양 등 야생동물들이 포착될 수 있습니다. 즉, 동영상 속 특정 위치의 화소값은 지속적으로 변화할 것입니다.  정적 카메라에서 {x_0, y_0} 좌표의 화소값 배열, 화소 벡터는 다음과 같은 식으로 정의할 수 있습니다:

 

여기서 I는 연속 영상을, X_t는 임의의 시간 t에서의 화소 값을 의미합니다. {x_0, y_0} 위치 화소가 정적 배경이면서 동시에 정적 조도(빛)가 제공된다면, {X_1, ...., X_t}는 비교적 일정하게 유지될 것입니다. 이 경우에 {X_1, ...., X_t}는 평균 화소값을 중심으로 한 단일 가우시안 분포를 따른다고 할 수 있습니다.

 

그러나 실제 연속 영상에서는 조도의 변화, 또는 동적 객체의 출현으로 인하여 다수의 가우시안 혼합을 고려해야 할 것입니다. 아래 플롯은 배경 화소와 전경 화소의 가우시안 혼합 분포를 나타낸 예입니다:

그림 출처: https://www.researchgate.net/figure/Two-Gaussian-Mixture-models-were-fixed-over-the-satellite-image-to-separate-the_fig4_330034794

{X_1, ...., X_t}에 대해 우리는 K개의 가우시안 분포(K Gaussian distributions)의  혼합으로 모형화할 것입니다. 시간 t에서의 화소값 X의 확률은 아래 식과 같이 정의됩니다:

여기서 K는 분포의 개수, w_i,t는 시간 t에서 i번째 가우시안의 가중치(데이터의 얼마만큼이 이 가우시안에 의해 설명되는지)를 추정합니다. mu_i,t는 시간 t에서 i번째 가우시안의 평균값, sigma_i,t는 시간 t에서 i번째 가우시안의 공분산 행렬을 나타냅니다.

 

K는 사용 가능한 메모리와 계산력에 따라 결정되며, 3에서 5까지 사용됩니다. eta는 가우시안 확률밀도함수(Gaussian probability density function)를 정의하며 식은 다음과 같습니다:

계산 복잡성의 이유로, 공분산 행렬은 다음과 같은 형식으로 가정합니다:

여기서 적색, 녹색, 청색 화소 값은 서로 독립적이며 동일한 분산을 갖는 것으로 가정합니다. I는 단위행렬(identity matrix: 주대각선의 원소가 모두 1이며 나머지 원소는 모두 0인 정사각 행렬)을 나타냅니다.

 

자, 모형화 절차는 다음과 같습니다. 첫번째 X_1에 대하여 가중치는 1, 평균은 X_1, 표준편차는 임의의 값을 가정한 단일 가우시안을 모형화 합니다. K는 정해진 갯수만큼 증가됩니다. 그리고 X_t는 기존 K 가우시안 분포와 비교하여 일치여부를 확인하여, 일치하는 경우에 K 가우시안의 가중치, 평균, 분산은 아래 식에 따라 갱신해 갑니다. 일치여부의 기준은 X_t값이 K 가우시안의 2.5 표준편차 내에 속하는지로 판단합니다.

 

시간 t에서 K 분포의 가중치, w_k,t는 다음과 같이 조정됩니다:

여기서 alpha는 학습률, M_k,t는 일치하는(Match) 모형의 경우는 1, 불일치한 모형의 경우 0을 부여합니다. 일치하는 모형의 평균과 분산 매개변수는 다음 식으로 갱신합니다. 반대로 불일치한 모형의 평균과 분산 매개변수는 그대로 유지됩니다.

 

 

일치하는 모형이 하나도 없는 경우에는 X_t를 평균값으로 초기 분산은 높고, 가중치는 낮은 분포를 만들어 기존 K 분포 중 최소 가중치 모형을 대체합니다.

 

가우시안 혼합 모형에서 배경에 해당하는 가우시안 분포는 상대적으로 가중치는 높고 분산은 적은 특성이 있으므로, K 가우시안 분포는 가중치/표준편차 값에 대해 내림차순으로 정렬합니다. 그리고 아래 식을 만족하는 B개의 분포를 배경 모형(background model)으로 근사합니다:

 

여기서 여기서 T는 배경으로 설명되어야 할 데이터의 최소 비율을 의미합니다.

 

가우시안 혼합을 이용한 배경 제거 알고리즘은 대만 국립 가오슝 제일 과학기술대학(First Tech)의 시-신 후앙(shih-shinh huang) 님의 동영상에 정리가 잘 되어 있습니다. 이상으로 개념적인 부분을 살펴봤구요, 다음 글에서는 실제 OpenCV-Python에서 배경 제거 알고리즘을 적용하는 방법을 알아보겠습니다.

 

https://www.youtube.com/watch?v=g_ve2txPkSc