1 of 51

케라스 마술쇼

19년 2월 23일 한국마이크로소프트11층

이상한 폰트나라으로 뛰어들기 마술

- 황준원 -

2 of 51

3 of 51

저렇게 예쁜 폰트가 많은데

내 것도 하나 만들고 싶다!

BUT..

4 of 51

공부할 게 많다

5 of 51

각 위치별로 이름이 다 있다고?

6 of 51

만들기도 힘들다

7 of 51

작업도 엄청나게 많고

8 of 51

디테일도 하나하나 신경써야 하고

서울특별시 서체

9 of 51

나만의 폰트를 만들고 싶은데

공부하기도, 만들기도

너무 어렵다!

10 of 51

어디 폰트 다루기 좋은 방법이 없을까?

딥러닝이라면?

11 of 51

이상한 폰트 나라로!

jack000/fontjoy

12 of 51

F

Font

Vector

Font2Vec

: Font to Vector

13 of 51

F

HOW?

Font

Vector

Font2Vec

: Font to Vector

14 of 51

F

1

0

0

0

0

Font A

F

F

A B C D E

0

1

0

0

0

0

0

1

0

0

Font B

Font C

15 of 51

F

1

0

0

0

0

Font A

F

F

A B C D E

0

1

0

0

0

0

0

1

0

0

:

:

. . .

0이 너무 많다!

Font B

Font C

16 of 51

두꺼움

F

F

F

F

F

F

F

얇음

-1

1

의미를 담자

17 of 51

두꺼움

F

F

F

F

F

F

F

얇음

0.3

-1

1

의미를 담자

18 of 51

두꺼움

F

F

F

F

F

F

F

Serif

San-Serif

얇음

19 of 51

두꺼움

F

F

F

F

F

F

F

Serif

San-Serif

얇음

0.4

0.5

20 of 51

곡선 정도

글자의 크기

글자의 밀도

원의 모양

휘날림 정도

가로 세로 비율

...

훨씬 더 많은 특징들

21 of 51

F

모든 정보가 담겨 있다

22 of 51

F

그대로 이미지를 펼치면?

너무 큰 차원!

연산량도 많고 의미를 찾기 힘듬

23 of 51

F

그럼 작게 줄이자!

압축된 정보를 사용할 수 있다!

하지만 어떻게 압축할까?

24 of 51

차원 축소!

정보가 손실되지만 압축된다

25 of 51

F

F

F

F

F

F

F

폰트 이미지들을 2차원 공간에 놓는 것도

차원 축소가 일어난다

26 of 51

고차원 데이터 (이미지)를

저차원 데이터 (벡터)로 바꾸어

더 가볍고 의미있는 데이터를 다룬다

27 of 51

F

벡터를 n차원의 점으로 본다면

이미지를 점으로 매핑하는 것이 된다

(0.3, 0.6, -0.4, …, 1.2)

28 of 51

Arial

Calibri

Bree Serif

Impact

Permanent Marker

Merriweather

n차원 공간에 폰트마다 점을 찍게 되면

폰트 세계를 들여다 볼 수 있다

29 of 51

F

Font2Vec은

이미지를 벡터로 매핑하는 방법을 학습해

폰트 세계로 들어가게 해준다

(0.3, 0.6, -0.4, …, 1.2)

30 of 51

매핑이 잘 학습됐다면

벡터가 의미를 지닌다

Arial

Bree Serif

Arial Bold

Bree Serif Bold

31 of 51

비슷한 폰트끼리 뭉치고 서로 다른 폰트는 떨어져서

거리가 유사도를 반영한다

Arial

Calibri

Bree Serif

Impact

Permanent Marker

Merriweather

32 of 51

각 폰트를 나타내는 벡터는 의미를 담아서

서로 연산이 가능해진다

IBM Plex Sans Condensed - IBM Plex Sans + Roboto = Roboto Condensed

Georgia + Arial Bold - Arial = Georgia Bold

33 of 51

어떻게 잘 학습할까?

학습? 딥러닝!

34 of 51

Autoencoder

: 학습하는 encoder / decoder

35 of 51

Encoder

Decoder

고차원의 데이터를 저차원으로 줄였다가

다시 고차원으로 복구한다

그 매핑을 학습한다

36 of 51

Encoder

Decoder

폰트 이미지를 넣어 생성된 이미지를

원본과 비교해 오차를 줄인다

F

F

37 of 51

Encoder

학습된 Encoder의 결과 벡터들로

폰트 세계를 볼 수 있다

F

Arial

Calibri

Bree Serif

Impact

Permanent Marker

Merriweather

38 of 51

39 of 51

Arial

Calibri

Bree Serif

Impact

Permanent Marker

Merriweather

학습된 매핑으로 만들어진 저차원 벡터들이 이루는 공간을

잠재 공간 (Latent Space) 이라 한다

40 of 51

앞서 말했듯이 벡터의 연산이 가능하다

벡터의 보간 (interpolation) 도 가능할까?

Arial

Bree Serif

Arial Bold

Bree Serif Bold

41 of 51

Arial

Impact

Decoder

F

두 벡터 점 사이의 점을 Decoder의 입력으로 주어

중간 벡터의 폰트 이미지를 생성한다

42 of 51

G

G

G

G

G

G

G

두 벡터를 interpolate하면

단순히 픽셀끼리 보간되지 않고

의미적으로 특징이 섞이게 된다

43 of 51

실제 학습한 Autoencoder의 결과

글자 모양이 부드럽게 변한다

erikbern/deep-fonts

44 of 51

각 벡터 점을 돌아다니면서

폰트 이미지를 연속적으로 생성하면

폰트 나라를 걸어다닐 수 있다!

erikbern/deep-fonts

45 of 51

생성된 이미지가 흐릿하고 깔끔하지 않다

더 좋은 결과를 얻을 수 없을까?

46 of 51

zi2zi

Autoencoder와 GAN을 활용해

한자 및 한글 폰트를 생성하는 모델

kaonashi-tyc/zi2zi

47 of 51

zi2zi의 모델 구조

Autoencoder 구조와 다양한 Loss가 있다

kaonashi-tyc/zi2zi

48 of 51

한글 폰트에도 꽤 좋은 성능을 낸다!

kaonashi-tyc/zi2zi

49 of 51

한자와 한글 모두에서 폰트가 잘 생성된다

폰트의 언어 변환도 시도해 볼 만하다

50 of 51

이제 폰트를 다룰 때

더 쉽게 다루고 더 빠르게 만들 수 있다

이제 우리도 폰트의 마술사다!

51 of 51

THANK YOU