CNN에 의한 학습 데이터

keras에서 CNN 직접 찍은 이미지로 시도
기본은이 기사를 참조하여 만들었습니다.

미묘하게 다를 뿐입니다.

세세한 부분은 스스로 조사해 어떻게든 했습니다.
엄청 움직였기 때문에 요시이므로 공부 부족입니다.

목적으로는 어떤 물건의 사진에서 OK와 NG를 판정하고 싶기 때문에
원본 데이터는 이미지 데이터 (640x480)입니다.
OK·NG 모두 1000장 사용하고 있습니다.

어디까지나 초보자가 도착한 결과를 메모로 남기는 것이 목적입니다.

환경



Windows10 64bit
Anaconda navigator
Jupiter notebook
파이썬 3.7.7
tensorflow 2.1.0
tensorflow-gpu 2.1.0
keras 2.3.1
numpy 1.18.1
matplotlib 3.1.3

위 환경에서 프로그램 구축

도서관



cnn.ipynb
import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Activation, Conv2D, Flatten, Dense,Dropout
from sklearn.model_selection import train_test_split
from keras.optimizers import SGD, Adadelta, Adagrad, Adam, Adamax, RMSprop, Nadam
from PIL import Image
import numpy as np
import glob
import matplotlib.pyplot as plt
import time
import os
from keras.optimizers import 에는 Adadelta 그냥 좋았습니다.
여러가지 시험하고 싶어서 넣고 있습니다. (결국 테스트 못했지만…)

각종 설정 관계



cnn.ipynb
#設定
batch_size = 16
epochs = 200

#画像ディレクトリ
test_dir ="画像保存しているディレクトリを指定"
folder = os.listdir(test_dir)

#元画像640x480をresizeする際の大きさ設定
x_image_size = 200#640→200
y_image_size = 200#480→200
dense_size  = len(folder)
batch_size 에 관해서는 다양한 사이트를 보는데 1·4·32 등등 설정치가 구르고 있었기 때문에
처음은 32로 돌려 보았습니다만 에러가 나와 어쩔 수 없게 되었으므로 16으로 설정하고 있습니다.
세세한 부분까지 조사 끊어지지 않았기 때문에 옳다고는 말할 수 없으면…
그냥 돌았기 때문에 요시로하고 있습니다.

화상 사이즈를 세로・가로로 여러가지 바꾸어 시험하기 위해서 나누어 설정하고 있습니다만
결과 200까지 떨어뜨리지 않으면 너무 무거워서 움직이지 않았습니다.
그래서 image_size = 200 하지만 문제 없습니다. (후의 기술은 일부 변경 필요)

이미지 로드



cnn.ipynb
X = []
Y = []
for index, name in enumerate(folder):
    dir = test_dir + name
    files = glob.glob(dir + "/*.jpg")
    for i, file in enumerate(files):
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((x_image_size, y_image_size))
        data = np.asarray(image)
        X.append(data)
        Y.append(index)

X = np.array(X)
Y = np.array(Y)
X = X.astype('float32')
X = X / 255.0

Y = np_utils.to_categorical(Y, dense_size)
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.15)

이번은 테스트를 15%로 한 정도로, 참고로 한 기사와 거의 변하지 않습니다.

CNN 모델링



cnn.ipynb
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(Dropout(0.5))
model.add(Dense(dense_size))
model.add(Activation('softmax'))

model.summary()

정직한 곳, 공부하면서이므로
어디를 어떻게 만지면 변화하는가? 에 대해서는 모르겠습니다.
keras 공식 사이트
여기를 보고 있습니다만, 아마추어에게는 이해할 수 없어요…

학습기 작성



cnn.ipynb
optimizers ="Adadelta"
results = {}

model.compile(loss='categorical_crossentropy', optimizer=optimizers, metrics=['accuracy'])
results[0]= model.fit(X_train, y_train, validation_split=0.2, epochs=epochs,batch_size=batch_size)

model_json_str = model.to_json()
open('model.json', 'w').write(model_json_str)
model.save('weights.h5');

솔직히, Qiita가 없으면 도착하는 일조차 할 수 없었습니다.
감사합니다.

결과



학습 결과


테스트 결과


처음에는 끔찍한 것으로 학습 결과가 가로 막대가된다는 결과였습니다.
그 때는 화상 데이터도 각 50장 정도로 적게
epoch 수도 20 정도였습니다.

어떤 분에게 「이미지가 생명」이라고 가르쳐 주셨습니다만, 바로 그대로의 결과가 되었다고 생각합니다.

후에는 이 데이터를 바탕으로 추론을 만들어 제대로 결과 나올지가 두근 두근입니다.

요약



왠지 데이터로는 만들 수 있었습니다.
'여러가지 시도' 부분이 압도적으로 부족한 것을 생각했습니다.
손을 움직이지 않으면 기억할 수 없다 · 알려고하지 않는 것을 다시 알 수있었습니다.

40세 전부터 시작하면 뇌가 거부하기 때문에 힘듭니다.

이상입니다.

좋은 웹페이지 즐겨찾기