概要
英語にしか対応していないフォントでも、Deep Learningで日本語もそれっぽく生成(拡張)させることができる。
学習結果
Berlin Sans FB
学習データ(英数字記号)を入力する
学習結果(英数字記号)
未学習データ(漢字ひらがな)を入力し、フォントを拡張する。
Bodoni MT Black
学習用フォント
フォント拡張
Bradley Hand ITC
学習用フォント
フォント拡張
デモを実行する
以下を実行すると、Berlin Sans FB風フォントで日本語フォントを表示する。
生成結果はresult
フォルダにも保存されている。
$ ./predict.py Model/01/*model Model/01/param.json Font/test.png
画像データでは使いにくいという人のために、SVG形式で出力する機能もある。
以下を実行することで、SVG形式に変換したデータが入力画像と同じフォルダに保存される。
$ ./jpg2svg.sh result/predict.jpg
実行結果は以下のようになる。
動作環境
- Ubuntu 16.04.4 LTS ($ cat /etc/issue)
- Python 3.5.2 ($ python3 -V)
- chainer 4.0.0 ($ pip3 show chainer | grep Ver)
- numpy 1.14.2 ($ pip3 show numpy | grep Ver)
- cupy 4.0.0 ($ pip3 show cupy | grep Ver)
- opencv-python 3.4.0.12 ($ pip3 show opencv-python | grep Ver)
チュートリアル
1. データセットを作成する
実行に必要なデータは入力画像と正解画像である。チュートリアルではyu gothicを入力画像とし、Berlin Sans FBを正解画像としている。以下の画像をcreate_dataset.py
でランダムに取得して学習(テスト)データを任意の数だけ生成する。Berlin Sans FB以外にも色々フォントを用意しているし、画像の形状などを揃えれば別のフォントでも生成可能。
yu gothic | |
---|---|
Berlin Sans FB |
以下を実行する。
$ ./create_dataset.py Font/00_yu_gothic_12pt.png Font/01_Berlin_Sans_FB_12pt.png
result
フォルダが作成され、以下のデータが保存されていることを確認する
dataset.json
test_128x128_000100.npz
train_128x128_000900.npz
dataset.json
は作成されたデータの情報が格納されている。
$ cat result/dataset.json
{
"conv_font": "Font/01_Berlin_Sans_FB_12pt.png",
"font_num": 10,
"font_size": 64,
"img_num": 1000,
"img_size": 128,
"out_path": "./result/",
"pre_font": "Font/00_yu_gothic_12pt.png",
"round": 1000,
"train_per_all": 0.9
}
test_128x128_000100.npz
とtrain_128x128_000900.npz
は学習に使用するテストデータと学習データ。それぞれの中身を確認するには以下を入力する。
$ Tools/npz2jpg.py result/test_128x128_000100.npz
表示された画像の上段が入力画像(yu_gothic
)で、下段が正解画像(作成したいフォント)。その他Tools
の機能を利用したい場合はTools/README.md
を参照されたい。
2. 学習する
以下を実行する
$ ./train.py
学習完了後、result
フォルダに以下のデータが保存されていることを確認する
*.log
*.model
*_10.snapshot
*_graph.dot
*_train.json
loss.png
3. 学習で作成されたモデルを使用する
$ ./predict.py result/*.model result/*_train.json Font/test.png
その他のパラメータ設定は-h
で確認する。デモと同様のパラメータにしたい場合はModel
にあるparam.json
を参考にするとよい。
おまけ
Bradley Hand ITCなどはどうしてもフォントが薄い色で生成されがち。これをDeep Learningで修正してもいいが、普通にフィルターを通した方が楽かと。詳細は以下を参照されたい。