らんだむな記憶

blogというものを体験してみようか!的なー

DeepAA (3)

少し論文の内容も確認しておこう。

論文によると、12-pt の MS Pゴシックでのアスキーアートを考慮している。MS ゴシック、MS 明朝相当のフォントについて知る | 産業向け製品 | リコー からわかるように、$96/72 \times 12 = 16$ dot のビットマップフォントのグリフが呼ばれることになる。また、どうやら 64x64 のウィンドウをスライドさせながら、中央部位に対応するグリフを推論する 10 層の畳み込みニューラルネットワークを使っているようである。Figure 1 のサンプルでは、耳たぶの辺りに確かに「7」のビットマップグリフが存在し、これを推論するということのようである。

train.py も簡単に TensorFlow 2 対応できるので Colab K80 で実行してみる。3 分で 1370 ステップくらいで、1 エポックが 11285 ステップのようなので、25 分かかる見通し。最大 256 エポックなので、最大 107 時間くらい。実際には EarlyStopping で停止するのかもしれない。
Tensorflow 2.3.0 is much slower than PyTorch 1.4.0 in backward propagation. (20 times slower) · Issue #42475 · tensorflow/tensorflow · GitHub にヒットしているわけではないとは思うのだが、推論が遅い・・・。

訓練も推論も Colab 上で実行できる状態になったので、モデルを触ってみよう。当たり前だがモデルの構造は DeepAA (2) - らんだむな記憶 の通りである。
バッチの中身は例えば以下のようにすれば画像化できる。

for batch_x, batch_y in gen:
    break

im = Image.fromarray(np.squeeze((batch_x[0] * 255).astype(np.uint8)))

これを見てみると、64x64 の画像で以下のような感じになっており、グリフの候補数に対応する 411 次元の数ベクトル空間で one-hot エンコードされた batch_y を使って 'categorical_crossentropy' で誤差が計測される。

f:id:derwind:20220316022853p:plain

と、まぁ、中心の関心領域と周囲のコンテキストから関心領域に一番マッチする MS Pゴシックのグリフを推論する畳み込みニューラルネットワークを訓練するのが train.py の役割らしい。実際の推論時には、output.py で(16 dot + スペース 2 dot の計 18 dot 分の意味だろうけど)ストライド 18 でウィンドウをスライドさせながら、入力画像を捜査して中央の関心領域に対応するグリフを推論して配置することでアスキーアート化しているようだ。なるほどね、面白い。