[pix2pix] LINE CLOVAも採用する手書きフォント生成技術を動かしてみる

2022年1月1日土曜日

Artificial Intelligence

本記事では、pix2pixを使って、手書きフォントをAIに自動生成させる方法を紹介します。

アイキャッチ

pix2pixとは

画像から画像へと変換を行うGANを利用した画像生成技術です。

pix2pixのサンプル画像
出典: https://github.com/phillipi/pix2pix

上図は、pix2pixで実現できるタスクの一つですが、線画を入力すると、その線画の特徴を解釈して写真のような画像を出力します。
pix2pixは、2つのペアとなる画像間の特徴を学習し、ペアの一方を入力した場合に、もう一方との特徴を補完した画像を出力します。

CLOVA OCRはなぜこんなに認識精度が高いのか?AIで「手書きフォント」を作ったLINE CLOVAの開発秘話の記事で紹介されていますが、LINE社のCLOVA OCRにもこのpix2pixの技術が応用されています。

手書き文字を生成するためには、活字文字画像と手書き文字画像のペア画像を用意し、モデルをトレーニングします。
そして、活字文字画像を入力した際に、手書き文字画像を出力させます。

手書き画像出力の概念図

上図は、かなり簡略化していますが、手書き文字画像を生成するまでの概念図です。
特徴としては、モデルは活字から手書きへの補完方法を学習します。
どのような文字であるかはモデルは理解する必要がありません。
つまり、数百枚の手書き文字画像を学習させてしまえば、様々な活字文字画像を入力することによって、様々な手書き文字画像を生成できます。

pix2pixの導入手順

セットアップ①: conda環境構築

それでは早速、開発環境にpix2pixをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは、pix2pixをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

# python version 3.7のconda環境を作成
$ conda create -n pix2pix_handwritten_jp python=3.7 -y

# 作成した環境をアクティベート
$ conda activate pix2pix_handwritten_jp
$ cd pix2pix_handwritten_jp

# Proxy配下の場合は事前に下記を設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# githubからcode clone
# あとで修正
$ git clone https://github.com/kaz12tech/pix2pix_handwritten_jp.git
$ cd pix2pix_handwritten_jp/

# 関連するライブラリをインストール
$ conda install -c anaconda tensorflow-gpu==2.2.0 pillow scikit-learn

# tensorflow動作確認
$ python3 -c 'import tensorflow as tf; from tensorflow.python.client import device_lib; print(tf.__version__); device_lib.list_local_devices()'
2.2.0
...
StreamExecutor device (0): NVIDIA GeForce GTX 1080 Ti, Compute Capability 6.1
StreamExecutor device (1): NVIDIA GeForce GTX 1080 Ti, Compute Capability 6.1

以上でpix2pixの環境セットアップは完了です。

セットアップ②: 学習データの準備

環境セットアップの次に、学習データの準備を行います。
具体的には、活字文字画像と手書き文字画像のペア画像を作成していきます。

活字文字はメイリオを手書き文字は、今回は手書き風フォントモギハ・ペン字フォントを使用させていただきます。

$ python3 text2img.py --font_path font/meiryo.ttc --font_size 92 --img_size 64 --out_dir ./font_img
$ python3 text2img.py --font_path font/mogihaPen.ttf --font_size 92 --img_size 64 --out_dir ./font_img

この二つを実行するとそれぞれ、メイリオとモギハ・ペン字の一文字ごとの文字画像が生成されます。

メイリオサンプル
モギハ・ペン字サンプル

続いて生成したデータを学習データと、テストデータに振り分けます。
最後に、このままでは手書き風フォントを再現するモデルとなってしまうため入力画像にぼかし処理を付与します。

$ python3 split_train_test.py --input_dirA ./font_img/meiryo --input_dirB ./font_img/mogihaPen
$ python3 dataset_generator.py --path_a font_img/meiryo --path_b font_img/mogihaPen --img_size 64 --out_dir ./dataset --blur_size 4
学習データのサンプル

セットアップ③: モデルのトレーニング

最後にモデルをトレーニングします。
GPUの有無などの環境にもよりますが、約2時間ほど学習時間を要します。

手書き文字の出力

モデルに活字文字画像を入力して手書き文字画像を出力させた結果が以下の通りです。

出力結果サンプル
$ python3 pix2pix_2D_s.py --dataset ./dataset

学習エポック数や、入力画像とする手書き文字、ぼかし処理の有無などによっても出力結果は異なってきます。
つまり、様々な形状の手書き文字が生成できます。

まとめ

本記事では、pix2pixを使って、手書き文字画像を生成する方法を紹介しました。
このような方法で手書き文字画像を収集できれば、手書き文字認識の学習データの確保において大きなコストダウンを図りながら
精度向上を目指せそうですね。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  CLOVA OCRはなぜこんなに認識精度が高いのか?AIで「手書きフォント」を作ったLINE CLOVAの開発秘話

2.  論文 - Image-to-Image Translation with Conditional Adversarial Networks

3.  GitHub - phillipi/pix2pix

4.  GitHub - ngduyanhece/cascade-gan

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology