깃허브 예시 프로젝트🔗: https://github.com/EvilPort2/Sign-Language
EvilPort2/Sign-Language
A very simple CNN project. Contribute to EvilPort2/Sign-Language development by creating an account on GitHub.
github.com
[예시 프로젝트 실행] Anaconda로 실행
requirements_cpu.txt 수정 (버전 지정)
- tensorflow==1.5.0
- keras==2.1.5
- opencv-python==3.4.2.16
[cnn_keras.py 코드 분석]
- 라이브러리 및 모듈
import pickle
from glob import glob
- pickle: 텍스트 이외의 자료형을 파일로 저장하기 위해 제공하는 파이썬 모듈
- glob: 파일들의 목록을 뽑을 때 사용
- cnn_model()
def cnn_model():
num_of_classes = get_num_of_classes()
model = Sequential()
model.add(Conv2D(16, (2,2), input_shape=(image_x, image_y, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(3, 3), padding='same'))
model.add(Conv2D(64, (5,5), activation='relu'))
model.add(MaxPooling2D(pool_size=(5, 5), strides=(5, 5), padding='same'))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_of_classes, activation='softmax'))
sgd = optimizers.SGD(lr=1e-2)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
- 3개의 컨볼루션 레이어를 깔고 Flatten()
- CNN에서 컨볼루션 레이어나 맥스풀링을 거치면 주요 특징만 추출되고 전결합층에 전달되어 학습됨.
- 손실함수는 categorical_crossentropy 사용
- 크로스 엔트로피 형태의 오차함수를 사용하면 출력 레이어에서 활성화 함수의 도함수에 의한 영향을 제거할 수 있다고 함.
- 옵티마이저는 SGD(확률적경사하강법) 사용
- 🤔Adam을 사용하지 않은 이유는?
[전체 코드]
import numpy as np
import pickle
import cv2, os
from glob import glob
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.utils import np_utils
from keras.callbacks import ModelCheckpoint
from keras import backend as K
K.set_image_dim_ordering('tf')
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 로깅 제어
def get_image_size():
img = cv2.imread('gestures/1/100.jpg', 0)
return img.shape
def get_num_of_classes():
return len(glob('gestures/*'))
image_x, image_y = get_image_size()
def cnn_model():
num_of_classes = get_num_of_classes()
model = Sequential()
model.add(Conv2D(16, (2,2), input_shape=(image_x, image_y, 1), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))
model.add(Conv2D(32, (3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(3, 3), padding='same'))
model.add(Conv2D(64, (5,5), activation='relu'))
model.add(MaxPooling2D(pool_size=(5, 5), strides=(5, 5), padding='same'))
model.add(Flatten()) # CNN에서 컨볼루션 레이어나 맥스풀링을 거치면 주요 특징만 추출되고 전결합층에 전달되어 학습됨.
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_of_classes, activation='softmax'))
sgd = optimizers.SGD(lr=1e-2)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
filepath="cnn_model_keras2.h5"
checkpoint1 = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint1]
from keras.utils import plot_model
plot_model(model, to_file='model.png', show_shapes=True)
return model, callbacks_list
def train():
with open("train_images", "rb") as f:
train_images = np.array(pickle.load(f))
with open("train_labels", "rb") as f:
train_labels = np.array(pickle.load(f), dtype=np.int32)
with open("val_images", "rb") as f:
val_images = np.array(pickle.load(f))
with open("val_labels", "rb") as f:
val_labels = np.array(pickle.load(f), dtype=np.int32)
train_images = np.reshape(train_images, (train_images.shape[0], image_x, image_y, 1))
val_images = np.reshape(val_images, (val_images.shape[0], image_x, image_y, 1))
train_labels = np_utils.to_categorical(train_labels)
val_labels = np_utils.to_categorical(val_labels)
print(val_labels.shape)
model, callbacks_list = cnn_model()
model.summary()
model.fit(train_images, train_labels, validation_data=(val_images, val_labels), epochs=20, batch_size=500, callbacks=callbacks_list)
scores = model.evaluate(val_images, val_labels, verbose=0)
print("CNN Error: %.2f%%" % (100-scores[1]*100))
#model.save('cnn_model_keras2.h5')
train()
K.clear_session();
'프로그래밍 > Developer Student Clubs' 카테고리의 다른 글
[YOLO 웹으로 구현한 프로젝트 조사] (0) | 2020.02.02 |
---|---|
ASL, Digit 데이터 수집 (0) | 2020.01.16 |
[삽질일기] GCP에서 GPU 할당받고 우분투 가상환경 실행 (2) | 2020.01.12 |
[삽질일기] MAC OS Parallels Ubuntu 18.04 | YOLO v2 실행 (0) | 2020.01.12 |
핸들랭 1분기 활동 및 2분기 계획 (0) | 2020.01.12 |