인공지능관련/인공지능(AI)

이미지 프러세싱과 딥러닝의 cnn 관계

학위논문통계 2016. 12. 19. 10:49

 

 

1.

 

지금부터 쓰는 내용이 이해가 안되시는 분들은 이미지 프러세싱 부분을 한번 읽어 보시기 바랍니다. 별 어려운 내용은 아닙니다.

 

 

지난번까지 이미지 프러세싱편에서 이미지 개선에 대해 간단하게 몇 가지를 이야기 했습니다. 사실 내용상 그게 다입니다. 또 한 분야인 이미지 특성 추출 분야도 내용상 이미지 개선과 거의 비슷합니다.

 

다루지 않는 내용은 퓨리에 변환이라는 이론인데 이건 알파고에서 사용한 CNN을 이해하는데 현재로선 그렇게 중요하지 않고요. 그러나 이미지 프러세싱을 심각하게 공부하시려는 분들은 퓨리에 변환에 대해 충분한 지식이 있어야 합니다.

 

사실 이공계에서는 이 퓨리에 전환에 매우 중요하지만 일반 사회과학 분야나 상공계에서는 나오지 않는 분야입니다. 단지 통계학에서 시계열 분석에서 조금 나오는 내용입니다. 또 다르지 않는 분야가 부식되거나 왜곡된 이미지를 원래 이미지로 복원하는 분야인데 이것도 퓨리에 변환에 대한 충분히 공부를 해야 합니다.

 

 

이미지 복원의 대표적인 예가 움직이는 물체를 찍었을 경우입니다. 움직이는 물체를 찍으면 화면이 흐릿하게 나오죠. 이걸 이미지 복원 이론을 써서 좀 더 선명하게 보고 싶다는 것입니다. 특히 CCTV에 찍힌 희미한 물체를 파악하는데 큰 도움이 되겠죠. 아래의 예를 한번 보죠. 아래 왼쪽 이미지는 디지털 이미지 책 표지를 이론적으로 움직이는 물체를 찍은 것처럼 희미하게 만든 것입니다. 오른쪽에서는 이미지 복원 기법을 살려 이미지를 살린 것이고요. 표지 내용이 상당히 많이 보이죠.

  

 

 

2. 점 추출

 

 

이미지 특성 추출 분야의 하나인 한 점 추출을 한번 보죠. 화면상에 특이한 1*1 크기의 특이점을 파악하는 것입니다. 아래 예를 보죠. 중앙에 있는 점이 특이점이라는 것이죠. 이걸 어떻게 파악할 수 있을까요?

 

 

 

 

전통적인 프로그램 방법이라면 (3,3) 위치에서 이미지 값과 주변의 위치에서의 이미지 값을 if then 형태로 비교를 하여야 합니다. 또 흑백 이미지가 아닌 256개의 값을 갖는 음영 이미지라면 프로그램이 상당히 정교하게 짜야 합니다.

 

그러나 이쪽에서는 그런 방법을 쓰지 않고 이미지 프로세싱에서 쓰는 마스크를 사용합니다. 아래 그림을 보죠

 

 

-1

-1

-1

-1

8

-1

-1

-1

-1

7

7

7

7

7

7

7

7

7

7

-23

-23

-23

7

7

30

7

7

-23

184

-23

7

7

7

7

7

-23

-23

-23

7

7

7

7

7

 

원 이미지의 검정색은 7로 값을 주고 흰색 부분은 30으로 값을 줬습니다. 가운데 위의 3*3 행렬이 특이점을 파악하기 위한 3*3 마스크 행렬입니다. 왼쪽의 3*3 행렬은 원 이미지에 마스크를 취한 결과입니다. 원이미지 변에 있는 픽셀은 마스크를 취할 수가 없기 때문에 제외하였습니다.

 

 

일반적인 이미지라면 변에 있는 픽셀은 그리 큰 의미가 없다고 할 수 있기 때문에 별 문제가 없습니다. 그러나 바둑판의 경우 변의 경우가 매우 중요하기 때문에 이런 식으로 변의 경우를 제외할 수 없습니다. 이럴 경우 변 외곽에 가상의 패딩을 만들어 마스크를 취합니다. 통상 0의 값을 주지만 바둑의 경우 어떤 값을 줄지는 알파고의 자체 노하우이겠죠.

 

 

마지막 결과를 보면 특이점은 값은 184로 매우 큰 양수가 나오고 외곽부분은 전부 다 -23의 음수가 나옵니다. 그래서 마스크를 취한 결과물에서 적당한 cut-off 값을 주면 특이점이 어디 위치에 있는지 바로 판단할 수 있습니다. 이렇게 마스크를 취하게 되면 프로그램이 매우 간단하게 됩니다. 이미지의 특성에 따라 cut-off 값을 변한게 한다든지, 아니면 마스크 행렬의 값을 변화를 주면 상황에 맞춰 바로 특이점을 발견할 수 있다는 것이죠.

 

 

 

3. S,R 코드

다음은 위 작업을 한 S, R 코드입니다.

 

image<-matrix(7,5,5);

image[3,3]<-30;

mask<-matrix(c(-1,-1,-1,-1,8,-1,-1,-1,-1),3,3);

out<-matrix(NA,3,3);

 

for ( i in 1:3){

for (j in 1:3){

out[i,j]<-sum(image[i:(i+2),j:(j+2)]*mask);

}

}

 

 

 

4. 이미지 프로세싱, 알파고의 CNN과의 연관

 

 

앞에서 이야기한 한점 찾기는 사실 일반 이미지에서는 조금 문제가 있는 방법입니다. 왜냐하면 저해상도 이미지에서 한점은 1*1 크기의 픽셀이지만 똑 같은 이미지를 고해상도로 바꾸면 이 1*1 크기의 특이점은 4*4, 10*10 등 다양한 크기로 바뀔 수가 있습니다.

 

그러나 바둑의 경우는 다룰 수가 있습니다. 바둑의 착점 그 자체가 1*1 크기의 픽셀로 볼 수 있습니다. 알파고가 바둑을 둘 때 바둑판 밑에 전자 장치를 추적해 알파고 알고리즘에 19*19 크기의 행렬 이미지로 바꿀 수가 있고요. 이게 불가능하다면 바둑판을 위에서 똑 같은 해상도로 정형한 된 이미지를 찍습니다. 그런 다음 이 이미지를 19*19 크기의 바둑판 행렬 이미지를 바꾸는 프로그램을 사전에 짜면 됩니다. 이런 정형화된 이미지를 변환하는 것은 그리 어려운 작업이 아니죠.

 

그래서 위의 한점을 파악하는 알고리즘을 약간 발전 시키면 단수, 패, 축 같은 바둑의 특성을 파악할 수 있습니다. 알파고가 놓은 점은 1, 상대방은 -1, 공백은 0으로 바둑판 이미지 행렬 값을 설정하고요 단수, 패, 측을 파악할 수 있는 마스크를 취하면 현 바둑판의 상황을 판단할 수 있다는 것이죠.

 

이렇게 상황을 판단할 수 있는 특성을 알파고는 48개간을 설정했다고 합니다. 아마 이 중에는 끊기도 있겠고, 또 변의 처리 부분이 중요하기 때문에 특성 중 상당 수가 변에 관련된 것이라 추측합니다.

 

 

이미 나온 바에 의하면 알파고 알고리즘은 크게 두 가지 부분으로 되어 있습니다. 하나는 수 읽기 부분입니다. 현재 바둑판에서 10수, 20수 등 가상의 바둑판을 시뮬레이션해서 진행해 본다는 것이죠. 또 한 부분이 바둑의 특성을 파악하기 위한 이미지 프로세싱을 이용한 CNN 부분이죠.

 

아래 그림은 펼쳐진 손가락 숫자를 파악하는 저널 논문에 있는 내용입니다. 논문을 첨부합니다.

 

 

손가락논문.pdf

 

 

 

 

 

 

 

 

 

 

 

그리고 위 작업을 하기 위해 사용된 딥러닝의 CNN 작업입니다.

 

 

 

맨 왼쪽이 32*32 크기의 원 이미지입니다. 그 안에 5*5 행렬 그림은 5*5 마스크를 취했다는 이야기입니다. 그 다음 그림이 28*28 크기의 이미지가 20개가 있다는 이야기입니다. 즉 손가락 숫자를 파악하기 위해 이미지에서 다양한 특성을 뽑아내어야 하는데 여기 1단계에서는 다양한 20개의 5*5 크기의 마스크를 취했다는 것이죠. 그래서 20개의 이미지가 새로 생겨난 것입니다. 알파고에서 단수, 패, 축, 끊기 등을 파악하기 위해 48개의 마스크를 취하듯이요.

 

28*28 크기로 이미지 사이즈가 줄어든 것은 바로 변 부분에서 마스크를 취할 수가 없기 때문입니다. 만약 원 이미지 변 옆에서 가상의 패딩을 넣었다면 32*32*20개로 만들 수 있습니다. 그러나 이 문제의 경우 변의 픽셀 값을 그리 중요하지 않기 때문에 변 부분은 생략한 것이죠.

 

 

그 다음 이미지는 28*28 크기의 이미지가 14*14 크기의 이미지로 사이즈가 1/4로 줄어 들었습니다. 이게 마스크를 취하는 operation 외에 많이 사용되는 max-pooling 이라는 operation을 한 것입니다. 두 번째 이미지 안에 2*2 크기의 작은 이미지가 보이죠. 이게 2*2 크기의 max-pooling을 했다는 이야기입니다. 맥스풀링은 간단합니다. 이미지을 2*2 크기를 잘게 분해한 다음 각 2*2 크기에서 가장 큰 값을 결과물로 한다는 것이죠. 그럼 x 축 방향으로 크기가 반으로 줄어 들고, y 축 방향으로 크기가 반으로 줄어 드는 것이죠. 만약 4*4 크기의 맥스 풀링을 하면 x 축 뱡향으로 크기가 1/4로 줄어 들고 y 축 방향으로 크기가 1/4으로 줄어 들어 위의 예의 경우 28*28 이미지가 7*7 이미지로 변한다는 것이죠. 왜 이 작업을 하는가 하면 이 문제를 해결하는데 있어서는 28*28 크기의 이미지 정보가 다 필요없다는 것이죠. 이미지를 줄여도 문제 해결에 별 문제가 없으니까 계산과 메모리 용량 등에서 빨리 처리 할 수 있다는 것이죠. 물론 다른 이유도 있습니다.

 

 

알파고에서는 19*19 바둑판 이미지 행렬 값이 모두 다 중요하기 때문에 이 맥스풀링 작업을 하지 않았을거라 봅니다.

하여간 이런 작업을 계속 한다는 것이죠. 물론 정확하게 마스크 값을 어떻게 줬는지는 문제에 따라서 다 다른 것이죠.

손가락논문.pdf
3.74MB