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

「エアコン消したっけ?」をAIでなくそう!

More than 1 year has passed since last update.

1.概要

CNNをつかって、家のエアコンのオン・オフを見分けるAIをつくりました。

2.はじめに

Aidemyで「ディープラーニングで画像認識モデルを作ってみよう!」の受講ルートを勉強しました。なにかアウトプットをしようと思って、この記事を書きました。

ぼくはエアコンのスイッチを消したか覚えてなくて気になることが多いです。そこで、AIでエアコンのオン・オフを判別できたら便利だなと思い作ってみました。

強迫性障害のひとにとってはすごく大事な問題です。友達に強迫性障害のような症状をもっているひとがいて、「ドアのカギを何度も確認したくなって辛い」と言っていました。

強迫性障害では、自分でもつまらないことだとわかっていても、そのことが頭から離れない、わかっていながら何度も同じ確認をくりかえしてしまうことで、日常生活にも影響が出てきます。意志に反して頭に浮かんでしまって払いのけられない考えを強迫観念、ある行為をしないでいられないことを強迫行為といいます。たとえば、不潔に思えて過剰に手を洗う、戸締りなどを何度も確認せずにはいられないといったことがあります。

強迫性障害 厚生労働省を参照)

3.準備

3.1写真を撮る

自分の家のエアコンのオン・オフを見分けたいので、オン・オフの写真をそれぞれ300枚ずつ撮りました。

また、エアコンの前にカメラを取り付けて実用化もしたいと思っています。だから、カメラを取り付けられそうなエアコン前の天井付近からの写真だけにしました。

ON OFF
IMG_0001.JPG IMG_0133.JPG

3.2実行環境

GPUが無料で使えるGoogle Colaboratory上で実行しました。GPUをつかうとCPUより数十倍も学習速度が速くなりとても便利です。

4.コード

ひとによって変わりそうなところだけ載せました

4.1画像を行列表示に変換

Udemyの【画像判定AI自作にチャレンジ!】TensorFlow・Keras・Python・Flaskで作る機械学習アプリ開発入門で勉強しました。

generate.py
classes = ["on", "off"]
num_classes = len(classes)
image_size = 100

##画像の読み込み

X = []
Y = []
for index, classlabel in enumerate(classes):
        photos_dir = "./" + classlabel
        files = glob.glob(photos_dir + "/*.JPG")
        for i, file in enumerate(files):
                if i >= 301: break
                image = Image.open(file)
                image = image.convert("RGB")
                image = image.resize((image_size, image_size))
                data = np.asarray(image)
                X.append(data)
                Y.append(index)

X = np.array(X)
Y = np.array(Y)

4.2 CNN

Aidemyの「CNNを用いた画像認識」で勉強したものを少し変えています。

cnn.py
model = Sequential()
model.add(Conv2D(32,(3,3), padding='same', input_shape=X_train.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(Dense(num_classes))
model.add(Activation('softmax'))

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

model.fit(X_train, y_train, batch_size=16, epochs=2, verbose=1)

5.結果

kekka.png
450枚の画像で学習して150枚の画像でテストしたところ、正解率は97.3%でした

kekka2.png
テスト画像の最初の10枚で結果を確認すると、すべて正解でした。(0がオンで、1がオフ)
写真が小さくてすみません

6.おわりに

エアコンの吹き出し口が開いてるか閉じてるかだけのちがいだったので、見分けるのは難しいかなあと思っていましたが、結構いい精度になりました。ほとんど同じ位置からの写真だったので簡単だったのかもしれません。

QiitaやTwitterに感想やアドバイスなどのコメントをいただけると嬉しいです。

it31415
ベンチャーで働くRailsエンジニア。Pythonを使ったAIの記事を書いて、第2回#Aidemynoteオーディエンス大賞受賞。中退→フリーター→無職からProgate・Aidemyで勉強して、自社開発ベンチャーのRailsエンジニアに転職。マイクロサービスを使ったWebサービスをゼロから作る現場で学んだことを投稿します。
https://note.mu/it31415
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
ユーザーは見つかりませんでした