OpenCV 기본 잠시 OpenCV와 영상처리에 대해 정리를 해보고자 합니다. 아직 영상처리라는 것에 대해 막연하신 분들이 많을 텐데요. 영상을 잘 다루려면 배열과 행렬에 대해서 잘 알아야 합니다. 왜냐하면 영상이 곧 배열이기 때문이죠. 영상처리를 하다보면, 영상을 자르고 붙이고, 늘리고 줄이고 해야할 때가 많은데 배열을 잘 다루지 못하면 이런 작업이 매우 고되고 어려울 수 있습니다. 역으로 영상처리를 하면서 배열을 다루는 능력이 매우 발전할 수도 있습니다.
그 다음으로는 영상처리의 접근 방법이 될 수 있는데요. 거창하게 기계 학습이나 인공 지능 같은 것도 있지만, 간단한 사칙연산이나 이진화 등으로도 훌륭한 영상처리 프로그램을 만들 수 있습니다.
영상처리가 어려운 첫번째 이유는 3차원(동영상이면 시간까지 포함해서 4차원)으로 된 세계를 2차원에 투영한 영상이라는 단편적인 정보로 3차원 세계의 내용을 알아내야 하기 때문입니다. 같은 물건이라도 가까이에서 찍으면 크게 나오고, 멀리서 찍으면 작게 나오는데, 그것이 작거나 커서 그런 것인지, 가깝거나 멀어서 그런 것인지 알기 어렵기 때문이죠.
(오달수님 죄송합니다. ㅠㅠ)
두번째는 빛과 반사라는 물리적인 문제입니다. 우리가 눈으로 보는 세상은 빛의 근원인 광원이나 그 빛이 사물에 반사된 빛이 우리 눈에 들어온 것인데요. 가령 하얀 물건이 있을 때 빛의 밝기에 따라 다양한 회색이 되는데, 그 원래의 색상이 흰색인지 알기가 어렵다는 것입니다. 아래의 이미지를 한번 보시겠습니다.
우리에게는 지능이라는 것이 있어서 A는 검은색, B는 흰색이라는 것을 압니다. 하지만 위 이미지에서 A와 B의 색상 값은 같다고 나옵니다. 즉 우리는 당연히 다른 색이라고 인지하는데, 컴퓨터는 그런 능력이 없기 때문에 값만 비교하여 같은 색이라고 하는 것입니다.
영상 처리 기본적으로 사람이 영상에 대해서 분석하고 이해해서 해결책을 만드는 것입니다. 초보자들이 직접 만들 수 있는 것도 있고, 전문가들이 만든 라이브러리를 사용하는 경우도 있습니다. 사실 전문가도 만들기가 쉽지는 않습니다. 제대로 된 라이브러리를 만들어서 배포한 사람들은 전문가 중에서도 상당히 존경을 받는 수준이라고 할 수 있습니다.
Lucas와 Kanade 박사가 만든 영상내에서 변화와 움직임을 추적하는 Lucas-Kanade 알고리즘
영상에서 다른 부분과 구별되는 특이점을 찾고 매칭시켜주는 SIFT 알고리즘
기계 학습 영상 처리가 사람이 영상을 이해하고 분석해서 만든 알고리즘이라면, 기계 학습은 기계가 영상을 이해하고 분석하여 자체적으로 알고리즘을 만드는 것입니다. 대표적으로 뉴럴넷(인공신경망; Artificial Newral Network)라는 것이 있습니다. 기계에게 학습을 시키려면 먼저 학습시키고자 하는 영상에 대한 데이터 베이스가 있어야 합니다. 얼굴 인식을 하려면 다양한 상황에서 다양한 사람의 얼굴을 촬영한 이미지 데이터 베이스가 필요합니다. 그리고 이것들을 얼굴이 아닌 이미지들과 함께 뉴럴넷에 입력하면, 뉴럴넷이 알아서 어떻게 얼굴과 얼굴이 아닌 것들을 구별하는지 이해하고 학습합니다.
뉴럴넷의 구조와 이미지의 특징을 추출하여 얼굴 등을 인식하는 과정
기계 학습과 영상 처리의 차이를 둔다면, 서로의 장점이 단점이되고, 단점이 되게 됩니다. 영상 처리는 알고리즘의 하나하나를 사람이 이해하고 만들기 때문에 효율을 높일 수 있습니다. 단점으로는 사람이 이해를 할 뿐 아니라 논리/수학적으로 정리를 할 수 있어야 하기 때문에 만들기가 어렵고, 무엇보다 사람이 논리/수학적으로 정리할 수 없는 문제는 해결할 수 없다는 것입니다. 반대로 기계 학습은 당장 사람이 이해하고 정리할 수 없더라도 이미지 데이터 베이스만 있다면 누구나 쉽게 프로그램을 만들 수가 있습니다. 하지만 뉴럴넷은 자체 알고리즘을 이용해 시키는대로 분석을 할 뿐이지 그 실체는 잘 모르기 때문에 불필요한 분석도 많이 해서 효율성이 떨어지게 됩니다. 또한 성능을 높이기 위해 방대한 데이터 베이스를 수집해야 한다는 점 역시 단점이라고 할 수 있습니다.
그 효율성이 떨어지는 문제와 그 외에 아래 링크에 잠깐 정리되어 있는데, 뉴럴넷의 다층화와 고도화가 2006년도까지 해결이 안되어서, 학계에서 다소 외면을 받아왔었습니다.
http://blog.naver.com/roboholic84/221099591829
하지만, 컴퓨터 기술의 발전으로 이제 누구나 쉽게 GPU를 활용하거나 GPU가 장착된 서버를 대여해서(Google Cloud) 뉴럴넷을 사용하거나 개발할 수 있게 되었고, 뉴럴넷의 고도화도 해결되어서 이제는 점점 더 다양한 분야에서 뉴럴넷을 사용하고 있습니다. |