Deep Learningでフォントを拡張する

# 概要

英語にしか対応していないフォントでも、Deep Learningで日本語もそれっぽく生成（拡張）させることができる。

## 学習結果

### **Berlin Sans FB**

学習データ（英数字記号）を入力する

![00_yu_gothic_12pt.png](https://qiita-image-store.s3.amazonaws.com/0/227399/1daa2ef5-52fe-58d3-a985-69eae3526206.png)

学習結果（英数字記号）

![predict_sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/4e66956c-f399-a356-3c6c-75144db1d079.jpeg)

未学習データ（漢字ひらがな）を入力し、フォントを拡張する。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/227399/65c90da4-b848-fa15-b787-6fcdb181be76.png)

![predict_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/13d9ae58-b1f9-18f1-9c07-5b1364043b2d.jpeg)

### **Bodoni MT Black**

学習用フォント

![02_Bodoni_MT_Black_12pt.png](https://qiita-image-store.s3.amazonaws.com/0/227399/c440260e-3ecd-cf39-3cbb-a74897cebf35.png)

フォント拡張

![predict_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/51cf5de9-0266-ac63-8d0a-90fd76af5df4.jpeg)

### **Bradley Hand ITC**

学習用フォント

![03_Bradley_Hand_ITC_12pt.png](https://qiita-image-store.s3.amazonaws.com/0/227399/c3654c8f-01c3-000c-4a54-4ae54e48afc3.png)

フォント拡張

![predict_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/d015fd2a-279e-dcea-ffa4-038ae8ccd4ae.jpeg)


## デモを実行する

以下を実行すると、Berlin Sans FB風フォントで日本語フォントを表示する。
生成結果は`result`フォルダにも保存されている。

$ ./predict.py Model/01/*model Model/01/param.json Font/test.png

画像データでは使いにくいという人のために、SVG形式で出力する機能もある。
以下を実行することで、SVG形式に変換したデータが入力画像と同じフォルダに保存される。

$ ./jpg2svg.sh result/predict.jpg

実行結果は以下のようになる。

![svg.PNG](https://qiita-image-store.s3.amazonaws.com/0/227399/869168ce-5049-6e3a-4b8e-a7eb085a93d5.png)


#  動作環境

- **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|　![00_yu_gothic_12pt.png](https://qiita-image-store.s3.amazonaws.com/0/227399/1daa2ef5-52fe-58d3-a985-69eae3526206.png)　|
|---|---|
|Berlin Sans FB| ![01_Berlin_Sans_FB_12pt.png](https://qiita-image-store.s3.amazonaws.com/0/227399/48a7d189-0d71-eff2-3445-2d5c1a05d55e.png)

以下を実行する。

```console
$ ./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`は作成されたデータの情報が格納されている。

```console
$ 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`は学習に使用するテストデータと学習データ。それぞれの中身を確認するには以下を入力する。

```console
$ Tools/npz2jpg.py result/test_128x128_000100.npz
```

![npz2jpg.jpg](https://qiita-image-store.s3.amazonaws.com/0/227399/a32a6c76-afc3-291a-8f4e-fa1cc80275aa.jpeg)


表示された画像の上段が入力画像（`yu_gothic`）で、下段が正解画像（作成したいフォント）。その他`Tools`の機能を利用したい場合は`Tools/README.md`を参照されたい。


## 2. 学習する

以下を実行する

```console
$ ./train.py
```

学習完了後、`result`フォルダに以下のデータが保存されていることを確認する

- `*.log`
- `*.model`
- `*_10.snapshot`
- `*_graph.dot`
- `*_train.json`
- `loss.png`

## 3. 学習で作成されたモデルを使用する

```console
$ ./predict.py result/*.model result/*_train.json Font/test.png
```

その他のパラメータ設定は`-h`で確認する。デモと同様のパラメータにしたい場合は`Model`にある`param.json`を参考にするとよい。

# おまけ

Bradley Hand ITCなどはどうしてもフォントが薄い色で生成されがち。これをDeep Learningで修正してもいいが、普通にフィルターを通した方が楽かと。詳細は以下を参照されたい。

[薄い画像をハッキリさせる](https://qiita.com/ka10ryu1/items/bb8f73a732e5da3a1abc)