Help us understand the problem. What is going on with this article?

中一が深層学習でAI作った話

More than 1 year has passed since last update.

前置き

おひさしぶりです!
半年以上前に「中学一年生がPythonの知識ゼロからAIを作るまで」という記事で意気込みを書いて以来すっかりqiitaを更新できず、気づいたらあと一日で中二になってしまうことに気づき慌ててこの記事を作成しております。あの頃と比べるとかなり成長したので最後まで見ていただければありがたいです。

この半年間何をしていたのか

前回のpart2を更新してからすぐにTECH::CAMPというプログラミングスクールに通わせていただきました。
そこでは、従来の機械学習(SVMとか)を学びました。そっから画像分類がしたくて深層学習の勉強を始めました。(深層4ヶ月目の新人)
今は強化学習に興味があるため、これを機に画像関係とはしばらく離れようと思ってます。

今回使うもの

スペック
iMac (Retina 4K, 21.5-inch, 2017)
メモリ 16GB
GPU nvidia GEFORCE GTX1080ti 11GB
ライブラリ バージョン
tensorflow-gpu 1.5.1
keras 2.1.5

本題

今回は信号機の分類をしていきたいと思います。
画像はgoogleで"赤信号","青信号","黄信号"と検索し、17枚くらい手動でダウンロードしました。なぜスクレイピングしないかというと、googleで検索したところ、写真の数が全然なくて、関係ない人がめっちゃ写っていたので、使える写真をダウンロードしていったら17枚ぐらいでした。
データの前処理をして、そっからテスト用に5枚ぐらいとっておき、後の12枚を水増ししました。

from PIL import Image
import os, glob
import numpy as np


classes = ["red", "blue", "yellow"]
num_classes = len(classes)
image_size = 50
num_testdata = 5


X_train = []
X_test = []
Y_train = []
Y_test = []

for index, classlabel in enumerate(classes):
    photos_dir = "./" + classlabel
    files = glob.glob(photos_dir + "/*.jpeg")
    for i, file in enumerate(files):
        if i >= 17: break
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((image_size, image_size))
        data = np.asarray(image)

        if i < num_testdata:
            X_test.append(data)
            Y_test.append(index)
        else:
            for angle in range(-20, 20, 5):

                img_r = image.rotate(angle)
                data = np.asarray(img_r)
                X_train.append(data)
                Y_train.append(index)


                img_trans = img_r.transpose(Image.FLIP_LEFT_RIGHT)
                data = np.asarray(img_trans)
                X_train.append(data)
                Y_train.append(index)



X_train = np.array(X_train)
X_test = np.array(X_test)
y_train = np.array(Y_train)
y_test = np.array(Y_train)


xy = (X_train, X_test, y_train, y_test)
np.save("./singou.npy", xy)

そして、今回はcnnを使いたいので、keras(tensorflowバックエンド)でプログラムを書いていきます。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import keras
import numpy as np


classes = ["red", "blue", "yellow"]
num_classes = len(classes)
image_size = 50


def main():
    X_train, X_test, y_train, y_test = np.load("./singou.npy")
    X_train = X_train.astype("float") / 256
    X_test = X_test.astype("float") / 256
    y_train = np_utils.to_categorical(y_train, num_classes)
    y_test = np_utils.to_categorical(y_test, num_classes)

    model = model_train(X_train, y_train, X_test, y_test)
    model_eval(model, X_test, y_test)

def model_train(X, y, X_test, y_test):
    model = Sequential()
    model.add(Conv2D(32,(3,3), padding='same',input_shape=X.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32,(3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

    model.add(Conv2D(64,(3,3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64,(3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(3))
    model.add(Activation('softmax'))

    opt = keras.optimizers.rmsprop(lr=0.00005, decay=1e-6)
    model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])
    model.fit(X, y, batch_size=28, epochs=500)


    model.save('./sky_cnn.h5')

    return model

def model_eval(model, X, y):
    scores = model.evaluate(X, y, verbose=1)
    print('Test Loss: ', scores[0])
    print('Test Accuracy: ', scores[1])


main()

こんな感じにしました。modelの部分はkeras公式ページのでいいかなーと思ったのでそれにしました。

これを何回か回した結果、80%~86%ぐらいの正答率でした。画像収集のところを手抜いたので仕方がないかなーと

test_red.jpeg

red, (100 %)
こんな感じでちゃんと分類できてました。

終わりに

今回はババっと作ったので少し適当になってしまったかもしれませんが、ちゃんと分類できていてよかったです。
最近ずっと理論を勉強していたため、実装能力がめっちゃ下がってました。本当は今回もtensorflow単体で書きたかったんですが、細かい文法とかめっちゃ忘れてたので、止むを得ずkerasで書きました。ちょっと悔しいです。

一応twitterやってるのでフォローしていただけると嬉しいです。@zenbooooon
だいたい暇なんで絡んでください。お願いします(^人^)

もっと面白みのあるものを作りたかった...

参考文献

https://qiita.com/mm_sys/items/c169fe0ef37862c39a30
人工知能プログラミングのための数学がわかる本←とてもおすすめです

__zenbo__
中学2年生になりました 機械学習の勉強してます 「ここはこの方がいいよ」などの指摘がありましたら、コメント宜しくお願いします
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした