검색결과 리스트
글
영상추적 프로그램(DTracker)
최근 몇년간 개인적으로 가장 많은 시간을 들여서 연구했던 것이 영상추적 알고리즘입니다. OpenCV meanshift / camshift를 이용한 추적 프로그램 예제코드와 그동안 제가 개발했던 영상추적기(실행파일만)를 순서대로 올립니다.
1. OpenCV의 MeanShift / CamShift 추적기
처음 영상추적 개발을 시작하면서 저도 가장 기본적이라고 할 수 있는 meanshift부터 시작했습니다. 당시에 직접 meanshift를 구현하여 돌려보았지만 성능이 그다지 만족스럽지는 않았습니다.
블로그에 올릴 목적으로 최근 OpenCV에서 제공하는 meanshift, camshift를 이용한 영상 추적기를 새로 구현해 보았습니다. 아래의 프로그램을 이용하면 meanshift, camshift 추적기의 사용법 및 성능, 장단점에 대해 쉽게 테스트할 수 있습니다 (소스코드 포함).
사용법: 위 화면에 보는 것처럼 camshift 알고리즘, meanshift 알고리즘을 선택할 수 있고 사용할 색상모델을 선택할 수 있게 되어 있습니다. 마우스로 추적할 박스영역을 그리면 되고 스페이스바를 누르면 일시멈춤이 됩니다. 실행도중 언제든지 추적대상을 바꿀 수 있습니다.
OpenCV에서 제공하는 샘플코드 등에는 단일채널(hue, gray 등) 히스토그램만을 이용한 예가 나와 있지만 실제로는 HSV나 RGB의 3D 채널을 모두 이용할 경우에 추적 성능이 훨씬 좋습니다. 그 구체적인 방법에 대해서는 첨부 파일에 있는 소스코드를 참조하기 바랍니다.
다음은 위 프로그램을 적용한 데모 동영상들입니다 (OpenCV에서 제공하는 기본적인 tracker 들로서 일반적인 성능은 좋지 않습니다. 어떤 면이 강하고 또 어떤 경우에 잘 안되는지 아래 동영상들을 보면서 확인하시기 바랍니다).
opencv camshift demo - hsv 3d color model
opencv meanshift demo - rgb 3d color model
opencv meanshift demo - rgb 3d color model
실제 테스트를 해 보면 알겠지만 camshift의 경우 크기, 회전 변화를 추적할 수 있으며 특히 사람 얼굴을 추적하는데에 매우 뛰어난 성능을 보입니다. 하지만 camshift는 물체가 단일색일 경우 그리고 배경과 구분되는 색일 경우의 성능은 매우 뛰어나지만 물체에 여러 색상이 섞여있거나 배경과 유사한 색일 경우에는 오히려 meanshift보다 성능이 떨어집니다
meanshift나 camshift 모두 색상 히스토그램을 이용한 추적 방식이기 때문에 이에 따른 장단점은 명확합니다. 히스토그램의 특성상 위치정보는 고려하지 않기 때문에 물체의 형태가 변해도 추적이 가능한 반면, 다른 한편으로는 색이 배치된 위치정보를 잃어버리기 때문에 물체의 색 구성이 배경과 유사한 경우에는 추적에 실패하기 쉽습니다.
결론적으로 meanshift/camshift 등은 단순한 환경(공장자동화 응용, 배경도 단색, 물체도 단색)에서는 최고의 tracker이지만 일반적인 환경에서는 거의 적용이 힘들다고 볼 수 있습니다.
2. DTracker Ver.1 (히스토그램 기반)
처음에 시도해 보았던 meanshift가 일반적인 환경에서는 성능이 너무 떨어졌기에 이를 개선하고자 당시 여러 시도를 해 보았었는데 그 때 개발한 영상추적기가 dtracker v1입니다. meanshift와 마찬가지로 색상 히스토그램을 이용합니다만 meanshift보다는 훨씬 성능이 뛰어납니다. 사용한 색상 모델은 RGB 3D 모델입니다 (실행파일 첨부: 소스코드는 포함되지 않음).
특징은 meanshift로 추적 가능한 것은 모두 추적할 수 있으며 배경이 유사한 경우에도 어느정도 추적이 가능합니다. 특히 서서 걸어가는 보행자를 추적할 때 성능이 좋은 편입니다. 그레이/칼라 영상 모두 가능하며 처리속도는 i7기준으로 200 ~ 1,000 fps 정도입니다.
다음은 dtracker v1 추적기를 적용한 데모 동영상들입니다.
dtracker(histogram) demo1
dtracker(histogram) demo2
dtracker(histogram) demo3
dtracker(histogram) demo4
dtracker(histogram) demo5
dtracker(histogram) demo6
3. DTracker Ver2 (Optical Flow 기반)
처음 개발했던 히스토그램 기반의 dtracker v1는 물체의 크기변화는 추적하지 못하며 다른 물체에 의해 가려지는 경우 추적 성능이 떨어지는 문제가 있었습니다 (예: 위 dtracker v1 데모동영상 6). 이러한 단점을 개선하고자 개발한 것이 dtracker v2인데 dtracker v2에서는 기존 히스토그램 방식을 버리고 optical flow 방식을 사용하였습니다 (테스트용 실행파일 첨부: 소스코드는 포함되지 않음).
특징은 추적 대상의 크기변화, 회전변화를 추적할 수 있으며 부분적으로 가려지는 경우에도 추적이 가능합니다. 또한 추적 도중 흔들림이 거의 없고 초기 설정한 추적 영역을 정확하게 추적할 수 있습니다. 그레이/칼라 영상 모두 가능하며 처리속도는 i7 기준으로 40 ~ 300 fps 정도입니다.
다음은 dtracker v2 추적기를 적용한 데모 동영상들입니다.
dtracker(optical flow) demo1
dtracker(optical flow) demo2
dtracker(optical flow) demo3
dtracker(optical flow) demo4
dtracker(optical flow) demo5
4. 향후 개발할 tracker
1차 목표는 현재 개발된 히스토그램 방식과 optical flow 방식을 결합하는 것입니다. 형태가 고정된 물체의 경우 optical flow 방식이 훨씬 좋은 성능을 내지만 사람 등과 같이 형태가 변하는 경우에는 히스토그램 방식이 더 뛰어날 때가 많습니다. 각각의 장단점이 있으므로 이들 장점을 잘 결합하는게 1차 목표입니다.
2차 목표는 detector 기능을 추가하는 것입니다. 현재까지 개발한 tracker들은 detector 기능이 없습니다. 그래서 추적하던 물체가 완전히 사라졌다가 나타나는 경우에는 다시 복구하지 못하는 문제가 있습니다(예: dtracker v2 demo4). 개발한 tracker는 속도와 추적 정확도 면에서 기존 어떤 추적기와도 견줄 수 있지만 detector 기능이 없음으로 해서 요즘 나오는 tld tracker 등에 밀리고 있습니다. detection 기능만 보완되면 괜찮은 추적기가 완성될 것으로 생각합니다.
저의 궁극적인 목표는 추적할 대상 물체를 스스로 인식하고 그 경계까지 완벽하게 추적하는 것입니다. 예를 들어 초기에 물체의 정확한 영역이 아닌 배경까지 포함된 영역을 추적 대상으로 설정해 줘도 그 안에 포함된 실제 물체 영역만을 찾아내어 추적하는 추적기, 또는 초기에 물체의 일부 영역만 지정해줘도 알아서 전체 물체 영역을 식별하고 해당 물체를 추적해 주는 추적기를 개발하는 것입니다.
※ 동영상 출처
참고로 테스트에 사용한 동영상들의 원본 출처는 다음과 같습니다 (대부분 영상추적 분야에서 벤치마킹용으로 사용되는 공개 동영상들입니다).
[VTD] http://cv.snu.ac.kr/research/~vtd/
[FragT] http://www.cs.technion.ac.il/~amita/fragtrack/fragtrack.htm
[LOT] http://www.eng.tau.ac.il/~oron/LOT/LOT.html
[TLD] http://info.ee.surrey.ac.uk/Personal/Z.Kalal/tld.html
by 다크 프로그래머
'개발한 것들' 카테고리의 다른 글
카메라 캘리브레이션 프로그램 (DarkCamCalibrator) (148) | 2014.07.17 |
---|---|
영상추적 프로그램(DTracker) (210) | 2013.11.29 |
Ferns Detector (18) | 2013.08.28 |
가상 3D 영상 생성 프로그램 (16) | 2013.08.01 |
설정
트랙백
댓글
- 이전 댓글 더보기
-
한세경 2017.06.15 09:04
좋은 내용입니다. 언뜻 드는 생각인데
생물의 인지방식과 비슷하게 신경망 등과 결합해서 Context 기반의 인지를 하면 성능이 더 올라갈 수 있지않을까 하는 생각이 드네요. 대략적인 아이디어입니다만 단일 객체뿐 아니라 전체 배경에서 각각의 오브젝트를 인지하고 그들과의 상호관계(일종의 context 인식)까지 고려한 추적방식이 도움이 되지 않을려나 싶습니다. 특히 물체가 사라졌다 나타난다던가 원래의 비주얼한 특성을 많이 잃어버렸을때요. 그렇게 하기 위해 신경망 등하고 연계하면 어떨까 싶어요^^
개인적으로 다크 프로그래머님이 지금 어디서 므슨 일을 하시는지 궁금해졌네요 ㅎㅎ -
다크님 안녕하세요 지나가다 신기해서 보게 되었는데, 성능평가는 어떻게 할 수 있나요?? 추적이 몇 % 좋아 졌다 이런 수치를 알 수 있나요??? 신기해서 보다보니 급 생각나서요
-
다크pgmr 2017.07.13 10:47 신고
안녕하세요. 성능평가는 보통 정확도와 추적 지속성(실패율)을 가지고 합니다. 정확도는 추적한 결과와 ground truth(정답)와의 오버랩 정도 또는 중심거리를 가지고 측정하고 지속성은 타겟을 놓치지 않고 얼마나 오랫동안 추적할 수 있는지를 평가합니다. 예를 들어 ground truth와의 오버랩(overlap)이 0이 되면 타겟을 놓친 것으로 간주할 수 있고, 타겟을 놓칠 때마다 대상을 다시 초기화 시켜 준다고 했을 때 초기화 횟수가 많을수록 지속성이 떨어진다고 평가할 수 있습니다.
-
-
안녕하세요.
항상 공부하는데 정말 큰 도움이 됐습니다. 감사합니다!
이번 실행파일에서 3번옵션으로 avi 영상을 주면 프로그램이 바로 죽어버리는데 코덱문제일까요? -
안녕하세요. 최근 OpenCV 프로젝트를 진행하며 많이 참고하고 있습니다.
오늘은 트랙킹 관련 질문이 있어서 찾아 뵀는데요,
혹시 처음부터 ROI를 설정하고 그 영역을 추적하는 것이 아니라,
정지된 영상에서 움직이는 물체가 등장하면 그 물체를 자동으로 감지해 추적하게 하려면
어떤 방식으로 해야하는 지가 궁금합니다. 만약 참고할 만한 내용을 알고 계시다면 알려주시면
정말 감사할 것 같습니다 :) -
안녕하세요 다크님. 기존에 올려주신 소스코드를 토대로 프로그램을 빌드 해 보았습니다.
따로 HOGcascade를 만들고, 또 Opencv에 기본적으로 있는 HOGcascade를 이용해서 보행자 추적을 돌려보았는데, 연산프레임이 1~2fps로 매우 느리게 동작합니다.
double fps = freq / double(finish - start + 1 이 부분인지 gr_thr 부분인지..
따로 프레임을 설정할 수 있는 코드가 어느 부분인지 모르겠어서 여쭙고자 합니다. -
안녕하세요 저는 휴먼ict에서 어플 기획을 하고 있는 학생입니다.
OpenCV를 이용하여 핸드폰으로 사람들의 모션을 인식하여 운동 자세를 교정해주는 어플을 만드려고 하는데요. 기술적으로 구현이 가능한 테스크인지 가장 궁금합니다.
만약 가능하다면 인식률이 올라가도록 푸른 천을 뒤에 대서 촬영을 할 생각입니다.
그리고 자세 교정의 기반이 되는 템플릿을 제작하여 이용자의 자세를 비교하도록 할 수 있는 것인가요?? -
카메라에 촬영된 대상의 feature을 잡아낸 후, 대상이 움직였을때 ransack을 feature의 이동을 나타내는 벡터를 구한 후, 움직임을 보정해주는 작업을 하려고 하는데요,,, 혹시 opencv 라이브러리에서 추천해주실만한 것들이 있나요? 영상처리쪽이 완전 처음이다보니 도움이 필요합니다.
-
안녕하세요 포스팅 보면서 재미있게 공부하고 있는 학생입니다.
opencv3.2를 사용중인데 Meanshift와 Camshift함수를 찾을수 없다고 뜨는데 왜 그런지 못찾아서 여쭙습니다... 왜그럴까요 ㅠㅠ -
제가 아직 초짜라 그런데 window 환경에서 visualstudio 2015ver를 사용하고 있거든요...
opencv extra 모듈은 https://github.com/Itseez/opencv_contrib에서 다운받고 어찌진행하면될까요...죄송합니다 ㅠ
-
다크pgmr 2018.03.16 00:45 신고
Hunie님, opencv 메인 모듈과 extra 모듈을 합쳐서 다시 build한 후에 사용해야 합니다.
https://github.com/Itseez/opencv_contrib 사이트에 가시면(페이지 아래쪽으로 스크롤해 보세요) extra 모듈을 어떻게 연결해서 사용하는지 설명이 나와 있습니다.
하지만 opencv를 빌드하는 것이 알면 쉽지만 처음에는 쉬운 일은 아닙니다. 처음 시작할 때에는 하나씩 검색해 가면서 해결하는 수밖에 없습니다. 제 블로그에도 "http://darkpgmr.tistory.com/category/프로그래밍"에 보면 몇 가지 관련 글들이 있으니 참고하시면 좋을 듯 싶습니다.
-
-
안녕하세요!!
졸업프로젝트중인 영상처리 초보 대학생입니다.
항상 사이트에서 도움 많이 받고있습니다.
다름이아니라, 저희가 진행하는 프로젝트가 dtracker_v2와 유사해서
정말실례지만... 혹시 소스코드를 알려주실수 있나 궁금하여 여쭤보게되었습니다.
주신다면 절대 배포하거나 하지않고 저희들 한학기 프로젝트에 참고만 하겠습니다...
항상 감사드립니다! -
안녕하세요. 다크님 저는 졸업을 앞둔 학생으로
영상처리 프로젝트를 준비하던 중에 다크님의 포스팅을 통해 많이 배우게 되었습니다.
그런데 제가 아직 부족한 점이 많아 영상 처리에 대해서 혹시 질문 여쭤봐도 될까요?
제가 폰 카메라를 통한 수화 번역 프로젝트를 하려고 조사를 하고 있는데
다크님께서 다른 댓글의 답변으로
딥러닝을 통한 영상에서 사람의 모션을 인식하는 방식이 저사양에서 구현이 힘들다고 해주셨는데
그렇다면 혹시 저사양에서 구현 가능한 모션 인식 방법 한 가지 조언 해주실 수 있을까요?
또, 현재 손이 움직인 거리를 두 프레임 영상사이의 손 무게중심점 이동거리로 판단을 하려고
하는데 이 부분도 아무래도 문제가 될 거같아 보입니다.ㅜ 혹시 이 부분에 관해서도 조언 부탁드릴 수 있을까요? -
안녕하세요, 딥러닝 영상처리 분야를 공부하고 있는 사람입니다. 다크 프로그래머님의 블로그를 추천받아서 종종 방문하고 있습니다. 다름이 아니라, 본 포스팅과 '트래킹'이라는 부분에서 살짝 연관이 있는 질문을 하고자 댓글 올려봅니다.
위의 예시들에서 보여준 트래킹을 저는 광장에서 대규모 사람들의 움직임에 적용하고 싶은데, 그런 분석을 위해서는 어떤식으로 그 광장을 촬영 하는게 나중에 분석하기 좋은 데이터가 될지에 대한 팁 같은 자료가 있을까요?
그리고 위에서는 타겟 오브젝트가 움직일 때마다 같이 바운딩박스가 움직이는데, 저는 결과적으로 동선 패턴을 그리고 싶습니다. 그 박스의 history path 까지 화면에 남기거나 하는 예시에 대해서 아시는 바가 있는지 궁금합니다.
관련 링크나 검색 키워드 등 간단하게라도 아시는 내에서 공유해주시면 정말 감사하겠습니다! 좋은 하루 되세요! -
다크님. 안녕하세요.
질문이 있어서 댓글 남깁니다!
RGB 3d 정보를 이용한 컬러 히스토그램 추적기가 meanshift보다 성능이 높은 이유가 왜 일지 혹시 예측가능한 원인이 있으신가요?? -
안녕하세요. 영상처리를 이용한 게임 봇을 개발중입니다.
2차원 게임에서 화면상의 몬스터를 인식할려면 template matching을 이용한 방법밖에 없었는데, 메이플스토리 같은 2차원 게임에서 화면 내 몬스터 위치 추적은 어떤 방식으로 접근하는것이 좋을까요? 감사합니다. -
안녕하세요. 최근 컴퓨터비전쪽을 공부 하고 있습니다. dtracker v2를 보면 Optical flow를 사용 하고있는데, 기본적으로 opencv에서 사용되는 calcOpticalFlowPyrLK는 실시간 영상 렌더링이 거의 불가능해 보이는데 처리속도를 빠르게 할 수 있는 방법에 대해서 혹시 조언 해주실수 있을까요? 감사합니다.
-
안녕하세요 현재 졸업 논문으로 영상처리 관련해서 공부하고 있는 학부생입니다.
다크님 홈페이지를 통해 여러가지를 배웠는데 초보인 제게 정말 도움이 많이되었습니다.
다름이 아니라 혹시 이 dtracker로 물체의 변위를 알 수 있는 좌표를 얻을 수 있을까요?
제가 이번에 단순히 좌우로 흔들리는 물체를 영상으로 찍고 , 영상 속에서 물체의 변위를 측정하려고 하는데 어떤 프로그램을 써야할지 여러가지를 찾아보고 있는 데 잘 감이 안와서요 ㅠㅠ
혹시 dtracker에 이런 기능이 있거나 아니면 이런 기능이 있는 다른 프로그램을 추천해주실 수 있을까요? -
안녕하세요 포스팅 보고 많이 공부가 되었습니다!
영상에서도 볼 수 있듯 200~1000fps 까지 측정이 가능한것같은데 일반적인 chrono 함수 등으로는 100fps에만 가까워져도 값이 일정하게 나오지 않아 어떻게 하면 정밀하게 측정 할 수 있을지 질문드립니다! -
다크님 포스트 잘 보고 있습니다.
다크님의 meanshift / camshift 두가지 방법 모두 색상 또는 옵티컬플로로 트래킹을 하고 있는데
혹시, 1. 텍스쳐가 거의 없는 하얀상자(배경이 검은색)인 경우
2. 텍스쳐가 있는 상자(배경이 검은색)인 경우
에는 어떤 방법이 더욱 알맞을까요? -
다크pgmr님 본문에도 적혀 있어서 소스코드를 안준다는 것을 알고 있지만 혹시나 시간이 많이 지났는데 DTracker Ver.1의 RGB 3D를 이용하는 부분의 소스코드를 받을 수 있을까 해서 댓글 남깁니다. 객체추적관한 졸업작품을 준비하고 있는데 제 영상에서 DTracker Ver.1이 너무 추적이 잘 되어 실례인걸 알지만 물어봅니다.
소스코드가 안되면 RGB 3D 방식을 어떤 식으로 했는지 조금 구체적으로 알 수 있을까요??