- 이번에는 keras에 기본적으로 포함되어 있는 VGG16으로 실제 제차인 아방이를 맞춰보도록 하겠습니다.
VGG16으로 빠르게 물건 예측하기¶
- vgg는 imagenet으로 미리 훈련시켜놓은 모델이며, 이를 기반으로 새로운 이미지 데이터를 판별해 낼수 있습니다. 2014년 당시는 개선율이 꽤 좋았기 때문에 종종 쓰이는 모델입니다.
In [10]:
from keras.models import Model
from keras.preprocessing import image
from keras.optimizers import SGD
from keras.applications.vgg16 import VGG16, decode_predictions
import matplotlib.pyplot as plt
import numpy as np
import cv2
모델 로딩¶
로딩은 VGG16을 불러오기만 하면 모든게 완성이 됩니다.
케라스의 도큐멘트에 따르면 다음과 같은 어플리케이션을 쓸 수 있습니다.
Model | Size | Top-1 Accuracy | Top-5 Accuracy | Parameters | Depth |
---|---|---|---|---|---|
Xception | 88 MB | 0.790 | 0.945 | 22,910,480 | 126 |
VGG16 | 528 MB | 0.713 | 0.901 | 138,357,544 | 23 |
VGG19 | 549 MB | 0.713 | 0.900 | 143,667,240 | 26 |
ResNet50 | 98 MB | 0.749 | 0.921 | 25,636,712 | – |
ResNet101 | 171 MB | 0.764 | 0.928 | 44,707,176 | – |
ResNet152 | 232 MB | 0.766 | 0.931 | 60,419,944 | – |
ResNet50V2 | 98 MB | 0.760 | 0.930 | 25,613,800 | – |
ResNet101V2 | 171 MB | 0.772 | 0.938 | 44,675,560 | – |
ResNet152V2 | 232 MB | 0.780 | 0.942 | 60,380,648 | – |
ResNeXt50 | 96 MB | 0.777 | 0.938 | 25,097,128 | – |
ResNeXt101 | 170 MB | 0.787 | 0.943 | 44,315,560 | – |
InceptionV3 | 92 MB | 0.779 | 0.937 | 23,851,784 | 159 |
InceptionResNetV2 | 215 MB | 0.803 | 0.953 | 55,873,736 | 572 |
MobileNet | 16 MB | 0.704 | 0.895 | 4,253,864 | 88 |
MobileNetV2 | 14 MB | 0.713 | 0.901 | 3,538,984 | 88 |
DenseNet121 | 33 MB | 0.750 | 0.923 | 8,062,504 | 121 |
DenseNet169 | 57 MB | 0.762 | 0.932 | 14,307,880 | 169 |
DenseNet201 | 80 MB | 0.773 | 0.936 | 20,242,984 | 201 |
NASNetMobile | 23 MB | 0.744 | 0.919 | 5,326,716 | – |
NASNetLarge | 343 MB | 0.825 | 0.960 | 88,949,818 | – |
In [29]:
model = VGG16(weights = 'imagenet', include_top=True)
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy')
자동차인지 아닌지 애매한 물건 맞춰보기¶
- 이미지가 굉장히 작으며, 224픽셀로 늘리더라도 알아보기가 힘듭니다.
In [5]:
from pylab import imread
import matplotlib.pyplot as plt
image = imread('augmentation/cifar_0_23.jpeg')
plt.imshow(image)
Out[5]:
In [3]:
im = cv2.resize(cv2.imread('./augmentation/cifar_0_24.jpeg'), (224,224))
im = np.expand_dims(im, axis = 0)
예측 결과 확인¶
- 예측결과로 보아하니, 정말 상관없는것들로만 예측을 하였습니다.
- petri_dish는 아래와 같은 접시로 뭐 그다지 비슷하지조차 않습니다.
- 실제 모델을 예측한것또한 많은 클래스에 복잡하게 흩어진것을 알수있습니다.
In [19]:
out = model.predict(im)
print('Predicted:', decode_predictions(out, top=3)[0])
plt.plot(out.ravel())
plt.show()
고화질 사진으로 예측결과 확인¶
- 제 차를 한번 예측해보겠습니다. 신형 아방이입니다. 예쁘죠?
- 아 나만 예쁜가?
In [30]:
im = cv2.resize(cv2.imread('./avante.jpg'), (224,224))
im = np.expand_dims(im, axis = 0)
image = imread('./avante.jpg')
plt.imshow(image)
Out[30]:
예측결과 확인¶
- minivan, sports_car, grille 등으로 제대로 예측한걸 알수있습니다.
- 자동차의 그릴이 하도 크게 나온지라, 이를 예측을하기도 하네요.
- 최근 현대차의 매력은 큰 그릴 아시지요? 깔깔
In [31]:
out = model.predict(im)
print('Predicted:', decode_predictions(out, top=3)[0])
plt.plot(out.ravel())
plt.show()