사람과 컴퓨터의 이미지 인식 방법 차이를 살펴봅니다.
1. 들어가며
지난 글에서는 컴퓨터에게 강아지랑 고양이를 알려주려 시도해 봤습니다.
유치원생 조카에게 사용했던 방법을 그대로 사용해 봤는데요. 강아지와 고양이 사진을 보여주면서 각각의 조건들을 알려주는 방법이었죠. 유치원생 조카는 몇 장의 사진만 보고서도 금방 강아지와 고양이의 차이를 인식했습니다. 이후에는 사진에 없던 강아지 품종까지도 강아지로 인식하며 응용 범위를 자동으로 넓혀갔죠.
하지만 컴퓨터는 달랐습니다.
강아지의 조건을 알려주면 ‘정확하게’ 해당 조건에 만족하는 경우만 강아지로 인식했죠. 적당히 융통성 있게 이해하던 유치원생 조카랑은 너무 달랐습니다. 왜 그런 걸까요? 유치원생 조카는 ‘적당히 융통성 있게’ 이해하는데 왜 컴퓨터는 ‘융통성이 없을까요?’
이번 글에서는 컴퓨터가 이미지를 인식하는 방법을 살펴보겠습니다.
이를 통해 왜 컴퓨터는 유치원생 조카와 달리 융통성이 없는지를 파악해 보겠습니다. 원인을 파악했으면 문제 해결을 해야겠죠? 우리의 목표는 컴퓨터에게 강아지와 고양이를 가르쳐주는 것입니다. 그러자면 컴퓨터의 눈높이에 맞춰 가르쳐줘야겠죠. 이번에는 지금까지와는 반대로 컴퓨터의 사고방식을 따라가 보겠습니다. 어떻게 하면 우리가 컴퓨터의 사고방식에 맞춰 강아지와 고양이를 가르쳐줄 수 있는지 알아보겠습니다.
2. 문제 상황
먼저 문제의 원인부터 파악해 보죠. 도대체 컴퓨터는 왜 융통성이 없을까요?
2-1. 컴퓨터와 사람의 이미지 인식 방법의 차이
컴퓨터는 이미지를 인식하는 방법이 우리와는 전혀 다릅니다.
위 사진을 볼까요?
아주 흐릿하지만 우리는 이 사진이 사람 얼굴임을 알 수 있습니다. 위의 검은색 부분은 머리카락이고, 가운데에 눈 두 개가 있고, 아래에는 수염이 있어서 얼굴 윤곽임을 파악할 수가 있죠. 즉 우리는 이미지를 보며 덩어리별로 인식합니다. 위 사진에서는 머리카락, 눈, 수염을 덩어리로 인식하고 이 세 가지 정보를 종합하여 사람 얼굴임을 추론해 냈죠.
반면 컴퓨터는 다릅니다.
오로지 픽셀값으로만 인식하죠. 우리에게는 ‘하나의 사진’이지만 컴퓨터에게는 ‘수많은 픽셀값’으로 인식됩니다. 픽셀값이란 이런 겁니다.
각 색상별로 매칭되는 ‘값’이 있습니다.
위 사진은 흑백사진이니, 검은색부터 흰색까지 0~255 사이의 값으로 매칭할 수 있습니다. 검은색은 0이고 흰색에 가까울수록 255에 가까운 값을 갖는 식이죠.
그렇다면 컴퓨터에게 위의 사진은 어떻게 보일까요?
위 그림은 우리의 시야에서 본 사진과 컴퓨터 시야에서 본 사진을 비교한 그림입니다.
오른쪽 컴퓨터 시야의 그림을 보면 온통 ‘값’만 쓰여있는 모습을 볼 수 있습니다. 어떤가요? 오른쪽 픽셀값만 보고도 이게 사람 얼굴인지 바로 파악이 되나요? 어렵죠. 우리에게는 너무 쉽게 사람 얼굴로 보이는 사진이 컴퓨터에게는 이렇게 수백 개의 ‘값’으로만 보입니다. 오직 수백 개의 ‘값’만을 보고 이게 강아지인지 고양이인지를 인식해야 된다는 말인 거죠.
2-2. 컴퓨터가 실제 이미지를 인식하는 방법
그나마 위의 예시는 ‘화질’이 흐린 사진인데요. 화질이 좋은 사진일수록 문제는 더 심각해집니다. 화질이 좋다는 건 그만큼 픽셀값을 많이 포함하고 있다는 말이기 때문이죠.
위 그림은 HD화질과 FHD, UHD 화질의 픽셀수를 비교한 그림입니다.
HD 화질은 1280*720, FHD 화질은 1920*1080, UHD 화질은 3840*2160개의 픽셀값을 갖고 있습니다.
이게 다가 아닙니다. 위의 예시에서는 흑백 사진으로 설명했는데요. 컬러 사진이라면 픽셀값이 훨씬 많아집니다.
흑백 사진은 위치당 하나의 픽셀값으로 표시되는데요. 컬러 사진은 위치당 R, G, B 세 개의 픽셀값으로 표시됩니다. 따라서 FHD 화질의 사진이라면 다음과 같은 픽셀값들을 포함합니다.
FHD 사진 한 장 당 총 1920*1080*3개의 픽셀값을 갖는 거죠. 대략 사진 한 장당 600만 개의 ‘값’을 갖는다는 말인데요. 우리에게 600만 개의 값을 보여주고 강아지인지 고양이인지 맞추라고 한다면 가능할까요? 컴퓨터의 눈높이에 맞춰서 알려주려고 했는데 이건 도저히 엄두가 나지를 않습니다. 우리 눈에는 강아지 또는 고양이에 해당하는 600만 개의 숫자가 전혀 구분이 가지 않으니까요. 이렇게 해서는 컴퓨터의 눈높이에 맞춰서 강아지와 고양이를 가르쳐줄 수 없겠습니다. 컴퓨터의 눈높이에 맞춰줄 수 있는 다른 방법을 찾아야겠네요.
3. 해결 방법
3-1. 데이터를 공간상의 점으로 표현하기
먼저 우리가 기존에 다양한 숫자를 다루는 방법을 생각해 보죠.
가장 간단하게 두 개의 숫자로 표현되는 정보는 어떻게 다루나요? 두 개의 숫자로 표현되는 정보라면 대표적으로 2차 함수가 있습니다.
2차 함수는 x축과 y축으로 표현되는 2차원 공간상에 그려서 표현할 수 있죠. 즉 두 개의 숫자는 2차원 공간상의 한 ‘점’으로 표현됩니다. 그리고 이 점들이 모이면 ‘직선’ 형태로 표현되겠죠. 한 번만 더 확장해서 세 개의 숫자라면 어떨까요?
마찬가지로 3차 함수를 생각해 볼 수 있습니다.
x축, y축, z 축으로 표현되는 3차원 공간상에서 표현해 줄 수 있죠. 마찬가지로 세 개의 숫자는 3차원 공간상의 한 ‘점’으로 표현됩니다. 그리고 이 점들이 모이면 ‘면’ 형태로 표현될 겁니다.
이제 크게 확장해 볼까요? 아주 큰 D개의 숫자를 갖는 정보가 있다고 해보죠.
위의 논리를 그대로 따라가면 이 정보 한 개는 D차원 공간상의 한 ‘점’으로 표현될 겁니다. 그리고 이러한 점들이 모이면 초월적인 면 형태가 되겠죠. 이러한 초월적인 면 형태를 초평면(Hyperplane)이라고 합니다.
3-2. 고차원 공간의 점을 저차원 공간으로 가져오기
뜬금없이 왜 상상할 수 없는 고차원 공간상의 점 얘기를 할까요?
바로 컴퓨터가 인식하는 세계가 이러한 고차원 공간이기 때문입니다. 위에서 컴퓨터에게는 사진 한 장이 600만 개의 숫자로만 인식된다고 했는데요. 이 말은 컴퓨터에게 사진 한 장은 600만 차원 공간상의 한 ‘점’이라는 겁니다. 우리에게는 3차원 공간까지만 보이죠. 4차원도 아닌 600만 차원 공간이라니 어떻게 생긴 건지조차도 상상이 안 갑니다. 이래서는 컴퓨터의 눈높이에 맞춰줄 수가 없잖아요.
이제 타협을 해야 할 시점입니다. 우리와 달리 사진을 ‘값’으로만 인식하는 건 어쩔 수 없다고 칩시다. 하지만 600만 차원의 공간은 우리가 전혀 이해할 수 없으니 우리에게 친숙한 2차원 공간상의 점으로만 생각하기로 하죠. 600만 차원 공간상의 강아지 사진 정보를 2차원 공간상의 점으로 가져오는 겁니다.
이렇게 차원을 축소하는 과정에서 기존 사진 정보들끼리의 관계만 유지된다면 크게 문제 될 건 없지 않겠어요? 예를 들어 600만 차원 공간상에 세 개의 이미지 점들이 이렇게 분포했다고 가정해 보죠.
1번 이미지와 2번 이미지는 가깝게 분포합니다. 3번 이미지와 1,2번 이미지는 멀게 분포하고요. 이제 이 세 개의 이미지 점들을 2차원 공간상으로 보내주겠습니다. 대신 이 세 개 이미지 점들의 관계를 망가뜨리지 않으면서요. 그럼 이렇게 옮겨오면 되겠죠.
기존 점들 사이의 관계가 그대로 2차원 공간으로 옮겨온 모습을 볼 수 있죠?
3-3. 차원 축소 : AI와 인간 눈높이를 맞추기 위한 필수 작업
실제로 AI연구에서는 컴퓨터 눈높이에 맞춰 이해하기 위해 위에서 설명한 방법을 자주 사용합니다.
이러한 방법을 ‘차원 축소’라고 합니다. 너무 고차원 정보는 우리가 이해할 수 없으니 우리가 이해할 수 있는 저차원 정보로 바꿔주는 것이죠. 너무 말로만 설명하면 느낌이 안 오니 실제 데이터셋 예시를 살펴볼게요.
위 그림은 MNIST라고 하는 데이터셋 샘플입니다.
MNIST는 실제 초창기 AI연구에서 많이 사용되었던 이미지 데이터셋입니다. 보시는 바와 같이 0~9까지의 숫자 흑백 이미지들로 구성되어 있습니다. 이 그림을 보고 어떤 숫자인지를 맞추면 되는 것이죠.
하지만 MNIST 데이터가 아무리 낮은 화질의 이미지라고 해도 최소 몇백 개의 픽셀값을 포함하고 있습니다. 따라서 이 데이터들이 어떻게 분포하는지 상상하는 것조차도 어렵죠. 이 데이터들을 2차원 공간상으로 가져와보겠습니다. 위의 예시와 마찬가지로 각 이미지 데이터 간의 상관관계는 최대한 유지한 채로 말이죠. 이렇게 2차원 공간상에서 분포하는 0~9까지 이미지 점들의 분포는 이렇습니다.
어떤가요? 제법 0~9까지의 점들이 잘 구분되어 있지 않나요?
고차원 공간상의 점들로만 존재할 때는 어떤 식으로 분포하는지 전혀 감을 잡을 수 없었습니다. 하지만 2차원 공간으로 환산해 보니 이 데이터들이 어떻게 분포하는지 볼 수 있죠. 참고로 위 예시에서는 t-SNE라는 차원 축소 방법을 사용했습니다.
3-4. 정리
자, 이제 컴퓨터와 비로소 말이 좀 통할 것 같습니다. 컴퓨터의 눈에 강아지와 고양이가 어떤 식으로 보이는지 이제는 알 수 있으니까요.
여기까지 내용을 정리해 보겠습니다.
먼저 컴퓨터 눈에 비치는 이미지와 우리 눈에 비치는 이미지의 차이를 살펴봤습니다. 이 과정에서 컴퓨터는 이미지를 픽셀값으로만 인식한다는 것을 알았죠. 따라서 컴퓨터에게 한 장의 이미지는 수백만 개의 픽셀값을 의미합니다. 이는 수백만 차원 공간상에 존재하는 하나의 점을 의미하죠. 이러한 고차원 공간은 우리에게 전혀 익숙하지 않습니다. 따라서 우리가 이해할 수 있도록 점들 간의 상관관계는 유지하면서 2차원 공간상으로 분포를 가지고 왔습니다. 이렇게 점들을 이동시키는 작업을 사상(Mapping)이라고 합니다. 그리고 더 작은 차원 공간으로 점을 이동시키는 방법을 차원 축소 (Dimension Reduction)이라고 합니다.
4. 마무리
이번 글에서는 컴퓨터가 이미지를 인식하는 방법을 살펴봤습니다.
우리와는 달리 컴퓨터는 이미지를 오직 픽셀값으로만 인식한다는 것을 알았습니다. 이는 한 장의 이미지는 아주 고차원 공간상에 존재하나는 한 점으로 표현된다는 것을 의미합니다. 우리는 3차원 이상의 공간을 상상할 수 없습니다. 따라서 컴퓨터의 사고방식을 이해하기 위해서는 우리도 이해할 수 있는 저차원 공간상의 점으로 표현해줘야 합니다.
이를 위해 사용할 수 있는 차원축소라는 방법도 살펴봤습니다. 차원축소는 고차원 공간상 데이터관의 관계는 유지하면서 저차원 공간으로 데이터 분포를 이동시키는 방법입니다. 실제로 AI 연구에서 많이 사용되는 기법이죠.
이제 컴퓨터가 이미지를 어떻게 인식하는지 이해했습니다.
고차원 공간의 데이터를 저차원 공간으로 이동시켜 어떻게 분포하는지를 볼 수 있게 되었죠. 그렇다면 이렇게 만든 데이터 분포를 기준으로 컴퓨터에게 강아지와 고양이를 가르쳐주면 어떨까요? 이 전 글에서는 우리의 방식대로 강아지는 어떻고 고양이는 저렇고 가르쳐주었잖아요. 이런 방식을 전문가 시스템이라고 했었죠. 그러지 말고 컴퓨터의 방식대로 데이터 분포를 기준으로 알려주는 거예요. 이러한 분포 안에 있으면 강아지고, 이러한 분포 안에 있으면 고양이야라는 식으로요.
다음 글에서는 이렇게 데이터를 기준으로 강아지와 고양이를 구분하는 방법을 살펴보겠습니다.
5. 참고자료
- https://www.techm.kr/news/articleView.html?idxno=4642