フォントを生成するGANを作った話(前編)

2021 ISer Advent Calendar 19日目の記事です.
記事が長くなりそうでかつ19日が開いていたので,内容を2つに分けてお送りします.

突然ですが,皆さんはこのような経験はありませんか?

おお~.いかしたフォントだな~… なんのフォント使ってるんだろ?


………





このように,見つけたフォントがなんのフォントか知りたいのにどう検索すればいいのかわからない….

じゃあ,自分で作ればいいじゃない!


ということで作られたのがこちらになります.


概要

目的のフォントで描画した画像の組を複数と,変換したい文字を入力することで,その文字を目的のフォントで描画した画像を生成するモデルを訓練するGANを作成しました.

大体こんな感じ

実装

Generator部分について,実際の実装をもう少し細かく見ると以下のようになっており,文字のエンコードをする部分,フォントのエンコードをする部分,それらをもとに画像を生成する部分の3つに分けられます.

大体こんな感じ

文字,フォントのエンコードをする部分ではEfficientNetという画像認識モデル[1]を,生成する部分ではStyleGANという画像生成モデルを用いており,この全体の構成はpixel2style2pixelを基にしています.

これらのモデルについての説明は様々なサイトで記事にされているのでそちらに譲ります.

また,入力した画像がGeneratorが生成したものか,既存のフォントでレンダリングしたものかを判別するDiscriminatorも,EfficientNetを基にしております.

データ収集,チェック

ネットワークを作ったところで早速訓練と行きたいところですが,まずはデータの収集とそのチェックがあります.画像に比べれば一枚一枚チェックしなくて言い分楽ですが,それでも検査しなければいけないことは沢山あります.
例えば,

  • 英数字,かな,漢字のうちどれに対応しているか(英数字だけ,かなだけ,ごく一部の文字だけに対応など,いろいろなパターンがある)[2]
  • アルファベットの大文字小文字両方に対応しているか (英数字のみに対応するフォントで,小文字も大文字として表示しているフォントがたまにある)
  • (g, バックスラッシュなど,異なる字体が存在する文字の表記がデータセット内で統一されているか)

等があります.
この作業を効率化させるため,ipywidgetsというライブラリを使用しました.
画像のように,JupyterNotebook上でGUIを構築し,操作をすることができるので,ちょっとした作業におすすめです.

実際に作成したGUI

次回予告と近況

次回は訓練についてと(途中)結果について書きます.

この記事を公開する数日前にバグが発覚したのと,改善案を思いついたということもあり,現在急いで学習のやり直しをしております.
果たして後編までに間に合うんでしょうか().

使用させていただいた素材


  1. 厳密にはこれにmap2styleというpSpのモデルの一部を組み合わせたネットワーク ↩︎

  2. このチェックは自動化できそうに思うかもしれませんが,対応外の文字もレンダリングできてしまう上に,その結果もまちまち(何も表示されなかったり豆腐になったり)なので,実際に目視したほうが早いと思います. ↩︎