Edited at

五十嵐響子画伯AIを作る その1 CNN


はじめに

head.jpg

五十嵐響子さんは「味わい深い絵を描く」ことで有名なアイドルです。これまでに公式でウサギとネコの絵を披露していますが、正直見わけられないので判別するCNNを組んでみました。


サンプル

6つしか見つかりませんでした。

ソース
ラベル

モバマスN ジューンブライド
ウサギ

劇場369話4コマ目
ネコ

劇場369話5コマ目
ネコ

デレステログイン画面
ネコ

デレポ
ウサギ

アイプロアイテム「響子の特製オムライス」
ウサギ

SSRあったかハートのウサギはあまりにひしゃげていたのでカットしました。ほとんどのサンプルがオムライスにケチャップで書かれたものなので、響子さんのお嫁さん特性がよくわかりますね。結婚したい。


画像処理・水増し

7サンプルだけだとCNNどころかSVMすら学習させるのは難しいので、水増しします。

参照文献を参考に、openCVで以下の処理を行いました。


  • ガウシアンノイズ

  • 上下左右反転

  • 平滑化(フィルタサイズを5x5から14x14まで変化)

その結果こんな感じで5280枚まで画像を増やすことができました。

無題.png


学習

読み込むときはグレースケールとしました。ケチャップだけを抽出したいので、thresholdをかけました。

マシンスペックがくそ雑魚なので、MNISTを参考に28x28x1を入力としました。


cnn.py

def cnn():

inputs = Input(shape=(28,28,1))
xx = Conv2D(32,(3,3))(inputs)
xx = Activation("relu")(xx)

xx = Conv2D(32,(3,3))(xx)
xx = Activation("relu")(xx)

xx = MaxPooling2D(pool_size=(2,2))(xx)
xx = Dropout(0.25)(xx)

xx = Conv2D(64,(3,3))(xx)
xx = Activation("relu")(xx)
xx = Conv2D(64,(3,3))(xx)
xx = Activation("relu")(xx)

xx = MaxPooling2D(pool_size=(2,2))(xx)
xx = Flatten()(xx)

xx = Dense(512)(xx)
xx = Activation("relu")(xx)
xx = Dropout(0.5)(xx)

xx = Dense(2)(xx)
outputs = Activation("softmax")(xx)

model = Model(input=inputs,output=outputs)

model.compile(loss='categorical_crossentropy',
optimizer=keras.optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True),
metrics=['accuracy'])

return model



結果

test accuracyが100%になりました。ただ水増ししたとはいえサンプルが絶対的に少なすぎるので、これが過学習なのかどうかも判定するすべさえもありません。響子さんにテストデータを描いてもらうしかないですね。

ちなみに、自分で書いた絵を判定させてみました。

myfile.png

AI響子さん曰くこれは「ネコ」だそうです。僕はネコのつもりで描きました。


ソース

github

https://github.com/bluepost59/kyoko_CNN