케라스에서는 이미 학습이 완료된 이미지 분류모델들을 모듈로 공유하고 있습니다.
그래서 해당 모델들을 쓰는 법을 배워보겠습니다.
해당 모델들은 Imagenet이라는 데이터셋으로 학습을 하였고, 입력을 받을수 있는 이미지크기부터 RGB 배열까지 달라 사용에 유의해야합니다.
from tensorflow.keras.applications import VGG16
from tensorflow.keras.applications import VGG19
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications import ResNet152
from tensorflow.keras.applications import ResNet152V2
from tensorflow.keras.applications import Xception
from tensorflow.keras.applications import NASNetLarge
먼저 모듈들을 호출하는 법을 보겠습니다.
tensorflow.keras.aplications 안에 모델들이 있고, 저희가 선언한 모델보다 많은 모델들이 있습니다.
위에서 말했듯이 모델마다 크기, 색상이 다르기에 전처리 작업이 필요로 하기 때문에 전처리 모듈을 선언하겠습니다.
from tensorflow.keras.applications import imagenet_utils
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocessing.image import load_img
이미지를 불러오고 배열형식으로 변경해주고, 디코딩 해주는 등 여러 기능들을 사용할 것입니다.
함수를 임포트 시켰으니 모델을 불러오겠습니다.
model = VGG16(weights="imagenet")
VGG 모델을 불러왔습니다.
weight라는 매개변수가 있고, 2가지의 속성이 있습니다.
첫 번째는 Imagenet이 학습된 모델과 None이라는 아무것도 학습되지 않은 모델입니다.
학습이 된 모델은 imagenet을 제외하고는 없습니다.
모델을 불러왔으니 입력데이터를 처리를 해보겠습니다.
input_image_shape = (224, 224)
vgg에서 사용되는 이미지의 크기는 224 x 224 이며 Xception과 Nasnet을 제외한 모델들의 이미지의 크기는 224 x 224로 고정 되어있습니다.
Xception의 이미지의 크기는 299 x 299이고, Nasnet은 331 x 331을 사용 가능합니다.
input_image_preprocess = imagenet_utils.preprocess_input
image = load_img(image_path, target_size=input_image_shape)
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
image = input_image_preprocess(image, mode='caffe')
이번에는 이미지를 불러오겠습니다.
image_path에는 사용할 이미지의 경로와 파일명을 적고, 이전에 설정한 shape로 이미지를 불러옵니다.
이미지를 불러온 다음 img_to_array로 이미지를 배열로 바꾸고 shape를 보게 되면 224 x 224 x 3의 형태를 띄게됩니다. 하지만 이대로 학습에 사용하게 되면 차원오류가 발생하게 됩니다.
이를 방지하기 위하여 expand_dims()를 사용하여 3차원이 아닌 4차원의 형태로 바꾸게 됩니다. 1 x 224 x 224 x 3 형태가 되는 것입니다.
이미지 차원 변경까지 완료하였으면 전처리를 하게 되는데 mode라는 매겨변수가 존재합니다. 값은 caffe와 tf 2개가 있으며 “Xecption”, “NASNet”, “Resnet152v2” 등 최신모델들을 tf를 사용하고, 그 전 모델들은 caffe를 사용하게 됩니다.
VGG도 예전 모델이기 때문에 caffe로 전처리를 하겠습니다.
전처리 까지 완료되었으므로 이제는 예측을 해보겠습니다.
왜 학습을 안하나요? 라고 생각 할 수 가 있습니다.
이전에도 말했지만 해당 모델은 Imagenet으로 학습이 완료된 모델을 불러왔기 때문에 학습을 시킬 필요가 없는 것입니다.
preds = model.predict(image)
prediction = imagenet_utils.decode_predictions(preds)
전처리가 완료된 이미지를 모델에 넣고 나온 예측값은 인코딩 되어 있기 때문에 읽을 수 없어 디코딩 작업이 필요로 합니다.
해당 모델이 이미지를 어떤 라벨로 인식했는지는 prediction으로 나오게 됩니다.
이를 출력하게 되면
print(prediction[0][0])
('n02132136', 'brown_bear', 0.9999715)
라벨과 정확도가 출력이 됩니다.
다른 모델들로 실습을 하지 않은 것은 명칭만 바꾸게 되면 사용이 가능합니다.
Resnet50을 사용하고 싶다면 vgg16에서 Renset50으로만 바꿔서 사용이 가능하고 Xception을 사용한다면 모델명과 이미지의 크기, 전처리 3개만 바꾸면 사용이 가능합니다.
작성자 김강빈 kkb08190819@gmail.com / 이원재 ondslee0808@gmail.com
'【3】최근 CNN 응용 모델 이해하고 사용하기' 카테고리의 다른 글
ResNet (이론) (0) | 2020.02.09 |
---|---|
GoogleNet (인셉션 모듈/평균 풀링/보조 분류기) (1) | 2020.02.08 |
VGGNet (이론) (0) | 2020.02.07 |