Home [Tensorflow] CNN 모델의 발전
Post
Cancel

[Tensorflow] CNN 모델의 발전

CNN 모델의 발전

  • 1998: LeNet – Gradient-based Learning Applied to Document Recognition
  • 2012: AlexNet – ImageNet Classification with Deep Convolutional Neural Network
  • 2014: VggNet – Very Deep Convolutional Networks for Large-Scale Image Recognition
  • 2014: GooLeNet – Going Deeper with Convolutions
  • 2014: SppNet – Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  • 2015: ResNet – Deep Residual Learning for Image Recognition
  • 2016: Xception – Xception: Deep Learning with Depthwise Separable Convolutions
  • 2017: MobileNet – MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Application
  • 2017: DenseNet – Densely Connected Convolutional Networks
  • 2017: SeNet – Squeeze and Excitation Networks
  • 2017: ShuffleNet – ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
  • 2018: NasNet – Learning Transferable Architectures for Scalable Image Recognition
  • 2018: Bag of Tricks – Bag of Tricks for Image Classification with Convolutional Neural Networks
  • 2019: EfficientNet – EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

VGGNet(Visual Geometry Group Net)

  • 2014년 ILSVRC에서 2등 차지 (상위-5 오류율: 7.32%), 이 후의 수많은 연구에 영향을 미침

  • 특징
    • 활성화 함수로 ReLU 사용, Dropout 적용
    • 합성곱과 풀링 계층으로 구성된 블록과 분류를 위한 완전 연결계층으로 결합된 전형적인 구조
    • 이미지 변환, 좌우 반전 등의 변환을 시도하여 인위적으로 데이터셋을 늘림
    • 몇 개의 합성곱 계층과 최대-풀링 계층이 따르는 5개의 블록과, 3개의 완전연결계층(학습 시, 드롭아웃 사용)으로 구성
    • 모든 합성곱과 최대-풀링 계층에 padding='SAME' 적용
    • 합성곱 계층에는 stride=1, 활성화 함수로 ReLU 사용
    • 특징 맵 깊이를 증가시킴
    • 척도 변경을 통한 데이터 보강(Data Augmentation)
  • 기여

    • 3x3 커널을 갖는 두 합성곱 계층을 쌓은 스택이 5x5 커널을 갖는 하나의 합성곱 계층과 동일한 수용영역(ERF)을 가짐
    • 11x11 사이즈의 필터 크기를 가지는 AlexNet과 비교하여, 더 작은 합성곱 계층을 더 많이 포함해 더 큰 ERF를 얻음
    • 합성곱 계층의 개수가 많아지면, 매개변수 개수를 줄이고, 비선형성을 증가시킴
  • VGG-16 모델(16개 층)
  • VGG-19 모델(19개 층)
  • ImageNet에서 훈련이 끝난 후 얻게된 매개변수 값 로딩
  • 네트워크를 다시 처음부터 학습하고자 한다면 weights=None으로 설정, 케라스에서 무작위로 가중치를 설정함
  • include_top=False: VGG의 밀집 계층을 제외한다는 뜻
  • 해당 네트워크의 출력은 합성곱/최대-풀링 블록의 특징맵이 됨
  • pooling: 특징맵을 반환하기 전에 적용할 선택적인 연산을 지정
1
2
3
4
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg19 import VGG19, preprocess_input, decode_predictions
1
2
3
4
5
6
# weight은 imagenet에서 사용한 가중치를 사용
# 실제 가중치가 적용된 model을 다운로드
vggnet= VGG19(include_top=True, weights='imagenet',
              input_tensor=None, input_shape=None,
              pooling=None, classes=1000)
vggnet.summary()
1
2
# 웹에 있는 사진 다운
!wget -O dog.jpg https://www.publicdomainpictures.net/pictures/250000/nahled/dog-beagle-portrait.jpg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    --2023-03-09 14:20:19--  https://www.publicdomainpictures.net/pictures/250000/nahled/dog-beagle-portrait.jpg
    Resolving www.publicdomainpictures.net (www.publicdomainpictures.net)... 104.20.44.162, 104.20.45.162, 172.67.2.204, ...
    Connecting to www.publicdomainpictures.net (www.publicdomainpictures.net)|104.20.44.162|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 94395 (92K) [image/jpeg]
    Saving to: ‘dog.jpg’
    
    dog.jpg             100%[===================>]  92.18K  --.-KB/s    in 0.003s  
    
    2023-03-09 14:20:20 (29.1 MB/s) - ‘dog.jpg’ saved [94395/94395]
    
    


```python
# 다운로드한 dog.jpg를 terget_size로 줄여줌
# dog의 input은 [(None, 224, 224, 3)] 크기를 가짐
img = image.load_img('dog.jpg', target_size=(224, 224))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = vggnet.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
1/1 [==============================] - 0s 28ms/step
[[('n02088364', 'beagle', 0.83961403), ('n02089973', 'English_foxhound', 0.08818262), ('n02089867', 'Walker_hound', 0.062327106), ('n02088238', 'basset', 0.004562265), ('n02088632', 'bluetick', 0.0033385658)]]

## GoogLeNet, Inception

  • VGGNet을 제치고 같은 해 분류 과제에서 1등을 차지
  • 인셉션 블록이라는 개념을 도입하여, 인셉션 네트워크(Inception Network)라고도 불림

  • 특징
    • CNN 계산 용량을 최적화하는 것을 고려
    • 전형적인 합성곱, 풀링 계층으로 시작하고, 이 정보는 9개의 인셉션 모듈 스택을 통과 (해당 모듈을 하위 네트워크라고도 함)
    • 각 모듈에서 입력 특징 맵은 서로 다른 계층으로 구성된 4개의 병렬 하위 블록에 전달되고, 이를 서로 다시 연결
    • 모든 합성곱과 풀링 계층의 padding옵션은 'SAME'이며 stride=1 활성화 함수는 ReLU 사용
  • 기여
    • 규모가 큰 블록과 병목을 보편화
    • 병목 계층으로 1x1 합성곱 계층 사용
    • 완전 연결 계층 대신 풀링 계층 사용
    • 중간 소실로 경사 소실 문제 해결

1
from tensorflow.keras.applications.inception_v3 import InceptionV3, preprocess_input, decode_predictions
1
2
3
4
5
6
# include_top=True : top 부분 가져오기
# weights='imagenet' : imgnet의 가중치 그대로 사용
inception = InceptionV3(include_top=True, weights='imagenet',
                        input_tensor=None, input_shape=None,
                        pooling=None, classes=1000)
inception.summary()
1
!wget -O fish.jpg https://upload.wikimedia.org/wikipedia/commons/7/7a/Goldfish_1.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 14:37:13--  https://upload.wikimedia.org/wikipedia/commons/7/7a/Goldfish_1.jpg
Resolving upload.wikimedia.org (upload.wikimedia.org)... 103.102.166.240, 2001:df2:e500:ed1a::2:b
Connecting to upload.wikimedia.org (upload.wikimedia.org)|103.102.166.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4648040 (4.4M) [image/jpeg]
Saving to: ‘fish.jpg’

fish.jpg            100%[===================>]   4.43M  2.86MB/s    in 1.5s    

2023-03-09 14:37:16 (2.86 MB/s) - ‘fish.jpg’ saved [4648040/4648040]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 fish.jpg를 terget_size로 줄여줌
# fish의 input은 [(None, 299, 299, 3  0)] 크기를 가짐
img = image.load_img('fish.jpg', target_size=(299, 299))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = inception.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
1/1 [==============================] - 2s 2s/step
[[('n01443537', 'goldfish', 0.9748526), ('n02701002', 'ambulance', 0.0023246657), ('n02606052', 'rock_beauty', 0.0019062766), ('n02607072', 'anemone_fish', 0.0006647558), ('n09256479', 'coral_reef', 0.0004319898)]]

## ResNet(Residual Net)

  • 네트워크의 깊이가 깊어질수록 경사가 소실되거나 폭발하는 문제를 해결하고자 함
  • 병목 합성곱 계층을 추가하거나 크기가 작은 커널을 사용
  • 152개의 훈련가능한 계층을 수직으로 연결하여 구성
  • 모든 합성곱과 풀링 계층에서 패딩옵셥으로 'SAME', stride=1 사용
  • 3x3 합성곱 계층 다음마다 배치 정규화 적용, 1x1 합성곱 계층에는 활성화 함수가 존재하지 않음

1
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions
1
2
3
4
resnet = ResNet50(include_top=True, weights='imagenet',
                  input_tensor=None, input_shape=None,
                  pooling=None, classes=1000)
resnet.summary()
1
!wget -O bee.jog https://upload.wikimedia.org/wikipedia/commons/4/4d/Apis_mellifera_Western_honey_bee.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 14:46:48--  https://upload.wikimedia.org/wikipedia/commons/4/4d/Apis_mellifera_Western_honey_bee.jpg
Resolving upload.wikimedia.org (upload.wikimedia.org)... 103.102.166.240, 2620:0:862:ed1a::2:b
Connecting to upload.wikimedia.org (upload.wikimedia.org)|103.102.166.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2421052 (2.3M) [image/jpeg]
Saving to: ‘bee.jog’

bee.jog             100%[===================>]   2.31M  --.-KB/s    in 0.08s   

2023-03-09 14:46:48 (29.2 MB/s) - ‘bee.jog’ saved [2421052/2421052]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 bee.jpg를 terget_size로 줄여줌
# bee의 input은 [(None, 224, 224, 3  0)] 크기를 가짐
img = image.load_img('bee.jog', target_size=(224, 224))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = resnet.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
1/1 [==============================] - 1s 1s/step
[[('n02206856', 'bee', 0.9990982), ('n03530642', 'honeycomb', 0.000561837), ('n02190166', 'fly', 0.00014348973), ('n02727426', 'apiary', 0.0001017911), ('n02219486', 'ant', 5.7517515e-05)]]

## Xception

  • Inception module을 이용하여 depthwise convolution 적용

  • 기존의 Conv layer에서 얻은 feature map을 각 채널별로 다른 Conv layer에 적용하여 feature map을 얻음

1
from tensorflow.keras.applications.xception import Xception, preprocess_input, decode_predictions
1
2
3
4
xception = Xception(include_top=True, weights='imagenet',
                    input_tensor=None, input_shape=None,
                    pooling=None, classes=1000)
xception.summary()
1
!wget -O beaver.jpg https://upload.wikimedia.org/wikipedia/commons/6/6b/American_Beaver.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 14:52:46--  https://upload.wikimedia.org/wikipedia/commons/6/6b/American_Beaver.jpg
Resolving upload.wikimedia.org (upload.wikimedia.org)... 103.102.166.240, 2001:df2:e500:ed1a::2:b
Connecting to upload.wikimedia.org (upload.wikimedia.org)|103.102.166.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 186747 (182K) [image/jpeg]
Saving to: ‘beaver.jpg’

beaver.jpg          100%[===================>] 182.37K  --.-KB/s    in 0.006s  

2023-03-09 14:52:46 (28.0 MB/s) - ‘beaver.jpg’ saved [186747/186747]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 beaver.jpg를 terget_size로 줄여줌
# beaver input은 [(None, 299, 299, 3  0)] 크기를 가짐
img = image.load_img('beaver.jpg', target_size=(299, 299))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = xception.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
1/1 [==============================] - 1s 1s/step
[[('n02363005', 'beaver', 0.8280816), ('n02361337', 'marmot', 0.059717532), ('n02493509', 'titi', 0.004413159), ('n02442845', 'mink', 0.0024041226), ('n01883070', 'wombat', 0.0019850638)]]

MobileNet

  • 성능보다 모델의 크기 또는 연산 속도 감소
  • Depthwise conv와 Pointwise conv 사이에도 batch normalization과 ReLU를 삽입
  • Conv layer를 활용한 모델과 정확도는 비슷하면서 계산량은 9배, 파라미터 수는 7배 줄임
1
from tensorflow.keras.applications.mobilenet import MobileNet, preprocess_input, decode_predictions
1
2
3
4
mobilenet = MobileNet(include_top=True, weights='imagenet',
                      input_tensor=None, input_shape=None,
                      pooling=None, classes=1000)
mobilenet.summary()
1
!wget -O crane.jpg https://p1.pxfuel.com/preview/42/50/534/europe-channel-crane-harbour-crane-harbour-cranes-cranes-transport.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 14:58:51--  https://p1.pxfuel.com/preview/42/50/534/europe-channel-crane-harbour-crane-harbour-cranes-cranes-transport.jpg
Resolving p1.pxfuel.com (p1.pxfuel.com)... 172.64.201.22, 172.64.200.22, 2606:4700:e6::ac40:c916, ...
Connecting to p1.pxfuel.com (p1.pxfuel.com)|172.64.201.22|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 86911 (85K) [image/jpeg]
Saving to: ‘crane.jpg’

crane.jpg           100%[===================>]  84.87K  --.-KB/s    in 0.004s  

2023-03-09 14:58:52 (19.6 MB/s) - ‘crane.jpg’ saved [86911/86911]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 crane.jpg를 terget_size로 줄여줌
# crane input은 [(None, 224, 224, 3))] 크기를 가짐
img = image.load_img('crane.jpg', target_size=(224, 224))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = mobilenet.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
3
4
5
WARNING:tensorflow:5 out of the last 6 calls to <function Model.make_predict_function.<locals>.predict_function at 0x7f7aa7d3c8b0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.


1/1 [==============================] - 1s 809ms/step
[[('n03126707', 'crane', 0.95963544), ('n03216828', 'dock', 0.029736752), ('n03240683', 'drilling_platform', 0.0051688235), ('n03344393', 'fireboat', 0.0026515478), ('n04366367', 'suspension_bridge', 0.000502884)]]

DenseNet

  • 각 층은 모든 앞 단계에서 올 수 있는 지름질 연결 구성
  • 특징지도의 크기를 줄이기 위해 풀링 연산 적용 필요
  • 밀집 블록(dense block)과 전이층(transition layer)으로 구성
  • 전이층 : 1x1 컨볼루션과 평균값 풀링(APool)으로 구성

1
from tensorflow.keras.applications.densenet import DenseNet201, preprocess_input, decode_predictions
1
2
3
4
densenet = DenseNet201(include_top=True, weights='imagenet',
                      input_tensor=None, input_shape=None,
                      pooling=None, classes=1000)
densenet.summary()
1
!wget -O zebra.jpg https://upload.wikimedia.org/wikipedia/commons/f/f0/Zebra_standing_alone_crop.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 15:03:49--  https://upload.wikimedia.org/wikipedia/commons/f/f0/Zebra_standing_alone_crop.jpg
Resolving upload.wikimedia.org (upload.wikimedia.org)... 103.102.166.240, 2001:df2:e500:ed1a::2:b
Connecting to upload.wikimedia.org (upload.wikimedia.org)|103.102.166.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 188036 (184K) [image/jpeg]
Saving to: ‘zebra.jpg’

zebra.jpg           100%[===================>] 183.63K  --.-KB/s    in 0.007s  

2023-03-09 15:03:49 (24.8 MB/s) - ‘zebra.jpg’ saved [188036/188036]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 zebra.jpg를 terget_size로 줄여줌
# zebra input은 [(None, 224, 224, 3  0)] 크기를 가짐
img = image.load_img('zebra.jpg', target_size=(224, 224))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = densenet.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
3
4
5
WARNING:tensorflow:6 out of the last 7 calls to <function Model.make_predict_function.<locals>.predict_function at 0x7f7bb90f8700> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.


1/1 [==============================] - 4s 4s/step
[[('n02391049', 'zebra', 0.9312889), ('n01518878', 'ostrich', 0.019832587), ('n02423022', 'gazelle', 0.011593062), ('n02397096', 'warthog', 0.0046255025), ('n02422106', 'hartebeest', 0.003152003)]]

NasNet

  • 신경망 구조를 사람이 설계하지 않고, complete search를 통해 자동으로 구조를 찾아냄
  • 네트워크를 구성하는 layer를 하나씩 탐색하는 NAS 방법 대신, NasNet은 Convolution cell 단위를 먼저 추정하고, 이들을 조합하여 전체 네트워크 구성
  • 성능은 높지만, 파라미터 수와 연산량은 절반 정도로 감소
1
from tensorflow.keras.applications.nasnet import NASNetLarge, preprocess_input, decode_predictions
1
2
3
4
nasnet = NASNetLarge(include_top=True, weights='imagenet',
                      input_tensor=None, input_shape=None,
                      pooling=None, classes=1000)
nasnet.summary()
1
!wget -O notebook.jpg https://cdn.pixabay.com/photo/2016/07/11/03/35/macbook-1508998_1280.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 15:07:53--  https://cdn.pixabay.com/photo/2016/07/11/03/35/macbook-1508998_1280.jpg
Resolving cdn.pixabay.com (cdn.pixabay.com)... 104.18.14.16, 104.18.15.16, 2606:4700::6812:f10, ...
Connecting to cdn.pixabay.com (cdn.pixabay.com)|104.18.14.16|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 270631 (264K) [binary/octet-stream]
Saving to: ‘notebook.jpg’

notebook.jpg        100%[===================>] 264.29K  --.-KB/s    in 0.01s   

2023-03-09 15:07:54 (20.4 MB/s) - ‘notebook.jpg’ saved [270631/270631]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 notebook.jpg를 terget_size로 줄여줌
# notebook input은 [(None, 331, 331, 3  0)] 크기를 가짐
img = image.load_img('notebook.jpg', target_size=(331, 331))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = nasnet.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
1/1 [==============================] - 6s 6s/step
[[('n03832673', 'notebook', 0.79294485), ('n03642806', 'laptop', 0.048423648), ('n04264628', 'space_bar', 0.034534946), ('n03085013', 'computer_keyboard', 0.020163987), ('n03777754', 'modem', 0.011375744)]]

EfficientNet

  • EfficientNetB0인 작은 모델에서 주어진 Task에 최적화된 구조로 수정해나가는 형태
  • 복잡한 Task에 맞춰 모델의 Capacity를 늘리기 위해 Wide Scaling, Deep Scaling, 그리고 Resolution Scaling을 사용
  • EfficientNet은 Wide, Deep, Resolution을 함께 고려하는 Compound Scaling을 사용
1
from tensorflow.keras.applications.efficientnet import EfficientNetB1, preprocess_input, decode_predictions
1
2
3
4
eff = EfficientNetB1(include_top=True, weights='imagenet',
                      input_tensor=None, input_shape=None,
                      pooling=None, classes=1000)
eff.summary()
1
!wget -O plane.jpg https://upload.wikimedia.org/wikipedia/commons/1/12/Plane-in-flight.jpg
1
2
3
4
5
6
7
8
9
10
--2023-03-09 15:11:13--  https://upload.wikimedia.org/wikipedia/commons/1/12/Plane-in-flight.jpg
Resolving upload.wikimedia.org (upload.wikimedia.org)... 103.102.166.240, 2001:df2:e500:ed1a::2:b
Connecting to upload.wikimedia.org (upload.wikimedia.org)|103.102.166.240|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 487351 (476K) [image/jpeg]
Saving to: ‘plane.jpg’

plane.jpg           100%[===================>] 475.93K  --.-KB/s    in 0.02s   

2023-03-09 15:11:14 (29.2 MB/s) - ‘plane.jpg’ saved [487351/487351]
1
2
3
4
5
6
7
8
9
10
11
12
13
# 다운로드한 plane.jpg를 terget_size로 줄여줌
# plane input은 [(None, 240, 240, 3  0)] 크기를 가짐
img = image.load_img('plane.jpg', target_size=(240, 240))
plt.imshow(img)
# 이미지를 array 형태로 변환(학습할 모델의 입력으로 사용하기 위해)
x = image.img_to_array(img)
# 기존 모형에 batch_size=1 추가
x = x.reshape((1, x.shape[0], x.shape[1], x.shape[2]))
x = preprocess_input(x)
# 예측
preds = eff.predict(x)
# 예측 결과 decode_predictions을 통해 반환
print(decode_predictions(preds))
1
2
1/1 [==============================] - 2s 2s/step
[[('n02690373', 'airliner', 0.75877386), ('n04592741', 'wing', 0.100808546), ('n04552348', 'warplane', 0.08239551), ('n04266014', 'space_shuttle', 0.0063430285), ('n02692877', 'airship', 0.00088727544)]]
This post is licensed under CC BY 4.0 by the author.