[영상추적#1] Mean Shift 추적

영상처리 2013.05.13 18:11

영상에서 물체를 추적하고자 할 때, 보통 가장 먼저 떠오르는게 mean-shift 방법일 것이다. 하지만 막상 mean-shift를 이용하여 영상 추적을 하려면 실제 어떻게 해야 하는지 막막한 경우가 많다. 가장 기본적인 방법임에도 불구하고 처음에는 헤매기 쉽다 (저도 그랬습니다 ^^).


1. Mean Shift 란?


시력이 매우 나쁜 사람을 산에다가 던져놓고 산 정상을 찾아오라고 하면 어떻게 될까? 당연히 눈이 보이는 한도 내에서는 가장 높은 쪽으로 걸음을 옮길 것이고, 이렇게 가다보면 산 정상에 다다를 수 있을 것이다. 이러한 탐색 방법을 힐 클라임(Hill Climb) 탐색 방법이라고 부르는데, Mean Shift도 Hill Climb 탐색 방법의 일종이다.


Mean Shift는 어떤 데이터 분포의 peak 또는 무게중심을 찾는 한 방법으로서, 현재 자신의 주변에서 가장 데이터가 밀집된 방향으로 이동한다. 그러다 보면 언젠가는 분포 중심을 찾을 수 있을 거라는 방법이다.


예를 들어, 2차원 평면상에 데이터들이 분포되어 있는데 Mean Shift를 이용하여 이 데이터들이 가장 밀집된 피크(peak) 점을 찾는다고 하자. Mean Shift의 탐색반경을 r이라 했을 때, Mean Shift 알고리즘은 다음과 같다.

  1. 현재 위치에서 반경 r 이내에 들어오는 데이터들을 구한다: (x1,y1), (x2,y2), ..., (xn,yn)
  2. 이들의 무게중심의 좌표 (∑xi/n, ∑yi/n)로 현재 위치를 이동시킨다.
  3. 1~2 과정을 위치변화가 거의 없을 때까지, 즉 수렴할 때까지 반복한다.


Mean Shift란 용어는 평균(mean)을 따라 이동(shift)시킨다는 뜻이다. Shift란 용어는 어떤 것이 현재 상태 그대로 위치만 변할 때 사용된다. 마이클 잭슨의 빌리지인~ 춤을 생각하기 바란다. 여기서는 크기가 고정된 탐색 윈도우를 이동시킨다는 의미이다.



2. Mean Shift 에 대해 좀 더 알아보기


앞서, Mean Shift는 Hill Climb 탐색 방법의 일종이라고 했는데, 비슷한 뜻으로 gradient descent search, blind search, greedy search 등이 있다. 이러한 류의 탐색 방법은 효과적이기는 하지만 local minimum에 빠지기 쉽다는 문제점이 있다. 예를 들어 앞의 산의 정상을 찾는 문제에서 던져진 사람은 바로 옆에 높은 산이 있더라도 처음 출발한 산의 정상만을 찾게 될 것이다. 만일 처음에 매우 완만한 구릉에서 출발했다면 그 구릉 꼭대기에서 멈춰버릴 것이고 그 옆의 진짜 높은 산 정상은 가지 못할 것이다.


Mean Shift와 같은 Hill Climb 방식은 global minimum을 찾지 못하며, 초기위치(출발위치)에 따라서 최종적으로 수렴하는 위치가 달라질 수 있다. 초기 위치는 문제에 따라 미리 주어지거나, 아니면 무작위로 임의의 위치에서 시작하거나, 혹은 전체 데이터의 평균 위치에서 출발하는 등의 방법이 있을 수 있다.


Mean Shift에서는 기본적으로 주변의 지역적인(local) 상황만 보고 진행방향을 결정하기 때문에, Mean Shift를 적용하기 위해서는 먼저 탐색반경(search radius)의 설정이 필요하다. 탐색반경을 너무 크게 잡으면 정확한 피크(peak) 위치를 찾지 못하게 되며, 반대로 너무 작게 잡으면 local minimum에 빠지기 쉬워진다.


Mean Shift의 가장 큰 단점 중의 하나는 탐색 윈도우(탐색 반경)의 크기를 정하는 것이 쉽지 않다는 것이다. 특히 영상 추적의 경우 대상 물체의 크기, 형태 변화에 따라 탐색 윈도우의 크기나 형태를 적절히 변경해 주어야 하는데 이게 적절히 변경되지 않으면 추적 성능에 많은 영향을 끼치게 된다.


Mean Shift는 물체추적(object tracking) 외에도 영상 세그멘테이션(segmentation), 데이터 클러스터링(clustering), 경계를 보존하는 영상 스무딩(smoothing) 등 다양한 활용을 갖는다. 구체적 활용 예 및 보다 심도깊은 이론적 내용에 대해서는 "Mean shift: a robust approach toward feature space analysis", PAMI 2002년도 논문을 참조하기 바란다.



3. Mean Shift를 이용한 영상 이동체 추적


영상추적을 하는 사람들은 Mean Shift를 하나의 추적방법인 것처럼 생각하지만, Mean Shift는 하나의 일반적인 방법론적 도구일 뿐이다. 따라서, Mean Shift를 가지고 영상 추적을 하는 것은 사실은 별개의 얘기이다.


Mean Shift를 이용한 영상추적 방법은 사실 Comaniciu, Ramesh, Meer, "Real-time tracking of non-rigid objects using mean shift", CVPR 2000 논문에 있는 방법을 지칭한다 (저자들은 mean-shift에 대해 특허도 걸어 놓았다). 여기서 설명하고자 하는 mean shift 추적 방법도 기본적으로는 이 논문에 있는 방법이다.


기본 아이디어는 아래 그림과 같이 추적하고자 하는 대상 물체에 대한 색상 히스토그램(histogram)과 현재 입력 영상의 히스토그램을 비교해서 가장 유사한 히스토그램을 갖는 윈도우 영역을 찾는 것이다.


그런데 이렇게 직접 히스토그램을 비교할 경우에는 모든 가능한 윈도우 위치에 대해 각각 히스토그램을 구하고 또 비교해야 하기 때문에 시간이 너무 오래 걸린다.


따라서 실제로는 아래 그림과 같이 histogram backprojection 기법과 mean shift를 결합한 방법을 사용하는 것이 일반적이다 (이렇게 해도 가장 유사한 히스토그램 영역을 찾을 수 있다는게 위 CVPR 2000 논문의 핵심 내용이며, 논문에 그 증명이 나와있다)



먼저, 영상에서 추적할 대상 영역이 정해지면 해당 윈도우 영역에 대해 히스토그램을 구하여 객체 모델로 저장한다. 이후 입력 영상이 들어오면 histogram backprojection을 이용해서 입력 영상의 픽셀값들을 확률값으로 변경시킨다. 이렇게 구한 확률값 분포에 대해 mean shift를 적용하여 물체의 위치를 찾는다. 만일 물체의 크기 변화까지 따라가고 싶은 경우에는 찾아진 위치에서 윈도우의 크기를 조절해 가면서 저장된 모델과 가장 히스토그램 유사도가 큰 스케일(scale)을 선택한다.



4. Mean Shift 추적 구현


[히스토그램 구하기]
색상 모델은 RGB, HSV, YCbCr 등 어느것을 써도 된다 (큰 차이가 없다). 또는 그레이(gray)를 사용하거나 HSV의 H(Hue)만 사용해도 된다. 히스토그램은 윈도우에 들어오는 픽셀들에 대해 각 색상별로 픽셀 개수를 센 다음에 확률적 해석을 위해 전체 픽셀수로 나눠주면 된다.

[히스토그램 백프로젝션(backprojection)]
현재 입력 영상에 있는 픽셀 색상값이 추적하고자 하는 객체 모델에 얼마나 많이 포함되어 있는 색인지를 수치화하는 과정이다. 모델 히스토그램을 Hm, 입력 이미지 I의 픽셀 x에서의 색상값을 I(x)라 하면 백프로젝션 값은 w(x) = Hm(I(x)) 와 같이 구할 수 있다. 그런데, 보통은 현재 입력 영상에 대한 히스토그램 H를 구한 후 w(x) = sqrt{Hm(I(x))/H(I(x))}와 같이 모델 히스토그램 값을 현재 영상 히스토그램 값으로 나누는 것이 일반적이다. 이렇게 값을 나누어 주면 모델에 포함된 색상값들이 그 비율에 관계없이 일정하게 높은 w값을 갖게 하는 효과가 있다. 예를 들어, 추적하고가 하는 물체가 빨간색 영역이 10%, 파란색 영역이 90%로 구성된 경우를 생각해 보기 바란다.

[Mean Shift 적용]
히스토그램 백프로젝션을 통해 얻은 w값들을 일종의 확률값처럼 생각하고 mean shift를 적용하는 것이다. 이전 영상 프레임(frame)에서의 물체의 위치를 초기 위치로 해서 다음과 같이 mean shift를 적용한다.

즉, w를 가중치(weight)로 해서 현재 윈도우(window)내에 있는 픽셀 좌표들의 가중평균(무게중심) 위치를 구하는 것이다. 이렇게 구한 xnew가 새로운 윈도우의 중심이 되도록 윈도우를 이동시킨 다음에 수렴할 때까지 이 과정을 반복하는 것이다. 식에 있는 K(ri)에서 K는 커널(kernel) 함수, ri는 현재 윈도우 중심에서 xi까지의 거리를 나타낸다. 커널함수는 배경의 영향을 줄이기 위한 목적으로 사용하는데, 윈도우 중심에서 가장 높은 값을 갖고 중심에서 멀어질수록 값이 작아지는 방사형의 symmetric 함수가 주로 사용된다. 아무래도 윈도우의 경계 부근에서는 배경 픽셀이 포함될 확률이 높기 때문에 경계로 갈수록 가중치를 낮춰주는 것이다. 실제 커널 함수로는 Epanechnikov 함수가 주로 사용된다.

아니면 그냥 윈도우에 내접하는 타원에 대해 타원 내부에 있으면 1, 외부면 0인 함수를 커널로 사용해도 된다.


[히스토그램 유사도 측정]

두 히스토그램 H1 = {p1,...,pn}, H2 = {q1,...,qn} 사이의 유사도는 보통 Bhattacharyya 계수(coefficient)를 이용해서 계산한다.

Bhattacharyya 계수는 두 히스토그램이 일치할 때 최대값 1, 상관성이 하나도 없으면 최소값 0을 갖는다.


[물체의 크기(scale) 결정]

일단 mean shift로 위치를 찾은 다음에 윈도우의 크기를 조금씩 변경시켜 보면서 모델 히스토그램과 현재 윈도우 영역에 대한 히스토그램을 비교한다. Bhattacharyya 계수가 가장 큰 경우를 찾으면 된다.



5. Mean Shift 샘플 동영상


직접 구현한 Mean Shift 추적기를 실제 영상추적에 적용한 샘플 동영상이다. 녹색이 배경과 잘 구분되기 때문에 초반에는 비교적 잘 추적하지만 후반부에는 같은 팀 선수들 사이로 여기저기 옮겨다니는 걸 볼 수 있다.




6. Mean Shift 추적에 대한 생각


Mean Shift 추적은 일단은 가장 기본적인 방법이기 때문에 영상 추적을 한다면 한번 정도는 직접 해 볼 필요가 있다. 하지만 성능은 그다지 기대하지 않는 것이 좋다. 추적하고자 하는 물체와 배경이 유사한 색상을 가지면 실패하기 쉽상이기 때문이다. 또한 물체의 크기가 변하는 경우도 큰 문제이다. Mean Shift 추적은 윈도우 크기가 잘못되면 성능이 형편없어진다.


그럼에도 불구하고 Mean Shift 추적은 대상의 형태가 변하는 경우에 유용하며, 가볍고 빠르기 때문에 나름 유용하다. 일반적인 실외환경이 아니라 제한된 환경 및 응용에서는 Mean Shift가 매우 강력한 방법이 될 수도 있다. 또는 Mean Shitf를 다른 추적 방법과 상호 보완적으로 결합하여 사용하는 것도 좋은 방법이 될 것이다.


아래 동영상은 유투브에서 발견한 것인데 mean shift가 성공적으로 적용되는 경우들을 보여준다. 후반부에 나오는 경찰 추격신이 꽤나 흥미롭다.




by 다크 프로그래머

  • 이전 댓글 더보기
  • 그림그리는개발자 2015.05.08 17:29 ADDR 수정/삭제 답글

    답변감사드립니다!! ㅎㅎ 사실 답변도 너무 어렵다는 느낌이 강하게 드네요.
    이제야 w를 구하는 것을 이해했습니다. 이해는 했는데 맞는건지 아리쏭 하네요. 결과를 보니까 일정 성분을 볼 수 있겠다고 생각을 했는데 (Gray영상입니다.) 히스토그램 백프레션 영상이 거의 않보이네요;;
    영상이 대체로 어둡고 비슷한게 많아서 그런지 아니면 샘플이 너무 작아서 그런지...
    sqrt{Hm(I(x))/H(I(x))}를 이용해서 w 를 구해서 영상으로 보니 거의 보이지가 않네요.
    그래도 그 어떤 필터링 보다 오브젝트가 깔끔합니다.(이거 먼가 잘못된 느낌이군요...)
    (sqrt{Hm(I(x))/H(I(x))} != 0) ? 255 : 0; 을 이용해서 보니 걍 필터처리 한 느낌입니다. ;;

    어째든 열심히 다시 해봐야 겠군요. 좋은정보 답글 너무 감사드립니다.

    • BlogIcon 다크pgmr 2015.05.10 12:29 신고 수정/삭제

      w를 그대로 이미지로 만들면 스케일 문제로 아마도 잘 보이지 않을 것입니다. 이미지로 볼 때에는 w의 스케일을 최소~최대값이 0 ~ 255가 되도록 스케일을 적당히 맞춘 후 이미지로 보시면 됩니다. 물론 meanshift는 원래의 w에 적용해야 합니다.

  • 그림그리는개발자 2015.05.11 09:43 ADDR 수정/삭제 답글

    카~ 그렇군요. 정말 감사드립니다.ㅠ!!!

  • 그림그리는개발자 2015.05.13 15:18 ADDR 수정/삭제 답글

    Hitogram Backprojection 연산에서 밝은 오브젝트를 잡았을때 오히려 더 성분값이 않나오는 문제가 있습니다. -_-;; Gray scale이라서 그런지 값이 대부분이 0을 가지는 군요. (셈플영상을 현재 영상에서 나누는 과정에서 현재 영상의 값이 큰 값을 가지는게 문제더라구요....-_-) 블로그에 나와있는 자동차 영상과 같이 나오는걸 원했는데 역시 잘 되지가 않아 고민입니다.ㅠ

    • BlogIcon 다크pgmr 2015.05.13 20:24 신고 수정/삭제

      본문의 설명 내용중 [히스토그램 구하기] 단락에서 "확률적 해석을 위해 전체 픽셀수로 나눠주면 된다." 부분을 빠뜨리신 것 같습니다..

  • 그림그리는개발자 2015.05.27 16:14 ADDR 수정/삭제 답글

    한참 다른일 때문에 돌고 돌다가 다시 본 작업에 들어왔습니다.
    조언해주신 "확률적 해석을 위해 전체 픽셀수로 나눠주면 된다." 부분도 빠짐 없이 수행을 했구요.

    그래도 분별력이 별로 없다는게 문제네요...;;

    w 를 제대로 보기위해서 스케일을 해서 보면 신기하게도 첫 프레임 이 후 점점 어두워 지는 현상도 있습니다. 스케일시 max 값을 255 로 기준으로 스케일을 하도록 해놨는데 점점 max 가 높아 지는;;

    일단 gray scale 영상이라서 그런지 분별력이 너무 없다는게 문제 입니다.

    10m 높에서 720 X 480 아날로그 카메라 영상에다 차량 크기가 작은거도 한몫 하는거 같구요.

    전체 영상에서 Template로 잡은 영역에서 상.하.좌.우 를 더 키워서 서칭을 하도록해서 작은 영상에서 스켄하는 방식으로 해서 속도를 증가 시켰지만 이렇게 작은 영상에서도 분별력이 너무 떨어지는 군요. ㅠㅠ 오늘 까지 해보고 다른 방안을 찾아 봐야 겠습니다.

    시간되면 컬러영상에서 꼭 테스트 해봐야 겠네요 ㅎ

    • BlogIcon 다크pgmr 2015.05.27 18:34 신고 수정/삭제

      같은 알고리즘이라도 어떻게 구현했느냐 어떤 문제에 적용했느냐에 따라서 성능에 편차가 발생할 수 있습니다. opencv에서 기본 제공하는 mean-shift 와 성능을 비교해 보는 것도 좋을 것 같습니다 (http://darkpgmr.tistory.com/111 글의 tracker_opencv.zip 참조)

  • 2016.03.15 16:48 ADDR 수정/삭제 답글

    비밀댓글입니다

    • BlogIcon 다크pgmr 2016.03.16 09:15 신고 수정/삭제

      L2-norm 입니다.

    • BlogIcon 공자 2016.03.16 09:35 수정/삭제

      감사합니다. 매번 읽기만하다가 궁금한게 생겨서 댓글을 ㅎㅎㅎ그런데 레퍼런스엔 xTx라고되잇던데 제곱해서 더한건알겟는데 루트가없어도 L2 norm이되는건가요??

    • BlogIcon 다크pgmr 2016.03.16 10:02 신고 수정/삭제

      norm이라면 당연히 루트가 있어야 합니다. 하지만 1이라는 숫자의 특수성 때문에 |x|^2<1이라고 하나 |x|<1이나 같은 식이 되는 것 같습니다.

  • 마르코프 2016.03.30 11:16 ADDR 수정/삭제 답글

    안녕하세요, Mean Shift 가 Multi-target 추적에도 사용하기 용이할까요? 설사 가능하다고 해도 무척이나 복잡해질까요? 고민해보지않고 답변부터 성급히 구하고자하는 마음 이해부탁드립니다 ^^

    • BlogIcon 다크pgmr 2016.03.30 11:46 신고 수정/삭제

      제가 해본건 아니지만 적용은 가능하리라 생각합니다.

  • VCR 2016.05.12 14:09 ADDR 수정/삭제 답글

    질문있습니다.
    model img(한영상의 ROI)와 input img(전체영상)으로 histogram backprojection을 적용하여 0~1의 확률값(weight)을 구하였습니다.
    그뒤, meanshift를 적용할려고하는데 제 생각이 맞나 알고싶습니다.

    민시프트의 커널은 ROI와 같은 크기를 갖고
    ROI내의 weight들의 무게중심을 향하여 민시프트 하면 되는건가요?
    그렇다면 데이터가 weight 1차원이네요?

    그런데 또 생각해보니 동영상 프레임마다 하나의 수렴점이 나와야하는데... 이부분부터 도무지 이해가 안되네용ㅠ

    • BlogIcon 다크pgmr 2016.05.12 19:06 신고 수정/삭제

      네 모두 맞습니다. 그리고 meanshift를 적용하면 항상 한 점(weight들의 무게중심)으로 수렴하게 됩니다.

  • VCR 2016.05.12 19:15 ADDR 수정/삭제 답글

    항상 한 점(weight들의 무게중심)으로 수렴하게 됩니다.
    이부분이 이해가 되지않습니다.
    물론 확률모델을 구할때 모델영역(입력영역의 ROI)이 확률값이 1에 가깝긴하지만 전부 1은 아닌데
    항상 한 점에서 수렴하나요?

    그리고 다음프레임에서는
    이전프레임에서 구한 수렴점을 중심으로하는 ROI사각형이 새로운 모델이미지의 범위가 되는것인가요?

    • BlogIcon 다크pgmr 2016.05.12 22:46 신고 수정/삭제

      확률값이 1이든 0.1이든 그건 관계없습니다. 직전 프레임의 roi 위치에서 시작해서 meanshift를 적용하면 지역적으로 확률값의 분포가 peak 가 되는 지점으로 roi 윈도우가 이동합니다. mean shift에 대해서 무언가 잘못 이해하고 있는 부분이 있는 것 같습니다. meanshift 원리에 대해 다시 한번 살펴보시길 권합니다.

  • VCR 2016.05.12 23:52 ADDR 수정/삭제 답글

    흠.. 답변감사합니다.

    그럼 위의 Xnew 구하는 수식에서 x_i 는 ROI안에있는 모든 데이터(i개)의 집합(영상좌표값)이고,
    여기에 해당되는 확률값을 곱하는고 더해서 평균을 나눈다는것의 의미가 결국 이 데이터의 peak로 이동한다는것이 되겠네요..

    현재 제가 참고하는 문서는
    https://onedrive.live.com/redir?resid=290A9894F3A8CF65!43467&authkey=!AGcaprF8X8rxHEY&ithint=file%2cpptx
    이것인데, 여기서는 한데이터에대해 그 집합의 모든데이터들의 거리를 이용하여 이동하여 수렴점을 찾는 방식이라 혼동을했던것같습니다.

  • 학부연구생 2016.05.14 15:06 ADDR 수정/삭제 답글

    안녕하세요.
    영상처리를 활용해서 프로젝트를 진행중인 학생입니다.
    우선 프로젝트를 진행함에 있어서 유용한 글들이 블로그에 많아 감사의 말씀 전합니다.

    다름이 아니라 질문이 있는데요.
    위의 영상에서 선수를 추적할 때 초기에 지정한 영역은 선수의 한 모습이며 실제 영상이 진행되는 동안 선수는 회전을 하면서 모습이 수시로 바뀌게 됩니다. 그러면 초기 영역의 히스토그램으로 추적을 하는 데 있어서 확률이 많이 떨어질 것 같은데요. 제가 현재 하려는 프로젝트도 이와 같은 문제에 의해 고민중에 있습니다. 이것을 보완하고자 한 추적기법이 TLD 알고리즘 인가요?
    혹시 다른 보완 방법에 대한 아이디어나 조언 있으시면 부탁드리겠습니다.
    읽어주셔서 감사합니다.

    • BlogIcon 다크pgmr 2016.05.14 15:47 신고 수정/삭제

      말씀하신 문제는 모델 갱신(model update) 문제로서 영상 추적 기술에 있어서 주요 문제 중의 하나입니다. 관련하여 1. 모델을 아예 바꾸지 않는 방법(초기 모델을 그대로 사용하는 방법), 2. 현재 이미지에서의 값으로 모델을 계속 바꾸는 방법(변화에 대한 적응력은 뛰어나지만 심각한 drift 문제), 3. 기존 모델과 현재 이미지에서 추출된 모델의 가중 평균을 새로운 모델로 삼는 방법 (가장 일반적인 방법), 4. 초기 모델과 현재 이미지(또는 최근 n개의 이미지)에서 추출된 모델의 가중 평균을 모델로 삼는 방법 등 여러 가지 방법이 있습니다. 각각의 방법 별로 장단점(trade off)이 있으니 직접 경험 및 실험을 통해 적절한 방법을 찾으시기 바랍니다.
      tld는 추적하면서 detector를 학습시킨다는 의미로서 자세한 내용은 http://darkpgmr.tistory.com/65 글을 참조하시기 바랍니다.

  • 123 2016.05.19 13:38 ADDR 수정/삭제 답글

    몇가지 질문있어 댓글남깁니다.

    그림3에서 mean shift localization 의 수식이 이해가 안되 질문드립니다.

    x_new 를 구하기 위해선 x_old와 델타x의 합으로 표현되는데,
    이 델타 x에서 x는 현재 프레임에서의 모든 데이터 집합이고,
    x_old는 이전프레임에서의 데이터 평균값인거죠?
    이를 토대로 평균값(x_new)을 다시구하는거고...이는 다음프레임에서 x_old가 되는거죠?

    (그리고 논외일수도있지만 트래킹과 디텍션의 차이가 무엇일가요?) --> http://darkpgmr.tistory.com/65 포스팅을 이미해놓셨군요 ㅎㅎ

    • BlogIcon 다크pgmr 2016.05.19 21:20 신고 수정/삭제

      x는 데이터이긴 한데 구체적으로는 영상 픽셀좌표입니다. 그리고 x_old는 이전프레임에서의 윈도우의 중심 좌표, x_new는 갱신된 윈도우 중심좌표입니다. 트래킹과 디텍션의 차이는 예전에 블로그에 글로 올린게 있는데, 그 글을 보시면 좋을 것 같습니다 (http://darkpgmr.tistory.com/136)

  • BlogIcon 안도균 2016.07.19 08:04 ADDR 수정/삭제 답글

    다크 선생님 한번 뵙고싶슴니다 저는 전공자가 아니고요 자문좀구하고 싶네요 저는cctv 여멉하고잇슴니다

    • BlogIcon 다크pgmr 2016.07.19 13:48 신고 수정/삭제

      죄송합니다만 자문이나 업무적인 도움은 시간 여건상 드리기가 힘듭니다. 혹 문의 사항이 있으실 경우 블로그 댓글을 이용해 주시고 공개가 힘든 경우에는 이메일을 부탁드립니다. 문제해결에는 도움을 드리지 못하더라도 간단한 질의 응답에 대해서는 제가 아는 범위에서는 답변을 드리고 있습니다.

  • BlogIcon 안도균 2016.07.19 08:05 ADDR 수정/삭제 답글

    연락 01089779302

  • 상자2 2016.09.27 15:17 ADDR 수정/삭제 답글

    안녕하세요. 다크프로그래머님

    항상 글 잘 보고있습니다.

    위에서 모델 갱신 문제(Model Update) 에 대해서 댓글 남겨주신걸 봤는데요
    혹시 Visual Tracking : An Experimental Survey 논문 (IEEE PAMI)에서 트래커들을 5가지로 구분하는데 그걸 보고 말씀해주신 것인가요?

    Tracking Using Matching
    Tracking Using Matching with Extended Appearance Model
    Tracking Using Matching with Constraints
    Tracking Using Discriminative Classification
    Tracking Using Discriminative Classification with Constraints

    이렇게 나누는것이

    모델을 아예 바꾸지 않는 방법
    현재 이미지에서의 값으로 모델을 계속 바꾸는 방법
    기존 모델과 현재 이미지에서 추출된 모델의 가중 평균을 새로운 모델로 삼는 방법
    초기 모델과 현재 이미지(또는 최근 n개의 이미지)에서 추출된 모델의 가중 평균을 모델로 삼는 방법

    등등 과 유사해서 궁금사항이 있어서 질문 드립니다
    3.Tracking Using Matching with Constraints (TMC, ACT 등)
    4.Tracking Using Discriminative Classification (TLD,MIT 등)
    나머지는 왜 구분했는지 이해가 되는데, 위 두개는 대략적으로 어떻게 트래커들을 분류했는지 제가 초보라 논문을 읽고있는데도 이해가 안되네요. 논문을 읽어보면 3번은 모델을 그대로 사용하는 것이 아니라 여러가지 패치로 변경하여 패치를 업데이트 하면서 트래킹을 수행하는 방법론이라고 써있기는 한데 왜 Constraints라는 단어를 사용했는지.. 제가 이해한것이 맞는지..알다가도 모르겠습니다.

    다크프로그래머님! 혜안을 주십시오!

    • BlogIcon 다크pgmr 2016.09.28 10:15 신고 수정/삭제

      안녕하세요. 좋은 질문입니다. 다만 몇가지 개념적 이해가 선행되어야 하기에 설명이 쉽지는 않습니다. 먼저 matching(1~3)주어진 객체모델과 입력 이미지와의 유사도를 계산해서 추적하는 방식이고 4,5번 discriminative 방법은 object/nonobject를 구분할 수 있는 classifier를 학습시켜서 물체를 찾는 방식입니다. SVM(support vector machine) 등을 이용해서 물체 샘플들과 비물체(nonobject) 샘플들로부터 추출된 특징들을 이용해서 둘 사이를 구분지을 수 있는 분류기(classifier)를 학습하여 적용하는 방식이 discriminative 방식입니다. discriminative 방식과 generative 방식의 개념적 차이에 대해 공부해 보시면 도움이 됩니다. 그리고 1,2,3은 객체모델(object model)을 어떻게 만들것인가의 차이인데 1은 하나의 best한 단일모델을 사용하는 방식이고 2는 하나의 단일모델이 아니라 과거의 물체의 변화를 모두 커버할 수 있는 형태의 객체모델을 만들어 사용하겠다는 의미입니다. 그리고 3은 2의 방식을 사용하되 그 모델의 표현에 있어서 sparse representation을 적용한 방법을 말합니다. sparse representation은 데이터의 표현이 최대한 sparse하게 만드는 base들의 조합으로 데이터를 표현하는 것인데, 객체모델을 이러한 base들에 의해 생성되는 부분 공간 내부로 제한했기 때문에 constraint란 용어를 사용한 것으로 보입니다 (sparse representation에 대한 공부 및 이해가 필요합니다). 4는 discriminant classification이란 용어를 이해하면 됩니다 (discriminant vs. generative 차이점에 대한 공부 필요합니다). 간단히 설명하면 추적하면서 얻어진 물체샘플들과 물체가 아닌 배경샘플들을 이용해서 분류기를 학습하고 학습된 분류기를 이용해서 입력 영상에서 각각의 윈도우 위치에 대한 분류기 score 계산, 최대 score 지점으로 물체를 찾는 방식입니다. 5는 4의 분류기를 학습시키는 과정에서 부가적인 constraint를 가한 것인데, 분류기의 score 출력이 kernel 함수 형태(물체 중심 위치에서 peak, 주변으로 갈수록 값이 작아지도록, Gaussian kernel 등)로 나오도록 분류기를 학습시키는 것입니다. 최근 tracker들 중 각광을 받고 있는 struct, kcf, samf 등이 모두 5번째 부류에 속합니다.

    • 상자2 2016.09.28 16:08 수정/삭제

      이해가 됬습니다. 정말 좋은 답변 감사드립니다. 공부 방향도 설정해 주시니 더할나위 없네요. 항상 고맙습니다.

  • 선생님의충신 2016.11.09 01:58 ADDR 수정/삭제 답글

    선생님 언제나 포스팅 감사하게 보고 있습니다.

    최근에 mean shift embedded particle filter 를 공부하고있습니다 (해야만하는..)

    particle filter tracking 이 어찌 진행되며, mean shift 와는 어지 결합하는지 아에 전체적인 그림을못그리겠습니다. ㅠㅠ 혹시 선생님 MS embedded PF 를 포스팅 하실 생각은 없으신지요 ㅠㅠ

  • ㅇㅇㅇ 2017.06.06 20:21 ADDR 수정/삭제 답글

    안녕하세요? Mean shift 에 관하여 알려주셔서 정말 감사합니다. 한가지 질문이 있는 데 위에서 윈도우 중심을 무게 중심이(Peak 점)으로 생각해도 되겠습니까?

    • BlogIcon 다크pgmr 2017.06.06 22:14 신고 수정/삭제

      네, 맞습니다.

    • ㅇㅇㅇ 2017.06.07 20:21 수정/삭제

      네~ 감사합니다~

  • 바이블맨 2017.08.21 01:03 ADDR 수정/삭제 답글

    안녕하세요^^
    정말 좋은 글 진심으로 감사 드립니다.
    한가지 궁금한 점이 있어서 질문을 남깁니다.
    실제 프로그램을 테스트 해 보면
    어떤 오브젝트를 트래킹 하다가 그 오브젝트를 놓치면
    트랙킹이 하는 상자가 없어지는게 아니라 주변에 가장 근접한 오브젝트로
    옮겨 간 뒤에 계속 트랙킹을 합니다.
    예를 들어서 얼굴을 트랙킹 하는 중인데 얼굴이 사라지면
    그 얼굴을 트래킹 하던 박스는 그냥 남아 있습니다.
    오브젝트가 사라졌다는걸 인식 하는 방법도 따로 있는지 궁금합니다.
    감사합니다.

    • BlogIcon 다크pgmr 2017.08.21 08:57 신고 수정/삭제

      안녕하세요. tracking을 할 때에는 입력영상에 대해 현재의 물체모델(object model)과 어떤 식으로든 유사도를 계산하고 그 유사도가 가장 높은 지점으로 물체를 추적하게 됩니다. 따라서, 그 유사도에 임계치(threshold)를 주어서 가장 높은 유사도 지점이 미리 정의된 임계치 이하일 경우에는 tracking에 실패한 것으로 간주하는 것이 가능합니다. 하지만 추적실패 기능을 추가하게 되면 물체의 급격한 변화로 인해서 유사도가 낮아진 경우에도 이를 실패로 간주할 수 있기 때문에 정상적인 추적 성능이 저하될 수 있습니다. 모든 문제에는 항상 trade-off가 있기 때문에 응용이나 목적에 따라서 적절한 선택을 하시기 바랍니다.

  • 순두부 2017.08.27 22:34 ADDR 수정/삭제 답글

    안녕하세요. 블로그를 통해서 많이 배우고 있습니다. 감사합니다.
    back projection이 이해가 안가는 부분이 있어서 질문하려고합니다.

    w(I(x, y)) = Hm(I(x,y))로 표현할 수 있는데, Hm()은 model histogram, I(x, y)는 input image의 하나의 pixel에서의 색상 값이다. 즉, I(x, y)에서 갖는 값이 model histogram에 얼마나 포함되는지 알 수 있다.

    하지만, 보편적으로 w(I(x, y)) = sqrt(Hm(I(x, y)/ Hi(I(x ,y))로 표현한다. 선생님은 이 과정을 w(x)값이 일정하게 높은 값을 갖는다고 하시는데 이것이 이해가 안갑니다. 일반적으로 나누기 연산은 분모가 1보다 작지않다면 값이 작아집니다. 또한, Hi(I(x, y)는 0일 수 도있지만 1보다 작거나 음수 일이 없다.

    제가 이해한 바로는 만약 Hm(I(a, b)) = 32이고 Hi(I(a, b) =256이라고 가정하자. 즉, I(a, b)(빨간색이라고 생각하자)는 model histogram과 imput image histogram 모두 높은 값을 갖는다. 전자의 w(I(x, y)경우는 대부분의 input image에서 높은 신뢰도를 반환해주는 반면 후자w(I(x, y)의 경우 낮은 신뢰도를 반환해줄 것이다. 즉, 전자의 w(I(a, b) =32, 후자의 w(I(a, b)) = 1/8

    그리고 I(c, d)는 파란색이라고 생각하자. Hm(I(c, d) = 5이고 Hi(I(c, d) = 5라면 전자의 w(I(c, d) = 5, 후자의 w(I(c, d)) = 1이다. 즉, 후자의 경우가 색상유사도를 좀 더 잘 표현할 수 있다.

    제가 이해한게 맞나요??

    • BlogIcon 다크pgmr 2017.08.28 16:35 신고 수정/삭제

      안녕하세요. 사실 순두부님이 말씀하신 내용을 제가 다 이해한 것은 아니라서 뭐라 말씀드리기가 힘든데요... 어쨌든 Hm은 어떤 색이 물체를 구성하는 색들 중 몇 %를 차지하는가를 나타냅니다. 따라서, 어떤 색이 물체색인지 아닌지(배경색인지)를 나타내는 확률은 표현하지 못합니다. 예를 들어, 빨간색 10%, 파란색 90%로 이루어진 물체가 있다면 파란색과 빨간색 모두 물체의 색임에도 불구하고 Hm(빨) = 0.1, Hm(파) = 0.9로 큰 차이가 발생합니다. Hi(물체+물체주변배경 영역에서 구한 히스토그램 모델)로 나누어주는 이유는 이러한 문제를 어느 정도 완화시키기 위해서입니다.

    • BlogIcon 다크pgmr 2017.08.28 16:41 신고 수정/삭제

      이 글을 쓸 때만 하더라도, P(물체색) = Hm/Hi로 계산하는 방법을 설명했지만 (나중에 알게 된) 사실 더 좋은 방법은 베이지언 확률을 이용하는 것입니다. 물체영역에서 구한 색상모델 Hm, 물체 주변의 배경영역에서 구한 색상모델 Hb가 있다면, 어떤 색이 물체색일 확률은 P(x) = Hm(x) / (Hm(x) + Hb(x))와 같이 계산할 수 있습니다. 그리고 P(x) > 0.5이면 물체색으로 간주할 수 있습니다.

  • 공돌이 2017.09.05 21:10 ADDR 수정/삭제 답글

    안녕하십니까, 항상 블로그에서 많이 배워가고 있습니다. 감사합니다.

    질문이 하나 있어서 댓글 남깁니다!
    Object tracking은 동영상 이전 프레임의 추적 정보를 사용해 다음 프레임에서 위치를 쫓아가는 그런 방식으로 이해를 했는데, mean shift를 보면 색상 histogram을 feature로 이용해서 이미지 내에서 원하는 Object detection처럼 이해가 됩니다.
    제가 이해한 것이 맞는지 알려주실 수 있으신지요.

    • BlogIcon 다크pgmr 2017.09.06 00:08 신고 수정/삭제

      네, tracking도 결국 detection 문제로 볼 수 있습니다. 그래서 tracking by detection이란 말도 있습니다. detection 문제나 tracking 문제나 모두 object model을 이용해서 물체를 찾는 것인데, object model을 미리 학습을 통해서 만드느냐 (detection) 아니면 초기 프레임으로부터 추적을 하면서 만드느냐의 (tracking) 차이일 뿐입니다. 또한 tracking 에서는 추적 대상의 공간적, 시간적 유사성(coherence)를 이용할 수 있다는 점도 차이점입니다.

  • vision은처음 2017.09.08 17:38 ADDR 수정/삭제 답글

    사소하지만, 그림에서 오타가 있네요. Bhattachayya (본문) -> Bhattacharyya (수정)

    • BlogIcon 다크pgmr 2017.09.08 21:59 신고 수정/삭제

      네 감사합니다. 그런데 하필 잘못된 부분이 그림이네요.. ㅋ