케라스 마술쇼
19년 2월 23일 한국마이크로소프트11층
이상한 폰트나라으로 뛰어들기 마술
- 황준원 -
저렇게 예쁜 폰트가 많은데
내 것도 하나 만들고 싶다!
BUT..
공부할 게 많다
각 위치별로 이름이 다 있다고?
만들기도 힘들다
작업도 엄청나게 많고
디테일도 하나하나 신경써야 하고
서울특별시 서체
나만의 폰트를 만들고 싶은데
공부하기도, 만들기도
너무 어렵다!
어디 폰트 다루기 좋은 방법이 없을까?
딥러닝이라면?
이상한 폰트 나라로!
jack000/fontjoy
F
| | | | |
Font
Vector
Font2Vec
: Font to Vector
F
| | | | |
HOW?
Font
Vector
Font2Vec
: Font to Vector
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
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
두꺼움
F
F
F
F
F
F
F
얇음
-1
1
의미를 담자
두꺼움
F
F
F
F
F
F
F
얇음
0.3 |
-1
1
의미를 담자
두꺼움
F
F
F
F
F
F
F
Serif
San-Serif
얇음
두꺼움
F
F
F
F
F
F
F
Serif
San-Serif
얇음
0.4 | 0.5 |
곡선 정도
글자의 크기
글자의 밀도
원의 모양
휘날림 정도
가로 세로 비율
...
훨씬 더 많은 특징들
F
모든 정보가 담겨 있다
F
그대로 이미지를 펼치면?
너무 큰 차원!
연산량도 많고 의미를 찾기 힘듬
F
그럼 작게 줄이자!
압축된 정보를 사용할 수 있다!
하지만 어떻게 압축할까?
차원 축소!
정보가 손실되지만 압축된다
F
F
F
F
F
F
F
폰트 이미지들을 2차원 공간에 놓는 것도
차원 축소가 일어난다
고차원 데이터 (이미지)를
저차원 데이터 (벡터)로 바꾸어
더 가볍고 의미있는 데이터를 다룬다
F
벡터를 n차원의 점으로 본다면
이미지를 점으로 매핑하는 것이 된다
(0.3, 0.6, -0.4, …, 1.2)
Arial
Calibri
Bree Serif
Impact
Permanent Marker
Merriweather
n차원 공간에 폰트마다 점을 찍게 되면
폰트 세계를 들여다 볼 수 있다
F
Font2Vec은
이미지를 벡터로 매핑하는 방법을 학습해
폰트 세계로 들어가게 해준다
(0.3, 0.6, -0.4, …, 1.2)
매핑이 잘 학습됐다면
벡터가 의미를 지닌다
Arial
Bree Serif
Arial Bold
Bree Serif Bold
비슷한 폰트끼리 뭉치고 서로 다른 폰트는 떨어져서
거리가 유사도를 반영한다
Arial
Calibri
Bree Serif
Impact
Permanent Marker
Merriweather
각 폰트를 나타내는 벡터는 의미를 담아서
서로 연산이 가능해진다
IBM Plex Sans Condensed - IBM Plex Sans + Roboto = Roboto Condensed
Georgia + Arial Bold - Arial = Georgia Bold
어떻게 잘 학습할까?
학습? 딥러닝!
Autoencoder
: 학습하는 encoder / decoder
Encoder
Decoder
고차원의 데이터를 저차원으로 줄였다가
다시 고차원으로 복구한다
그 매핑을 학습한다
Encoder
Decoder
폰트 이미지를 넣어 생성된 이미지를
원본과 비교해 오차를 줄인다
F
F
Encoder
학습된 Encoder의 결과 벡터들로
폰트 세계를 볼 수 있다
F
Arial
Calibri
Bree Serif
Impact
Permanent Marker
Merriweather
Arial
Calibri
Bree Serif
Impact
Permanent Marker
Merriweather
학습된 매핑으로 만들어진 저차원 벡터들이 이루는 공간을
잠재 공간 (Latent Space) 이라 한다
앞서 말했듯이 벡터의 연산이 가능하다
벡터의 보간 (interpolation) 도 가능할까?
Arial
Bree Serif
Arial Bold
Bree Serif Bold
Arial
Impact
Decoder
F
두 벡터 점 사이의 점을 Decoder의 입력으로 주어
중간 벡터의 폰트 이미지를 생성한다
G
G
G
G
G
G
G
두 벡터를 interpolate하면
단순히 픽셀끼리 보간되지 않고
의미적으로 특징이 섞이게 된다
실제 학습한 Autoencoder의 결과
글자 모양이 부드럽게 변한다
erikbern/deep-fonts
각 벡터 점을 돌아다니면서
폰트 이미지를 연속적으로 생성하면
폰트 나라를 걸어다닐 수 있다!
erikbern/deep-fonts
생성된 이미지가 흐릿하고 깔끔하지 않다
더 좋은 결과를 얻을 수 없을까?
zi2zi
Autoencoder와 GAN을 활용해
한자 및 한글 폰트를 생성하는 모델
kaonashi-tyc/zi2zi
zi2zi의 모델 구조
Autoencoder 구조와 다양한 Loss가 있다
kaonashi-tyc/zi2zi
한글 폰트에도 꽤 좋은 성능을 낸다!
kaonashi-tyc/zi2zi
한자와 한글 모두에서 폰트가 잘 생성된다
폰트의 언어 변환도 시도해 볼 만하다
이제 폰트를 다룰 때
더 쉽게 다루고 더 빠르게 만들 수 있다
이제 우리도 폰트의 마술사다!
THANK YOU