PR

畳み込みニューラルネットワーク(CNN)の魅力とウォーリーを探せプロジェクトその2

AI/MachineLearning

機械学習の世界に足を踏み入れると、その広がりと可能性に驚かされます。特に、畳み込みニューラルネットワーク(CNN)は、画像分析の分野で優れた成果を上げています。今回は、CNNの基本的な概念から始め、実践的なプロジェクトとして「ウォーリーを探せ」の絵本に挑戦する構想を紹介します。

スポンサーリンク

はじめに

前回の記事では、「ウォーリーを探せ」の主人公ウォーリーを自動認識するプロジェクトに挑戦することを決めました。今回は教師用データを集め、Chainerを用いたCNNの構築に挑戦します。

スポンサーリンク

教師データの収集

画像認識AIを学習させるには、教師データが必要不可欠です。ウォーリーの絵本から手作業で画像を切り抜き、約40枚のウォーリー画像と100枚の非ウォーリー画像を用意しました。

問題その1:画質

購入した本がポケット版であったことから原本の1/4程度に縮小されているため、画質が粗いという課題が発生しました。後の学習プロセスで工夫することにしました。

問題その2:ウォーリー作画問題

画像を切り抜きながら感じた大きな問題です。

よく漫画とかで初期のころと最後の方で絵のタッチとかが変わることってあると思うのですが、それと似たような現象がウォーリーを探せにも起こっています。機械学習をさせる側にしては大きな問題です。参考に抜き出したデータをいくつか貼ります。

こう見るとこれらが全部ウォーリーだと判断して見つけられる人間の補完力に驚かせられます。

スポンサーリンク

ライブラリの選定とインストール

Chainerを用いて学習を実行しました。40エポックの学習で早い段階で収束が確認されましたが、実際の判別性能は次回のテストで確認する予定です。ただし、Chainerは開発をやめてしまったので今は利用は推奨されません。今なら、PyTorchなどを利用しましょう。

スポンサーリンク

CNN モデルの構築

畳み込みニューラルネットワーク(CNN)を使ってモデルを構築しました。6層のディープラーニングモデルを設計し、入力画像からウォーリーか否かを2値分類できるようにしています。

# coding=utf-8 
from chainer import Chain 
import chainer.links as L 
import chainer.functions as F 

class MyCNN(Chain):
    def __init__(self, n_out):
        super(MyCNN, self).__init__(
            conv1=L.Convolution2D(in_channels=1, out_channels=10,               
                                  ksize=5, stride=1, pad=2), 
            conv2=L.Convolution2D(in_channels=None, out_channels=20,  
                 ksize=5, stride=1, pad=2),
            l1=L.Linear(None, 500),
            l2=L.Linear(500, 500),
            l3=L.Linear(500, n_out)
        )
    def forward(self, x):
        h1 = self.conv1(x)
        h2 = self.conv2(h1)
        h3 = F.relu(self.l1(h2))
        h4 = F.relu(self.l2(h3))
        out = self.l3(h4)
        return out
スポンサーリンク

学習とモデルの保存

収集した教師データを使い、ミニバッチ学習による反復学習を実施しました。損失関数にはソフトマックス関数を使用し、40エポックで収束しました。学習済みモデルをファイルに保存しました。

model = cnn.MyCNN(2) 
optimizer = optimizers.Adam() 
optimizer.setup(model) 
n_epoch = 40 
batch_size = 30 

for epoch in range(n_epoch):
    sum_loss = 0
    sum_accuracy = 0
    perm = np.random.permutation(N)
    for i in range(0, N, batch_size):
        x = Variable(data[perm[i:i+batch_size]]) 
        t = Variable(label_data[perm[i:i+batch_size]])
        y = model.forward(x) model.zerograds() 
        loss = F.softmax_cross_entropy(y, t) 
        acc = F.accuracy(y, t) 
        loss.backward() 
        optimizer.update()

serializers.save_npz("wally.npz", model)
スポンサーリンク

次のステップ

次は収束したモデルを使って、実際にウォーリーの認識が可能かテストを行う予定です。プロジェクト全体を通して、機械学習の基礎からモデル構築、学習プロセスまで実践的に学ぶことができました。

コメント

タイトルとURLをコピーしました