본문 바로가기

Research

이미지 세분화 (Image segmentation)

이미지를 세분화한다는 것은 이미지에 있는 픽셀들을 군집화하겠다는 의미이다. 이미지가 가지고 있는 특성으로 픽셀간의 거리와 픽셀값 그 자체가 있다. 일반적으로 인접한 픽셀끼리 군집화 하고 픽셀값이 비슷한 것끼리 군집화하는 것이 말이 된다. 예를 들어, 사자가 있는 이미지에서 세분화를 진행했을 때, 사자에 해당하는 픽셀들은 위치적으로 모여있을 것이고 대체로 색깔이 노랄 것이기 때문이다. 이처럼 이미지를 세분화 하는 것은 거리 정보도 고려해야 하기 때문에 일반적인 데이터를 세분화하는 것과는 살짝 다르다. 이 또한 딥러닝이 제일 잘하지만.. 이전에 사용되었던 클래식한 여러 알고리즘에 대해서 알아보자.

분수령 알고리즘 (Watershed algorithm)

이미지의 픽셀 하나하나를 높이라고 생각해보자. 그러면 이미지를 조감도의 형태로 볼 수 있을 것이다. 일반적으로 이미지의 픽셀은 부드럽게 표현된다. 그 이유는 인접한 픽셀끼리 값의 차이가 대부분 크게 나지 않기 때문이다. 급격한 변화를 보이는 부분은 대체로 테두리의 역할을 한다. 어찌됏든 이미지를 조감도로 보고 그 이미지에서 가장 낮은 부분 (극소점)들을 찾고 그곳에다가 각자 다른 색깔의 물을 붓는다고 생각해보자. 처음에는 각자 다른 색깔의 물 웅덩이가 생기지만 그 웅덩이를 나누는 산맥까지 물이 차오르면 서로 다른 물 웅덩이가 섞이게 되는 시점이 생기게 된다. 바로 그 부분이 이미지 구역을 나누는 경계선으로 정의하는 것이 분수령 알고리즘이다.

출처: 위키피디아. 빨간색 부분이 분수령이다. 산맥 혹은 강줄기가 시작되는 부분을 분수령이라고 하는데 여기서는 아래에 물 웅덩이가 있다고 가정하고 물의 진원지를 찾는 방식으로 알고리즘이 동작한다. 이미지를 등고선으로 표현했을 때 분수령이 이미지의 경계가 된다.

이는 구현자체도 깔끔하고 알고리즘이 합리적이고 이해하기 쉽다는 장점이 있다. 그러나 이것은 비슷한 픽셀값을 군집화하는 역할만 하기에 의미적으로 이미지를 세분화했다고 말하기 어렵다.

그래프 컷 (Graph cut)

이번에는 이미지를 그래프라고 생각해보자. 각각의 픽셀을 정점으로 정의하고 간선을 유사도라고 생각하면 그리드 또는 매쉬라고 부르는 형태의 그래프로 생각해볼 수 있다. 그리고 그래프에서 유명한 최대 유량 알고리즘을 이용하여 정점을 두 집합으로 나누는 것이 이 알고리즘이다.

출처: http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/NetFlow/max-flow-min-cut.html 그래프를 둘로 나누는 방법 중 하나인 최대 유량 최소 컷 알고리즘이다.

최대 유량 알고리즘이라고 알려져있는 이 알고리즘은 간선을 물이 흐를 수 있는 통로라고 생각하고 만약 물이 흐른다면 이 수많은 통로로 이루어진 구조에서 어떤식으로 물이 흘러야 가장 많이 흐를 수 있는지를 찾아내는 알고리즘이다. 또한, 가장 물이 많이 흐를 수 있는 방법을 찾으면 어느 특정 부분에서 흐를 수 있는 양이 한정되어서 그 구조에서 물이 흐를 수 있는 양이 결정된다는 이유를 추론할 수 있다. 바로 그 부분을 최소 컷이라고 부른다. 위의 사진에서처럼 파란색 간선 3개가 그래프의 최소 컷을 형성하고 이미지에서는 저 컷을 이미지의 세분화의 경계선이라고 생각한다.
일반적으로 컷을 형성했을 때, 그 컷 간의 간선 값들의 합은 작게 된다. 따라서 이를 이미지에 적용시키기 위해서는 간선값이 두 픽셀간의 차이가 크면 간선값이 작고, 두 픽셀간의 차이가 작으면 간선값이 크도록 설정하여 두 픽셀간의 차이가 큰 곳에서 최소 컷이 형성되도록 간선을 정의해주어야 한다.

출처: https://grabcut.weebly.com/background--algorithm.html 그래프 유량 알고리즘을 적용하기 편하게 하기 위해서 두 노드를 추가하고 foreground에서 background로 물이 흐른다고 가정하고 최대 유량 알고리즘을 돌려 그래프 컷을 찾은 것을 보여주는 그림이다.

이렇게 이미지를 그래프로 나타낸 뒤, 최대 유량 알고리즘을 써서 그래프를 이분화한 뒤, 각각의 정점을 이분화하고 레이블을 붙인다고 하여 labeling 기법으로 알려져 있다.
자세한 이유는 모르겠지만 이 방법은 과적합 문제가 발생할 여지가 있다고 한다. 즉, 알고리즘 자체가 굉장히 민감해서 최적의 최대 픽셀변화 합을 찾아내게 되고 픽셀변화가 크지만 같은 군집에 속하는 게 좋은 경우를 모두 배제해버리게 되는 특성을 지닌다. 이를 보완하기 위해서 연구자들은 에너지 함수라는 개념을 도입한다. 이는 머신러닝 분야에서 정규화라는 개념을 도입하는 것과 같다. 그래프의 최소 컷을 계산하는 것은 픽셀의 최소 변화량이 그 이미지를 영역별로 나누는 경계가 될 것이라는 생각에서 나온 방법이고, 이는 머신러닝에서의 최소화를 시키고자 하는 목적식 (이미지 내의 픽셀의 변화량으로 이루어진 함수, 간선은 변화량에 반비례하다는 사실을 기억하자.)과 같은 역할을 하게 된다. 그런데 이 개념에만 집착하게 되면 일반적인 경우에 대해서 잘 동작하지 않지 때문에 정규화라는 모델에 "일반적이다"라는 개념을 도입하는 방법을 사용하게 된다. 이를 이미지 세분화에 그대로 사용한 방법이라고 볼 수 있다.

출처: https://en.wikipedia.org/wiki/Regularization\_%28mathematics%29 머신러닝에서 정규화를 그림으로 설명하는 방법이다. 빨간색 데이터가 있을 때, 파란색 함수와 초록색 함수 둘 다 빨간색 데이터를 설명할 수 있다. 그러나, 파란색 함수로 설명하기 보다는 더 간단한 초록색 함수로 설명하는 것이 더욱더 일반적이라는 의미가 된다. 자세히 알고 싶으면 오컴의 면도날을 검색해보기 바란다.

이 방법을 이용하기 위해서는 목적식에 대해서 알아보아야 한다. 그리고 목적식을 최소화함으로써 알고리즘을 종결시킨다. 먼저 목적식은 이전의 그래프 컷과 다르게 Data term과 Smoothness term이 존재한다. Data term은 데이터를 기반으로 이미지 세분화를 하는 것을 의미하며 그래프 컷에서 변화량을 최소로 만들고자 했었던 역할과 같다. Smoothness term은 머신러닝에서 정규화와 같은 역할을 하며 해당 간선이 픽셀 변화량이 크더라도 컷에 포함시키지 않도록 하여 세분화시킨 이미지를 부드럽게 만들어주는 역할을 하게 된다.

결론

크게 이미지를 세분화하는 클래식한 알고리즘 2개를 알아보았다. 전반적으로 이미지의 픽셀간 거리와 픽셀값 그 자체를 자연스럽게 연동하여 세분화하기 위한 노력들이 있었다. 그러기 위해서 이미지를 조감도의 형태로 생각하거나 그래프의 형태로 변환하여 다른 분야에서 이미 많이 발전된 방법들을 차용하여 사용하였다. 이 방법들은 픽셀간의 거리가 가깝고 픽셀값의 차이가 많이 나지 않으면 같은 군집이라고 생각하는 가정을 바탕으로 알고리즘이 진행되었기에 픽셀값이 다르더라도 의미론적으로 세분화하였다고 보기는 어렵다. 예를 들어, 사람과 사람이 아닌 것으로 세분화할 때에 사람의 피부색과 눈동자색은 분명 다를 수 있지만, 이 두 부분 모두 사람을 나타낸다. 하지만 픽셀값이 다르다는 이유로 이 두 알고리즘은 눈동자와 피부를 다른 군집으로 속하게끔 만들게 된다. 이 2가지가 같은 군집에 속하도록 만들어질 여지가 없다고 말하는 것이 더 맞을 것 같다. 의미론적으로 세분화하기 위해서는 일반적으로 딥러닝을 사용하면 된다고 알려져 있다. 클래식한 알고리즘을 설명하기 위한 글이므로 이 글에서는 생략했지만, 자세한 걸 알고 싶다면 deconvolutional network를 찾아보길 바란다. 네이버에서 잠깐 인턴을 하면서 해보았는데 아주 잘 된다. :) 그래봐야 데이터셋빨이지만

'Research' 카테고리의 다른 글

규모가 점점 커지는 개발에 대한 고민  (0) 2020.07.14
[C++] 입출력  (0) 2019.04.21
[C언어] 기본이 되는 가정  (1) 2018.12.23
[C언어] 소개  (0) 2018.12.21
클러스터링 (Clustering)  (0) 2018.12.14