Chainerでフォントを識別してみる (2)

前回、二つのフォントをいい感じに識別できていたので、識別対象フォントを12に増やしてみた。

今回識別対象にしたフォントたち

Helvetica
f:id:mizti:20161204123136p:plain
Bodoni
f:id:mizti:20161126200655p:plain
Futura
f:id:mizti:20161204123102p:plain
Optima
f:id:mizti:20161204123045p:plain
Clarendon
f:id:mizti:20161204123149p:plain
GillSans
f:id:mizti:20161204123203p:plain
Caslon
f:id:mizti:20161204123216p:plain
Garamond
f:id:mizti:20161204123227p:plain
Avenir
f:id:mizti:20161204123240p:plain
Times New Roman
f:id:mizti:20161204123251p:plain
American Typewriter
f:id:mizti:20161204123304p:plain
Trajan
f:id:mizti:20161204123322p:plain

訓練データとテストデータの構成

  • 訓練データは[a-mA-M]の64x64 グレースケール画像。画像ごとに位置はランダム
  • テストデータは[n-zN-Z]の64x64 グレースケール画像。同じく画像ごとに位置はランダム化してある

実験

試行1: 3層多層パーセプトロン(隠れ層ニューロン数100)

前回使ったのと々、隠れ層2層、出力層1層の多層パーセプトロン

=> 87%程度で識別率が頭打ちになった。2クラスへの識別だけであれば、同条件で97%まで行っていたので、
12クラスへの識別になって認識率が落ちたことが確認できる。

試行2: 3層多層パーセプトロン(隠れ層ニューロン数200)

2つの隠れ層の表現能力が足りないのかもしれないと思い、ニューロン数を200に増やしてみたパターン。

=> 90%程度で頭打ち。試行1よりかすかに識別率が上がった

試行3: CNN

CNN(畳み込みニューラルネットワーク)を導入。畳み込み+relu+Max Poolingを3セットの後にLinear層を2層。
epoch数100を超えたあたりで識別率が99.9%以上となった。

f:id:mizti:20161204134938p:plain

今後

・十分な汎化性能がありそうなので、多種多様な日本語フォントの識別を行ってみる
・各フォントにはItalicやBoldなどいろいろなスタイルもあるため、スタイル変更した際にも識別を行えるか試す
・スタイル転写とか使って、英字フォントから日本語フォント作れたら面白い気がする