[영상추적#2] TLD - 추적하면서 학습한다

영상처리 2013.05.16 18:01

영상 추적(visual tracking) 방법 중에 pn tracker라는게 있습니다. PN tracker는 현재 공개된 영상 추적 방법 중에서 가장 성능이 뛰어난 것으로 인정받는 tracker입니다.


PN tracker는 2010년 CVPR 학회에서 "P-N Learning: Bootstrapping Binary Classifiers by Structural Constraints"라는 제목의 논문으로 발표된 방법입니다. 참고로 CVPR(Computer Vision and Pattern Recognition)은 현재 컴퓨터 비전 분야에서 가장 저명한 국제 학회입니다. 또한 pn tracker는 이후 내용을 좀더 정리하여 2012년 PAMI에 "Tracking-Learning-Detection"라는 논문 제목으로 게제됩니다. 그래서 pn tracker를 tld tracker라고도 부릅니다.


PN tracker는 영국 Surrey 대학의 박사과정 학생인 Zdenek Kalal이 개발한 추적 알고리즘으로, Predator라는 이름으로 불리기도 합니다. Predator라는 이름은 영화 '프레데터'에서 나온 이름으로 pn tracker가 학습 능력을 가지고 있기 때문에 붙여진 이름이라고 합니다. 본인 스스로 붙였는지 아니면 주변에서 붙여 주었는지는 잘 모릅니다. Z. Kalal은 대학을 졸업 후 개발한 영상추적 기술을 가지고 TLD Vision이라는 회사를 세웠다고 합니다.


아래 동영상은 Z. Kalal이 2011년 유투브에 올린 동영상인데 영상추적 기술이 어떻게 활용될 수 있는지, 그리고 pn tracker가 얼마나 뛰어난지를 잘 보여주고 있습니다. 개인적으로도 영상추적 연구를 하는 한 사람으로서 꽤나 인상깊게 보았던 동영상입니다.



동영상 내용중에 손가락 세개를 모아서 마우스를 대체하는 장면이 있습니다. 제스쳐 인식이나 HCI(Human Computer Interaction)에 있어서 가장 어려운 문제중 하나가 바로 명령어의 시작과 끝이 어디인지를 구분하는 것입니다. 그런데, 동영상에 나오듯이 손가락 세개를 모으면 인터렉션이 시작되고 손가락을 때는 순간 해제가 되니 참 대단한 발상입니다.



TLD(Tracking-Learning-Detection) 추적 프레임워크


PN tracker가 뛰어난 이유는 TLD(Tracking-Learning-Detection)라는 새로운 추적 프레임워크를 제안했기 때문입니다. TLD는 말 그대로, 추적하면서 학습함으로써 detection이 가능한 추적기라는 의미입니다.


여기서 잠깐 detector와 tracker의 차이를 살펴보겠습니다.


detector(검출기)는 미리 알고있는(학습된) 대상을 입력 영상에서 찾을 수 있는 방법인데, 아무 영상이나 이미지 1장만 주어져도 대상을 찾을 수 있어야 합니다.


반면 tracker(추적기)는 일반적으로 동영상의 인접한 영상 프레임들 사이의 시간적, 공간적, 형태적 유사성을 이용하여 대상을 찾는 기술을 말합니다. 따라서, tracker는 과거의 추적 정보를 활용하여 현재의 대상을 찾기 때문에 한번 대상을 놓치면 다시 찾기 힘든 경우가 대부분입니다.


하지만 사실 tracking도 어떻게 보면 매 영상프레임마다 대상의 위치를 detect하는 것으로 볼 수도 있습니다. 이러한 추적 방식을 tracking by detection이라고 부르는데, 보는 관점에 따라서는 모든 tracker를 이렇게 볼 수도 있을 것입니다. 하지만 어쨌든 중요한 점은 tracker는 최근의 추적 정보를 활용하기 때문에 만일 대상의 크기, 형태, 위치 등이 급격히 변할 경우에는 실패할 확률이 매우 높아진다는 것이고 detector의 경우에는 미리 가능한 다양한 크기 및 형태에 대해 학습해 둠으로써 이미지 한장 한장에 대해서 검출이 가능해야 한다는 것입니다.


Detector와 tracker의 차이는 이 정도로 하고, pn tracker에서 사용된 TLD에 대해 알아보도록 하겠습니다.


PN tracker는 내부적으로 tracker와 detector를 동시에 운용합니다. tracker로는 optical flow tracker를 사용하고 detector로는 ferns를 사용합니다([영상처리] - Ferns를 이용한 영상 Object Detection 글 참조).

  1. 처음에 사용자가 추적할 대상 영역을 설정해 주면 tracker와 detector가 동시에 초기화가 됩니다. 이 때, detector의 경우에는 처음 입력 영상 영역 하나에 대해서만 학습이 되는 셈입니다.
  2. 이후 입력 영상이 들어오면 tracker로도 대상을 찾고, detector로도 대상을 찾습니다. 만일 tracker가 성공했다면 tracker로 찾는 윈도우(window) 영역이 detector의 학습 데이터로 활용되어 detector를 좀더 강력하게 해 줍니다. 뿐만 아니라, detector가 찾은 영역들 중에서 tracker 결과와 일치하지 않는 것들은 오검출로 분류되어 detector를 학습시키기 위한 negative example로 활용됩니다.
  3. 만일 tracker가 실패한 경우에는 detector가 성공할 때까지 기다렸다가, detector가 성공하면 검출된 위치로 tracker를 초기화하고 다시 추적을 시작하는 것입니다.


대략적인 TLD 원리는 위와 같지만, tracker가 실패했는지 여부를 판단하는 문제와 tracker와 detector중 어느 것을 더 믿어야 하는지 등 세부적인 내용에 대해서는 TLD 논문 내용을 참조하기 바랍니다.



기타 관련 정보


TLD 회사 홈페이지: http://tldvision.com/index.html

TLD 소스코드: https://github.com/zk00006/OpenTLD


위 웹사이트에 가면 TLD에 관련된 여러 설명 자료, 데모 동영상을 볼 수 있으며 Matlab 소스코드와 실행파일을 다운로드 받을 수 있습니다.


by 다크 프로그래머

  • 임용섭 2013.05.25 10:45 신고 ADDR 수정/삭제 답글

    알고리즘 성능이 무척 좋네요. 동영상 보고 많이 놀랐습니다.
    좋은 정보 감사드립니다.

    • BlogIcon 다크pgmr 2013.06.26 07:18 신고 수정/삭제

      추적 연구하는 사람들에게는 지표 혹은 넘어야 할 대상으로 삼기 좋은 방법입니다 ^^ (제 얘기임ㅜ.ㅜ)

  • 수제자 2013.06.25 17:41 신고 ADDR 수정/삭제 답글

    어매이징~! 오우썸~! 한 아티클입니다. ^^

  • BlogIcon 곰돌이만세 2013.06.28 10:12 신고 ADDR 수정/삭제 답글

    잘보고 갑니다. detecting과 tracking의 중간에 놓인 입장에서 대단하다는 말밖엔 할말이 없네요.
    좋은 포스팅 감사합니다.

    • BlogIcon 다크pgmr 2013.06.28 23:58 신고 수정/삭제

      저랑 비슷하시네요 ^^ 오랜만에 뵙습니다.

  • Furomand 2014.09.19 10:10 신고 ADDR 수정/삭제 답글

    뭐 자주 와서 보지만 오랜만에 댓글다는거 같네요 ㅎ

    저도 저거 보고 상당히 감명깊어서 내년에 연구할때 이용해보려고 생각하고 있습니다

    • BlogIcon 다크pgmr 2014.09.19 14:12 신고 수정/삭제

      네 오랜만이시네요^^. 저도 인상깊었던 동영상입니다. 외국 사람들 보면 연구도 잘하지만 포장도 잘하는 것 같습니다.

  • 실행관련 2015.06.30 11:23 신고 ADDR 수정/삭제 답글

    안녕하세요. TLD 사이트 설명대로 따라해서, 실행해보려고 하는데요. OpenCV2.2\\build64\\include에 보니까 opencv2 폴더 밖에 안보이더군요(설명글에는 opencv 폴더). 경로를 include = ' -iC:OpenCV2.2\\build64\\include -iC:OpenCV2.2\\build64\\include\\opencv2'; 이렇게 설정하고, compile.m 을 실행했더니 The destination directory "-iC:OpenCV2.2\\build64" cannot be found. eval(['mex lk.cpp -output' include lib]); 에서 에러(경로는 존재하는데 찾을 수 없다고 나와요.)가 나는데, 아시는 분 알려주시면 감사하겠습니다.

  • 일본외노자 2018.01.19 14:57 신고 ADDR 수정/삭제 답글

    안녕하세요.
    다크프로그래머님 블로그에서 이것저것 찾아보면서 공부하고 있는 CV 초짜 입니다.
    회사에서 새로운 기능을 만들어볼까 하는데 OpenCV 기능은 그럭저럭 실행할 수 있어도 저런 논문내용 같은건 너무 어렵네요. 어떻게 구현할지, 어떻게 적용할 지도 전혀 감을 못잡겠고.. ㅠㅠ
    여하튼 본문 내용에 대해서 말입니다만, 링크해주신 소스코드 페이지가 더이상 존재하지 않아서 찾아보니 저자가 GitHub에 새로 올려둔 모양입니다. (https://github.com/zk00006/OpenTLD)
    회사 페이지도 상기 링크는 존재하지 않네요. (http://tldvision.com/index.html)
    갱신해주시면 좋을 것 같습니다.
    계속 배우고 가겠습니다. 감사합니다.

    • BlogIcon 다크pgmr 2018.01.19 15:46 신고 수정/삭제

      감사합니다. 덕분에 링크를 잘 고쳤습니다. ^^
      요즘은 tld보다 뛰어난 추적기들이 많이 나와서 다른 기술들도 찾아보시면 좋을 것 같습니다. vot라는 영상추적분야 국제대회에 랭크된 추적기들을 보시면 좋을 듯 싶습니다 (http://www.votchallenge.net/vot2017/trackers.html). 코드가 공개된 tracker들에 대해서는 링크가 제공되고 있습니다.

    • 2018.01.19 16:03 수정/삭제

      비밀댓글입니다

    • BlogIcon 다크pgmr 2018.01.19 18:59 신고 수정/삭제

      네, meanshift도 어느 정도는 동작하겠지만 가장 기본적인 방법인만큼 다른 방법들도 테스트해 보시면 좋을 것 같습니다. opencv에도 여러 추적기들이 미리 구현 제공되고 있습니다. opencv에서 제공하는 추적 알고리즘들을 하나씩 테스트해 보시면서 적당한 알고리즘을 고르면 좋을 것 같습니다. 예를 들어 KCF도 한번 테스트해 보시기 바랍니다. 물론 어느정도 원하는 성능을 내기 위해서는 어느 경우나 알고리즘을 직접 건들지 않고는 거의 불가능합니다. GPU가 달려있다면 딥러닝쪽 방법들을 써도 됩니다만 그렇지 않다면 당연히 어렵습니다.