세상을 놀라게 하자!

문제 정의 :Computer vision의 경우 본문

Technical writing/Computer vision

문제 정의 :Computer vision의 경우

유진호 2010. 9. 26. 03:34

 일반적으로 Computer vision을 하다보면 Pattern recognization에서 사용하는 방법들을 많이 사용하게 됩니다.  그런데 '조금' 다릅니다. 때론 '많이' 다르게 해야 합니다. 어떤 이유 때문일까요?

 일반적으로 두 서너개의 집합이 있고 이에 대한 분류를 하라고 하면 Pattern recognition쪽을 하신 분들은 자연스럽게 K-Mean Clustering을 찾게 됩니다. 그런데 이것이 늘 맞을까요? 아시는 분들은 알겠지만 최소한 mean이 몇개가 어디에 있을 것이라는 것을 정해주어야만 가능하기 때문에 이것을 어떻게 정하느냐에 따라 많은 차이를 나타냅니다. 늘 맞지 않는다는 이야깁니다.

  그럼 이런 분류 방식을 Computer vision에 적용해보지요. 예컨데  Thresholding같이 일반 이미지를 이진 이미지 ( Binary image )로 만든다고 합시다. 일반적으로 이것을 하기 위해서는 '최적화'된 threshold값을 정하기 위한 여러 방법이 있습니다. 하지만 늘 이게 맞지 않습니다. 예컨데 2개이상의 다른 영상의 특성( 예컨데 색상과 채도)을 가지고 thresholding을 해야 하는데 밝기값 하나만 가지고 하겠다고 이리 하고 저리하면  답은 안나오는 것이지요.  이런 예로  Otsu's algorithm이 있습니다. 이 방법은 '형태를 잘 지켜주는' threshold방식 입니다. 실제 알고리즘을 보면 알겠지만 결국 방법은 2개의 Mean을 가지고 있는 Clustering으로 봐도 유사할 정도입니다. 하지만 이것도 '늘' 되는 것은 아닙니다. 예컨데 이런 방식으로 Chromakey 기법으로 배경 분리를 할 수는 없습니다. '색상'요소를 사용하지 않기 때문입니다.

  '그럼 Pattern recognition 배워봤자 쓸모 없나?'라는 생각을 하시나요? 그건 오해입니다. Pattern분류 기법들은 '일반적인'아이디어들을 알려줍니다. Computer vision 연구자들은 이것을 '어떻게 적용할 지를 선택'해야 합니다. 이것을 영상의 이해에 사용하는게 Computer vision이지요. (물론 Pattern 분류 안쓰는 방법들도 있습니다. )

 이를 위해 제일 먼저 할 일은 역시 '문제 파악'입니다. 내가 해결해야 하는 문제가 뭔가 정의가 안내려지거나 어려운 상태라면 이를 쉽게 접근하기 힘들 것입니다.

 최근에 저는 Background substraction문제를 해결중입니다. 그래서 이에 대한 연구자료들을 모으다 보니 재미있는 사실을 발견할 수 있었습니다. 모든 방법들은 '배경'을 어떻게 학습할 것인가를 연구했었습니다.  이를 위해 처음에 제일 먼저 접근한 것은 Average, median등을 이용한 '간단한' 수치적 접근이었습니다. 그러다 Mixture of Gaussian같은 조금 복잡한 통계적인 방법으로 모델링을 시작합니다. 그러다가 Mean-Shift라든가 Eigenbackgrounds같은 조금 더 Pattern분류적인 방법을 사용하기 시작했습니다.

 그러다 이 모든 방법을 좀 뒤집은 방식이 나왔습니다. 바로 Codebook을 이용한 방식입니다. 간단히 설명하자면 배경화면들에 대한 변화에 대해 codebook을 이용해서 작성을 하고 이것들과 모든 pixel들을 비교하는 방식입니다. 정확도가 어느정도일까 했는데 Learning OpenCV책에서 이에 대한 '변형된' 구현을 제공해서 보여준 것을 봤는데 그럭저럭 괜찮은 방법이었습니다.

 결국, 처음에는 '수학적인 분류'에서 시작해서 진행이 되던 연구가 '프로그래밍'적인 방식으로 바뀐 것입니다. 실제 Codebook을 이용한 방식의 1번 저자인 김경남씨의 경우 오래전부터 전문 프로그래머로 계속 일을 해오시던 분이셨지요. 아마도 이런 분들에게는 수학모델을 복잡하게 만드는 것 보다는 알고리즘을 정교하게 작성하는게 더 쉬우셨을 겁니다. 문제를 수학모델에서 알고리즘으로 바꾸는 패턴들이 의외로 Computer vision이 실용화되는 단계에서는 많이 보입니다. 이것은 실제 구현단계에서 수학모델에서 해결할 수 없는 문제들을 만나게 되고 이럴 때 이를 해결하기 위해 고민하는 와중에서 나오는게 아닌가 싶습니다. 

 '문제를 잘 정의' 하는 것은 그래서 도움이 됩니다. 그리고 이 '문제'를 정의하는 일반적인 연습 역시 중요합니다. 예컨데 자료구조를 우리가 배우고 연습했던 이유는 이것들이 더 많은 문제들의 '단서'를 제공해 주기 때문입니다. Pattern 인식 역시 그렇습니다.  분류방식을 하나 배웠다면 이를 '다양하게' 사용하는 연습은 필요하다는 거지요.

 이를 위해 더 많은 연습이 필요할 것입니다. Software engineer가운데는 
Code Kata같은 '문제집'을 보는 사람들이 있습니다. 이 Blog의 운영자인 Dave Thomas는 이런 내용을 올려놓은 것에 대해 이렇게 질문하고 있습니다.
"How do you get to be a great musician? It helps to know the theory, and to understand the mechanics of your instrument. It helps to have talent. But ultimately, greatness comes from practicing; applying the theory over and over again, using feedback to get better every time. "

"어떻게 위대한 음악가가 될 수 있을까? 이론을 알고 악기가 소리내는 방식을 아는 것이 도움이 된다. 재능이 있는 것도 도움이 되겠지만 절대적으로 위대함은 연습에서 오는데 이것은 이론을 계속해서 적용하며 매번 더 나아지기 위해 타인의 반응을 이용하는 것이다."

- Code Kata Blog에서 인용. 유진호가 번역함.
 
 Computer vision 연구자들은 어떻게 하는게 좋을까요? 이런책도 의외로 도움이 되긴 합니다. 하지만 개인적으로 Computer Vision Kata같은 문제집을 여럿이 같이 만들어서 '수련하기 쉽게'하는 것을 고민 중입니다.  
 
 무언가 조금씩, 조금씩 쌓아가면 뭔가 되겠지요? 다만 그 방법이 지나치게 우직하기만 한게 좋은 것은 아니라 고민이 됩니다. 하지만 '고민'도 안하면 아무것도 되지 않겠지요.
 

Comments