공기정화 식물-인공지능-IOT

Keras에 디펜바키아 Fresh/Wilt 학습 판정

coding art 2020. 7. 20. 15:49
728x90

참조

How to do Image Classification on custom Dataset using TensorFlow | by Aryan Pegwar | Analytics Vidhya | Medium

 

How to do Image Classification on custom Dataset using TensorFlow

Image classification is basically giving some images to the system that belongs to one of the fixed set of classes and then expect the…

medium.com

 

공기정화식물 디펜바키아를 실내에서 키워보면 일주일 단위로 수분 건조 상태에 직면함을 Capacitive 수분센서로 측정해 보면 알 수 있다. 하지만 센서 측정 결과 몇 %에서 식물이 수분 부족으로 인해 말라비틀어지게 되는지 확니하기란 쉽지 않다. 특정한 잎줄기를 관찰해 보면 수분이 극심하게 부족할 경우 축 늘어져 버리는 현상이 발생한다. 동물이 심한 활동 후에 땀을 많이 흘리면 체액 성분 변화가 일어나면서 에너지 부족으로 힘이 빠지면서 심한 갈증이 나는 것과 마찬가지 원리일 것이다.

즉 식물의 체액이 정상으로서 외관상 싱싱한 상태일 때와 극심한 수분부족으로 인해 상당수의 잎 줄기들이 축 늘어져 시들어버린 상태 두 가지 상태로 정리할 수 있다. 이 두 상태를 카메라로 인식하기 위해서 아래와 같이 싱싱한 상태와 시든 상태의 식물 모습을 VGA 급 이미지 데이터를 준비하자. 여기서는 최소 수량인 10개씩의 이미지를 준비하였고 그 중 20%2개씩을 무작위로 스플릿하여 테스트용으로 사용하였다.

 

Keras에 의한 학습 및 시험 결과 Cost 함수가 잘 수혐하였고 인식율은 75% 가 얻어졌다.

#Fresh_Wilt.py

 

data_root = ("D:\세균이미지 영상\imagedata\Dataset")
IMAGE_SHAPE = (224, 224)
TRAINING_DATA_DIR = str(data_root)
datagen_kwargs = dict(rescale=1./255, validation_split=.20)
import tensorflow as tf
valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(**datagen_kwargs)
valid_generator = valid_datagen.flow_from_directory(
TRAINING_DATA_DIR,
subset="validation",
shuffle=True,
target_size=IMAGE_SHAPE
)
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(**datagen_kwargs)
train_generator = train_datagen.flow_from_directory(
TRAINING_DATA_DIR,subset="training",shuffle=True,
target_size=IMAGE_SHAPE
)

for image_batch, label_batch in train_generator:
break
image_batch.shape, label_batch.shape

for valid_image_batch, valid_label_batch in valid_generator:
break
valid_image_batch.shape, valid_label_batch.shape

label_batch[0:2]

print (train_generator.class_indices)

import matplotlib.pyplot as plt
plt.imshow(valid_image_batch[2])

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.constraints import maxnorm
from keras.optimizers import Adam
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils

model = Sequential([
Conv2D(64,(3,3),activation = 'relu',input_shape=(224,224,3)),
MaxPooling2D(2,2), Flatten(),
Dense(128,activation = 'relu'),
Dense(2, activation = 'softmax')
])
model.summary()

optimizer = Adam(lr=1e-3)
model.compile(
optimizer=optimizer,
loss='categorical_crossentropy',
metrics=['acc'])

valid_image_batch.shape, valid_label_batch.shape
model.fit( train_generator, epochs=1,
validation_data=valid_generator)

import numpy as np
steps_per_epoch = np.ceil(train_generator.samples/train_generator.batch_size)
val_steps_per_epoch = np.ceil(valid_generator.samples/valid_generator.batch_size)
hist = model.fit( train_generator, epochs=100, verbose=1,
steps_per_epoch=steps_per_epoch,
validation_data=valid_generator,
validation_steps=val_steps_per_epoch).history

final_loss, final_accuracy = model.evaluate(valid_generator, steps = val_steps_per_epoch)
print("Final loss: {:.2f}".format(final_loss))
print("Final accuracy: {:.2f}%".format(final_accuracy * 100))

import matplotlib.pyplot as plt
plt.figure()
plt.ylabel("Loss (training and validation)")
plt.xlabel("Training Steps")
plt.ylim([0,50])
plt.plot(hist["loss"])
plt.plot(hist["val_loss"])
plt.figure()
plt.ylabel("Accuracy (training and validation)")
plt.xlabel("Training Steps")
plt.ylim([0,1])
plt.plot(hist["acc"])
plt.plot(hist["val_acc"])