그림을 나누는 축: 스펙트럼

대역: 굵기 구간마다 따로 떼어 다루기

주파수 축에서는 무늬를 굵기마다 정확히 자를 수 있었다. 그런데 계수 하나는 그림 전체에 걸친 물결이라서, 「이 굵기의 무늬가 얼마」는 알려 주지만 「그림의 어디에」는 알려 주지 않는다. 안경테의 결이 얼굴에 있다는 것은 계수 수천 개에 흩어져 있다. 픽셀 축은 거꾸로 자리는 알지만 굵기를 섞어 적는다. 굵기 구간마다 그 구간의 무늬만 담은 그림 한 장씩을, 자리와 함께 가질 수는 없을까?

역사: 흐린 그림과의 차이만 보내기

버트(Peter Burt)와 아델슨(Edward Adelson)은 그림을 적은 수로 보내는 법을 찾고 있었다. 이웃한 칸은 밝기가 비슷하니, 칸 값을 그대로 보내면 같은 정보를 여러 번 보내는 셈이다. 1983년 논문 「압축된 그림 부호로서의 라플라시안 피라미드」에서 그들은 그림에서 흐린 사본을 빼고 그 차이를 보냈다. 차이 그림은 분산이 작고 0 근처 값이 많아 적은 비트로 적힌다. 흐린 사본은 칸 수를 줄여도 되니, 그 사본에서 다시 더 흐린 사본을 빼는 일을 되풀이한다. 같은 해 두 사람은 이 층들을 써서 두 사진을 층마다 따로 이어 붙이면 이음매가 보이지 않는다는 논문도 냈다.

반씩 줄여 가며 차이를 남기기

선생님 그림(256 × 256)에 이웃 다섯 칸을 1, 4, 6, 4, 1 의 비율(합 16으로 나눔)로 섞는 블러를 걸고 한 칸 건너 하나씩 뽑으면 128 × 128 그림이 된다. 이것을 다시 256 × 256 으로 키워 원래 그림에서 빼면, 128 칸으로는 담을 수 없던 가장 가는 무늬만 남는다. 같은 일을 128, 64, 32, 16 에서 되풀이하면 차이 그림 다섯 장과 8 × 8 바닥 그림 한 장이 남는다. 이렇게 공간 주파수의 한 구간(여기서는 대략 한 옥타브)에 든 무늬만 담은 그림을 대역 (공간 주파수의 한 구간 / frequency band)이라 하고, 대역들을 크기 순서로 쌓은 탑을 라플라시안 피라미드라 한다.

선생님 그림의 라플라시안 피라미드. 왼쪽부터 가장 가는 대역(256 × 256)에서 굵은 대역(16 × 16)까지, 그리고 8 × 8 바닥 그림. 대역은 회색 0 위에 밝기 차를 2.5배로 그렸다. (sources/spectrum/figs.py)
선생님 그림의 라플라시안 피라미드. 왼쪽부터 가장 가는 대역(256 × 256)에서 굵은 대역(16 × 16)까지, 그리고 8 × 8 바닥 그림. 대역은 회색 0 위에 밝기 차를 2.5배로 그렸다. (sources/spectrum/figs.py)

대역마다 자리가 남아 있다. 가장 가는 대역에는 안경테와 니트 결이 제자리에 있고, 16 × 16 대역에는 머리와 조끼의 덩어리가 있다. 칸 수는 256² × (1 + ¼ + ¹⁄₁₆ + …) 이라 모두 87,360개, 원래의 1.333배다. 바닥에서 시작해 키우고 대역을 더하기를 다섯 번 하면 원래 그림이 칸마다 10⁻¹⁶ 안쪽으로 돌아온다. 가장 가는 대역의 칸 값은 평균 0.032 이고, 79.2%의 칸이 ±8/255 안에 있다.

직접 움직여 보기대역을 쌓는 순서새 창에서 열기 ↗

ML에서: 대역 하나만 그리는 모델

작은 그림을 받아 두 배 큰 그림을 내놓는 초해상도 신경망은 피라미드의 말로 하면 맨 위 대역 하나를 그려 넣는 모델이다. 아래 대역들은 입력에 이미 있기 때문이다. 그림을 여러 해상도로 줄여 가며 읽고 다시 키우는 신경망들도 대역마다 다른 층이 맡는 짜임을 가진다.

문제 10. 썸네일까지 저장하는 사진 앱

사진 앱이 원본 4,000 × 3,000 사진과 함께 가로세로를 절반씩 줄인 썸네일(2,000 × 1,500, 1,000 × 750, …)을 끝까지 만들어 둔다. (가) 원본 하나만 둘 때보다 칸 수는 몇 배가 되는가? (나) 가로세로를 3분의 1씩 줄인 썸네일을 이어 만들면 몇 배인가? (다) 썸네일을 바닥 그림 대신 「한 단계 위 그림 − 키운 썸네일」로 바꿔 두어도 칸 수는 같은가?

김민준 M01
김민준

썸네일이 계속 생기니까 꽤 많이 늘겠죠. 두 배쯤?

선생님 T01
선생님

단계마다 칸 수가 얼마씩 줄어들죠?

김민준 M07
김민준

가로세로가 절반이면 칸 수는 4분의 1이니까 1 + ¼ + ¹⁄₁₆ + … = 1/(1 − ¼) = 4/3 배예요. 33%만 늘어요.

이서연 S01
이서연

(나)는 칸 수가 9분의 1씩이라 1/(1 − ¹⁄₉) = 9/8 배, 12.5%야. (다)는 차이 그림도 그 단계의 크기 그대로니 칸 수는 같아. 그게 라플라시안 피라미드잖아.

김민준 M01
김민준

노트 필기에 단원 요약, 장 요약, 과목 요약을 덧붙여도 원래 노트의 3분의 1이 안 늘어나는 거랑 같네요.

문제 11. 아무 블러로나 쌓아도 되살아나나

(가) 선생님 그림의 피라미드를 1, 4, 6, 4, 1 의 비율 대신 1, 2, 1(합 4로 나눔)의 비율로 만들면, 되살릴 때 오차가 생기는가? 왜 그런가? (나) 가장 가는 대역의 칸 값과, 평균 밝기를 뺀 원래 그림의 칸 값을 각각 8/255 간격으로 반올림했다. 몇 %의 칸이 0이 되는가? 반올림한 대역들로 되살린 그림과 반올림한 원래 그림의 오차(칸마다 제곱 평균의 제곱근)는 각각 얼마인가? (다) 버트와 아델슨은 이 성질을 무엇에 썼는가?

김민준 M01
김민준

다섯 칸 비율은 버트랑 아델슨이 골라 둔 거니까, 아무 비율이나 쓰면 되살릴 때 조금씩 틀리지 않을까요?

선생님 T01
선생님

대역 하나를 어떻게 만들었는지 식으로 적어 봐요.

이서연 S07
이서연

대역 = 지금 그림 − 키운(줄인 그림). 되살릴 때는 같은 「키운(줄인 그림)」에 대역을 더하니까 빼고 더한 게 그대로 지워져요. 블러가 무엇이든 똑같은 블러로 빼고 더하기만 하면 돼요.

김민준 M01
김민준

1, 2, 1 로 돌려도 오차가 10⁻¹⁶ 이에요. 가장 가는 대역의 분산만 원래의 3.9%로 다섯 칸 비율 때(5.6%)와 달라요.

선생님 T14
선생님

(나)는요?

김민준 M08
김민준

반올림하니 가장 가는 대역은 74.7% 칸이 0인데, 원래 그림은 0.5%만 0이에요. 되살린 오차는 대역 쪽이 0.0093, 원래 그림 쪽이 0.0107로 비슷해요.

이서연 S08
이서연

(다)가 그거구나. 오차는 비슷한데 대역 쪽은 대부분이 0이니까 적게 적을 수 있어. 0 이 많은 차이 그림을 보내는 게 압축이었어.

이서연 S01
이서연

수학 시간에 망원급수가 앞뒤 항이 지워져서 첫 항과 끝 항만 남던 것과 같아요. 피라미드도 중간의 키운 그림들이 다 지워지고 원래 그림만 남아요.

문제 12. 두 배 업스케일러가 그려야 할 것

이서연 그림(256 × 256)을 피라미드의 줄이기로 128 × 128 까지 줄였다가 키우기로 다시 256 × 256 으로 키웠다. (가) 잃은 세기는 원래의 몇 %인가? 64 × 64 까지 줄였다가 키우면? (나) 두 배 초해상도 신경망이 잃은 것을 채운다면 어느 대역을 그려야 하는가? (다) 잃은 세기가 몇 %밖에 안 되니 쉬운 일인가?

김민준 M01
김민준

128 에서 키우면 6.6%, 64 에서 키우면 12.6%를 잃어요. (나)는 128 칸으로 담을 수 없던 맨 위 대역 하나고요. 6.6%만 채우면 되니까 쉬운 일이겠네요.

선생님 T01
선생님

그 6.6%가 그림의 어디에 있었죠?

이서연 S01
이서연

맨 위 대역은 안경테, 눈썹, 머리카락, 카디건의 결이에요. 세기는 작아도 「선명하다」는 느낌은 다 거기에 있어요.

선생님 T14
선생님

그리고 그 대역은 입력 그림에 있나요?

이서연 S05
이서연

없어요. 128 칸 그림에는 그 무늬가 없으니, 같은 작은 그림에 맞는 결이 여러 가지일 수 있어요. 머리카락이 이쪽으로 흘렀는지 저쪽으로 흘렀는지는 작은 그림만 봐서는 몰라요.

김민준 M08
김민준

그럼 제곱 오차로 배우면 문제 3처럼 그럴듯한 결들의 평균을 그려서 다시 흐려지겠네요. 쉬운 게 아니라, 입력에 없는 걸 여러 가능성 가운데 하나 골라 그려야 하는 일이에요.

김민준 M01
김민준

친구가 보낸 작은 사진을 크게 출력해 달라고 하면 사진관이 없는 머리카락을 그려 넣어야 하는 거랑 같네요.