Python
機械学習
MachineLearning
DeepLearning
Keras

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

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に感想やアドバイスなどのコメントをいただけると嬉しいです。