[keras]색 있는 이미지 분류하기2

2018. 6. 3. 23:20Python-이론/python-인공지능2

색 있는 이미지 분류하기2


앞서 분류해놓은 이미지 데이터를 통해서 각 이미지의 카테고리를 판단해보는 프로그램을 만들어 보겠습니다.



from keras.models import Sequential
from keras.layers import Dropout, Activation, Dense
from keras.layers import Flatten, Convolution2D, MaxPooling2D
import h5py, os
import numpy as np
import cv2

categories = ["chair", "ant", "airplanes", "barrel", "bass",
              "crab", "camera", "butterfly", "elephant", "flamingo"]

nb_classes = len(categories)

X_train, X_test, Y_train, Y_test = np.load('./obj.npy')
print('Xtrina_shape', X_train.shape)

model = Sequential()
model.add(Convolution2D(32, (3, 3),
                        border_mode='same',
                        input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, (3, 3), border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='binary_crossentropy',
              optimizer='Adam',
              metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=32, nb_epoch=50)
score = model.evaluate(X_test, Y_test)
print('loss==>' ,score[0])
print('accuracy==>', score[1])

결과


이런식으로 결과가 나오는데 정확도가 96%정도 나오니 괜찮게 나왔다고 생각할 수 있다.  이제 부터 코드에 대해서 상세히 설명해보겠다. 


코드 설명 


1. model = Sequential()


keras를 통해 딥러닝 모델을 만들기 위해 층을 쌓을 준비가 되었다는 의미가 있다. 


2model.add(Convolution2D(32, (3, 3), border_mode='same', input_shape=X_train.shape[1:]))


이미지 데이터의 합성곱층을 만들 떄 사용합니다.  

1. 인자는 필터를 의미하는데 어떠한 수를 적어도 딱히 문제가 되는 것은 아니지만 필터의 수만큼 데이터를 출력하게 된다. 

2. 인자는 필터의 크기를 지정해줍니다. 위 에서는 3*3의 크기의 필터로 이미지를 반복해서 검사하며 특징을 찾아냅니다.

3. 인자는 border_mode에 valid와 same이 들어갈 수 있는데 valid는 유용한 특징만을 반환하여서 입력 이미지 크기와 출력이미지 크기는 서로 다릅니다. same은 입력이미지와 출력이미지 크기를 같게 반환해줍니다.  

4. 인자는 말그대로 입력되는 데이터의 형태를 반환합니다. ex: (64, 64, 3) 컬러는 3 그레이는 1


3. model.add(Activation('relu'))


Actibation은 활성화 함수를 사용할 수 있게 해줍니다. 활성화 함수의 종류에는 relu, softmax, sigmoid 등등이 있다. 이들의 특징은 개인이 찾아 보도록 하자 


4. model.add(MaxPooling2D(pool_size=(2, 2)))


maxpooling은 이미지의 사소한 특징 들을 무시합니다. 원래 이미지를 2*2의 크기로 자르는데 2*2의 픽셀중 가장 높은 값을 모아서 출력 이미지를 정합니다. 결론적으로 2*2크기의 필터를 사용하면 원래의 이미지의 1/2가 됩니다.

  

5. model.add(Flatten())


위와 같은 층들을 거쳐오면서 전결합층에 전달해주어야 하는데 1차원 데이터를 전달해주어야한다. 하지만 우리가 사용하고있는 이미지는 2차원 데이터인데 이와 같은 2차원 데이터를 1차원 데이터로 변경 시켜주는 것이 위의 코드이다. 


6. model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])


loss는 현재 가중치 세트를 평가 하는데 사용한 손실 함수입니다.


optimizer는 가중치를 최적화하는 데 사용하는 알고리즘을 선택한다. Adam, rmprop등이 있다.


metrics는 평가 척도를 나타내며 부류 문제에서는 보통 accuracy를 사용한다. 


7. model.fit(X_train, Y_train, batch_size=32, nb_epoch=50)

 

첫인자는 학습할 모델의 첫 데이터 입니다. 


두번째 인자는 학습할 데이터의 답입니다. 


batch_size=32는 수많은 데이터를 여러개의 작은 배치로 나누어 매개변수를 조정합니다. 


nb_epoch=50는 학습을 50번 정도 반복해서 학습합니다.






keras를 통해서 일반적인 CNN을 만들어 딥러닝을 실행해보았습니다. 3탄에서는 과연 무슨 이미지가 틀린건지 알아 보겠습니다.