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

이미지, 군집분석, 압축, VQ(vector quantization)

학위논문통계 2016. 11. 1. 12:51

 

 

히든 마코프체인에서 히든의 의미는 우리가 설정한 모형에 눈에 관찰되지 않는 은닉변수가 있다는 이야기입니다. 이런 예는 현실에서 많이 있습니다.

 

대표적인 것이 최근 지진 사태이죠. 우리가 관찰할 수 있는 것은 지진이 일어나는 지역이나 지진의 강도 등입니다. 이런 눈에 보이는 현상은 분명 땅이나 바다 속의 변화에서 나오는 것일 겁니다. 그러나 우리는 땅이나 바다 속 깊이 밑에 있는 변화는 측정해 낼 수가 없습니다. 그러나 지진 예측이 힘든 것일 겁니다.

 

또 앞에서 소개한 뇌찰영, PET의 경우입니다. 뇌에서 변화를 알기 위해 뇌를 분해하기는 힘들죠. 그래서 뇌에 입자를 쏘고 그 입자가 튀어 나오는 현상을 디텍터라는 둥그런 물체에서 관찰하고 여기서 관찰한 값을 가지고 우리가 알 수 없는 히든인 뇌의 변화를 추정한다는 것이죠.

 

이렇게 관찰현상과 관찰불가능, 즉 히든 현상이 동시에 존재할 때, 그리고 관찰된 현상에서 히든 현상을 추정할 때 사용하는 모형입니다.

 

지난번에 성인의 남자, 여자 키를 관찰할 때 이 키가 남자집단에서 나온 것인지, 여자집단에서 나온 것인지 판단할 때 사용하는 방법을 소개한 적이 있습니다. 판별분석 또는 로지스틱 회귀분석입니다.

 

이 경우는 남자, 여자라는 정보가 관찰되어 있는 경우입니다. 이 정보를 이용하는 어떤 예측식을 만들고, 새로운 개체의 키의 정보가 들어왔을 때 이 사람이 남자인지 여자인지 판정을 내리는 경우입니다. 인공지능쪽 이야기로 supervised 분석입니다. 데이터로 보면 이런 경우입니다. 남자가 0, 여자가 1이라 하면 데이터는

 

성별

175

0

158

1

168

1

162

0

 

이런 식으로 되는 것이죠. 이런 데이터를 가지고 여러분이 많이 쓰는 SPSS에서 메뉴에서 지정만 하면 바로 결과가 나옵니다. 그러나 성별에 대한 정보가 전혀 없이 키의 정보만 있는 경우 어떻게 집단을 분류할까요?

 

즉 (175, 158, 168, 162, 154, 188, 178,....) 이런 식의 키 정보만 있는 경우 어떤 집단으로 나눌 수 있을까요. 이런 경우 사용하는 방법이 clustering Analysis(군집분석)입니다. 집단의 정보가 없으니까 unsupervised 방식이겠지요. 이 군집 분석은 사실 기본적으로 통계적, 확률적 방법이 별로 개입되어 있지 않는 분석입니다. 컴퓨터 학과쪽 분석에 가까운 분석입니다.

 

이 군집분석도 여러 가지 방법이 있는데 가장 대표적인 것이 K-means 군집방식입니다. 이건 몇 개의 군집으로 나눌지 분석하는 사람이 분석 전에 지정하는 방식입니다. 예를 들어 남자, 여자로 나누고 싶으면 K=2로 설정하고, 청년층, 중장년층, 노년층으로 나누고 싶으면 K=3을 설정하고, 이런 사전적인 정보가 없으면 적당한 K 값을 여러개 주고 서로간의 비교를 해야 합니다.

 

이런 K-means 방식 말고 계층적 군집방식이 있습니다. 이것도 두 가지로 나눌 수 있습니다. 만약 100명의 키의 정보가 데이터로 있다면 처음에 100개 집단으로 나누고 그 다음에 99개 집단, 이런 식으로 최종 1의 집단으로 합쳐가는 방식이 있고, 처음에 1의 집단에서 그 다음에 2개의 집단, 3개의 집단 등으로 점점 집단을 세분화해 가는 방식이 있습니다. 이건 각 집단 수에 따른 변화를 단계별로 알 수 있다는 장점이 있지만 데이터 수가 많으면 시간이 많이 걸리고 분석 결과가 너무 복잡해 질 수 있습니다.

 

예를 들어 키의 정보만 보고 남자, 여자 두 집단으로 나누고 싶다고 하죠. 그럼 K=2로 합니다. 성인의 키이기 때문에 한 집단의 평균 키를 172라고 하고 한 집단의 평균은 162라고 설정합니다. 그럼 데이터의 키와 172, 162와 비교해서 가까운 쪽으로 집단1, 집단2로 분류합니다. 이게 첫단계입니다. 그럼 이젠 두 집단으로 분류가 되었기에 이 두 집단의 평균을 다시 구해낼 수 있습니다. 이게 174, 159라 하죠. 이럼 다시 분류를 합니다. 174에 가까운 집단은 남자 집단, 159에 가까운 집단은 여자집단으로 분류합니다. 그럼 새로 분류된 집단에서 다시 평균을 구해 낼 수 있습니다. 171.5, 160.4 이렇게 나온다는 것이죠. 그럼 이 평균을 가지고 다시 두 집단을 분류합니다. 이런 식으로 계속 해서 안정적인 상태까지 갑니다.

 

이 K-means 방식을 이미지 압축에 이용할 수 있습니다. 이 기법을 vector quantization(VQ)라고 합니다. 왜 이 압축을 이야기하는가 하면 나중에 음성 인식에서 소리를 디지털 할 때 데이터 정보가 너무 많기 때문에 압축을 하는 모양입니다. 구체적인 설명이 나온 책을 아직 발견을 못했지만 하기 하는 모양입니다.

 

 

그럼 이미지에 대해서 조금 더 알아볼까요. 이미지 파일은 크게 두 가지 유형이 있습니다. 하나는 비트맵 방식이고 하나는 벡터 방식입니다. 비트맵 방식은 픽셀 하나 하나에 값, 정보를 주는 방식이고, 벡터 방식은 이미지를 수학적으로 표현하는 방식입니다. 예를 들어 100*100 해상도 음영(gray level)이미지가 있다면 각 픽셀에 0-255까지 값을 일일이 주는 것을 비트맵 방식이라 하고, 중심이 (50,05), 반지름이 10 이런식으로 정보를 주는 것을 벡터 방식이라 합니다. 비트맵은 전형적으로 포토샵 같은 이미지 처리 프로그램에서 많이 다루는 방식이고, 벡터방식은 디자인이나 과학 처리 프로그램에서 많이 다루는 방식입니다.

 

이미지의 비트맵 방식은 디지털 음악과 비슷한 개념입니다. 이미지의 해상도는 음악에서 시간에 따라 얼마나 잘게 소리를 채취하는가 하는 표본 추출율이 되는 것이고, 이미지의 값을 256가지로 쓰면 8비트가 되고 6만 4천개로 표현하면 16비트가 되듯이 디지털 음악에서도 소리의 높이를 256개로 표현하면 8bit 음악이 되고 6만 4천개의 소리를 잘게 잘라 표현하면 16비트 음악이 되는 것이죠.

 

비트맵 이미지는 벡터 방식으로 전환할 수 없지만 백터 방식은 비트맵 방식으로 전환할 수 있습니다. 개념상으로는요. 이렇게 비트맵 방식이 일반적인 이미지 파일 표현 방식이지만 문제는 용량을 많이 차지 하다는 것입니다.

 

 

그래서 압축에 대해 간단히 설명을 해보죠. 압축에도 원래 이미지로 완전히 복원할 수 있는 압축이 있고, 완벽하게 복원 못하는 압축이 있습니다. lossy 압축이라고 하는데 왜 이걸 쓰냐면 이 lossy 방법을 쓰면 압축율이 훨씬 좋아지기 때문이죠.

 

예를 들어 설명하겠습니다. 다음과 같은 이미지가 있다고 하죠. 원래 이쪽은 0이 검정색이고 255가 흰색으로 코딩하는 관례가 있습니다. 제 기억으로는요. 왜 이런 식으로 표현하는지 모르겠습니다. 우리는 0은 휜색, 1은 검은색으로 표현하겠습니다.

 

 

 

 

 

 

 

그럼 원 이미지의 코딩은 (1,1,1,1,0,1,1,1,1,1) 이렇게 됩니다. 이걸 압축하면 (1,4), (0,1), (1,5) 이런 식으로 할 수 있습니다. 즉 1이 4번 계속 나오고, 그 다음에 0이 1번, 그 다음에 1이 5번 계속 나온다 이런식으로 표현한다는 것이죠. 이렇게 압축하면 원 이미지로 정확하게 복원이 가능합니다.

 

만약 중간에 낀 흰 픽셀을 노이즈로 인식하면 (1, 10) 이런식으로 표현할 수 있습니다. 이런 식으로 하면 완전 복원이 불가능해지죠. 그러나 압축율은 엄청 좋아지게 되는 것이죠. 문제는 저 흰 픽셀이 노이즈인지 아니면 중요한 정보를 가지는 픽셀인지, 즉 윤곽선 같은, 아무도 모른다는 것입니다.

 

이게 압축의 기본 원리입니다. 하늘 사진이라든지 밤을 찍은 이미지라든지 이런 것을 생각하면 저 방법으로 엄청난 압축이 가능하겠죠.

 

흔히 많이 쓰이는 jpeg은 좀 독특한 방식으로 압축하는 것으로 알고 있습니다. 퓨리에 전환을 하여 시공간 정보를 주파수 공간으로 전환하여 주파수가 높은 부분(즉 노이즈에 가까운 부분)은 없애는 방식을 쓰는 것으로 알고 있습니다. 이 퓨리에 전환은 음성 인식에서 중요한 역할을 하기 때문에 나중에 시간이 있으면 더 언급을 하겠습니다.

 

이렇게 다양한 형태의 이미지 파일 형태와 압축 형태가 있는데 우리가 사용하는 소프트웨어는 어떻게 이걸 알고 이미지를 복원하는 것일까요. 예를 들어 jpeg도 다양한 버전이 존재한다는 것이죠. 원래 파일에는 우리 눈에는 안 보이지만 file header라는 부분이 있습니다. 컴퓨터 하드로 하드에 대한 정보를 간직하고 있는 부분이 따로 있습니다. 이 소프트웨어가 이 파일 헤더를 읽고 풀어 내 컴퓨터 화면에 이미지를 찍어 냅니다.

 

일반 프로그래머는 이런 파일 헤더에 대해 자세히 알 필요가 없겠죠. 개발도구안에 그냥 불러 들이면 자동적으로 이미지를 찍어 줄겁니다. 그러나 전문적인 이미지 프로그램을 개발한다든지, 아니면 다른 경쟁사보다 우월한 기능을 가지려면 이런 파일 헤더를 읽어 낼 줄 알아야 한다는 것이죠.

 

앞에서 이야기한 K-means라는 군집분석을 이용해서 이미지를 압축할 수 있습니다. 이걸 vector quantization(VQ) 이라고 합니다.

 

다음의 이미지는 통계학의 대가라는, 현대 통계학의 중요 개념을 만들어낸 Fisher의 이미지를 VQ 방식을 이용해 압축한 것입니다. 이 Fisher가 MLE라든지, 분산분석, 실험디자인, 충분통계량 등 매우 중요한 개념을 만든 사람입니다. 제가 서 있는 Jaynes 교수는 이 사람을 통계학을 망친 사람, 인격적으로 매우 비판합니다만은 이 Fisher가 없었다면 현재 통계학을 이야기 할 수 없습니다.

 

 

 

 

위의 이미지와 VQ 방식 설명은 Hasti 등의 책에 있는 내용입니다. 100*100 크기의 이미지가 있다고 하죠. 이걸 2*2의 조그만 이미지로 잘게 짜릅니다. 그럼 50*50=250개의 2*2 이미지가 생겨나는 것이죠. 그럼 2*2의 이미지를 지난번 숫자 인식에서 보는 바와 같이 다시 백터 형식으로 만듭니다. 즉 4*1 형태의 벡터 형식으로 고칩니다.

 

예를 들어 다음의 4*6 크기의 원 이미지가 있다고 하죠.

 

 

 

그럼 첫 번째 2*2는 (0,0,01), 두 번째 2*2는 (0,0,0,0), 세 번째 2*2는 (1, 0,1,0) 이렇게 되는 것이죠. 그럼 이걸 이런 형태의 데이터로 만들 수 있습니다.

 

 

X1

X2

X3

X4

1번 2*2

0

0

0

1

2번 2*2

0

0

0

0

3번 2*2

1

0

0

0

4번 2*2

5번 2*2

 

즉 변수의 수가 4개 이고 데이터 수는 250개인 데이터셑을 만들 수 있습니다. 이 4개의 변수를 보고 250개 데이터를 비슷한 것 끼리 묶는 것입니다. 즉, 적절한 K 값을 주고 군집분석을 실시합니다. 즉 2*2 이미지가 비슷한 것끼리 모읍니다. 만약 K=2로 하면 최종 2개의 군집 의 평균을 모은 결과가 나옵니다. 즉

 

(1집단, 2집단) = { (0,0,1,0), (0,1,0,0) }

 

물론 평균 하면 소수점 이하가 나오니까 최종 결과에서 0,1로 바꾸는 작업을 해야 하겠죠. 왼쪽에 있는 집합을 codebook이라 하고 여기 안에 들어 있는 원소를 codeword라고 합니다.

 

그럼 1집단에 속하는 2*2 이미지는 모두 (0,0,1,0) 이미지로 대체하고 2집단에 속하는 이미지는 모두 (0,1,0,0) 이미지로 대체합니다. 즉 2*2 작은 이미지로 쪼개고 이 쪼개진 이미지 집단을 패턴이 비슷한 것끼리 모아서 평균적인 값으로 대체를 해버리는 것입니다. 그래서 K가 작으면 압축은 잘 되지만 원 이미지 정보는 많이 상실하고 K가 크면 압축은 별로지만 원 이미지 정보는 많이 남아 있습니다.