남이 만든 CNN 모델! (Pretrained CNN)
쉽지만 중요한 코너!
이미 '잘 만들어진' 모델들을 가져다가 사용해보자.
Keras Update
!pip install keras-nightly
Collecting keras-nightly
Downloading keras_nightly-3.7.0.dev2025010203-py3-none-any.whl.metadata (5.8 kB)
Requirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (1.4.0)
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (1.26.4)
Requirement already satisfied: rich in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (13.9.4)
Requirement already satisfied: namex in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (0.0.8)
Requirement already satisfied: h5py in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (3.12.1)
Requirement already satisfied: optree in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (0.13.1)
Requirement already satisfied: ml-dtypes in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (0.4.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from keras-nightly) (24.2)
Requirement already satisfied: typing-extensions>=4.5.0 in /usr/local/lib/python3.10/dist-packages (from optree->keras-nightly) (4.12.2)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich->keras-nightly) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich->keras-nightly) (2.18.0)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich->keras-nightly) (0.1.2)
Downloading keras_nightly-3.7.0.dev2025010203-py3-none-any.whl (1.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 18.1 MB/s eta 0:00:00
Installing collected packages: keras-nightly
Successfully installed keras-nightly-3.7.0.dev2025010203
Library Loading
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
import numpy as np
import matplotlib.pyplot as plt
Load Pretrained Model
vgg_model = VGG16(include_top=True, # VGG16 모델의 아웃풋 레이어까지 전부 불러오기
weights='imagenet', # ImageNet 데이터를 기반으로 학습된 가중치 불러오기
input_shape=(224,224,3) # 모델에 들어가는 데이터의 형태
)
Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels.h5
553467096/553467096 ━━━━━━━━━━━━━━━━━━━━ 5s 0us/step
vgg_model.summary()
from keras.utils import plot_model
plot_model(vgg_model, show_shapes=True, show_layer_names=True, show_layer_activations=True)
#이미지가 매우 커 출력값은 생략하도록 한다.
이미지 파일을 업로드 해둔 곳으로 가자!
구글 드라이브에 수집한 이미지를 업로드!
순서
구글링하여 이미지를 수집합니다.
본인의 구글 드라이브에 my_data 폴더를 생성합니다.
my_data 폴더 안에 img1 폴더를 생성합니다.
1번 단계에서 수집한 이미지를 img1 폴더에 업로드 합니다.
30초 정도 기다립시다.
아래의 코드들을 실행합니다.
Connect Colaboratory with my Google Drive
Colaboratory와 본인의 구글 드라이브를 연결하는 과정
아래 코드를 실행하여 폴더가 올바르게 생성 되었는지 확인
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive
!ls
drive model.png sample_data
!cd /content/drive/MyDrive/my_data; ls
img1 my_mnist
Load Image
import glob
from keras.preprocessing import image
files = glob.glob('/content/drive/MyDrive/my_data/img1/*')
files
['/content/drive/MyDrive/my_data/img1/1.jpg',
'/content/drive/MyDrive/my_data/img1/2.jpg',
'/content/drive/MyDrive/my_data/img1/3.jpg',
'/content/drive/MyDrive/my_data/img1/4.jpg',
'/content/drive/MyDrive/my_data/img1/5.jpg',
'/content/drive/MyDrive/my_data/img1/6.jpg',
'/content/drive/MyDrive/my_data/img1/7.jpg']
img = image.load_img(files[-1], color_mode='rgb', target_size = (224,224) )
img = image.img_to_array(img)
img = img.reshape((-1,224,224,3))
print(f'preprocess 전: 최대값={np.max(img)}, 최소값={np.min(img)}')
img = preprocess_input(img)
print(f'preprocess 후: 최대값={np.max(img)}, 최소값={np.min(img)}')
features = vgg_model.predict(img)
print(decode_predictions(features, top=3))
plt.imshow(image.load_img(files[-1]))
plt.show()
Load Images
images = []
for path in files :
img = image.load_img(path, color_mode='rgb', target_size=(224,224) )
img = image.img_to_array(img)
img = preprocess_input(img)
images.append(img)
images = np.array(images)
features = vgg_model.predict(images)
predictions = decode_predictions(features, top=3)
for i in range(images.shape[0]) :
print(predictions[i])
plt.imshow(image.load_img(files[i]))
plt.show()
# 이미지는 용량이 매우 커 생략하기로 한다.
1/1 ━━━━━━━━━━━━━━━━━━━━ 5s 5s/step
[('n02280649', 'cabbage_butterfly', 0.1937402), ('n02281406', 'sulphur_butterfly', 0.11953507), ('n11939491', 'daisy', 0.083615504)]
[('n03991062', 'pot', 0.3786741), ('n12620546', 'hip', 0.11216143), ('n02280649', 'cabbage_butterfly', 0.08562447)]
[('n04209239', 'shower_curtain', 0.5381697), ('n03089624', 'confectionery', 0.14557941), ('n03930313', 'picket_fence', 0.07652541)]
[('n11939491', 'daisy', 0.9972742), ('n02219486', 'ant', 0.0011028049), ('n02206856', 'bee', 0.0006321555)]
[('n02280649', 'cabbage_butterfly', 0.23353593), ('n02281406', 'sulphur_butterfly', 0.1769382), ('n02279972', 'monarch', 0.11460436)]
[('n02280649', 'cabbage_butterfly', 0.19825938), ('n11939491', 'daisy', 0.12249449), ('n12057211', "yellow_lady's_slipper", 0.10233914)]
[('n03930313', 'picket_fence', 0.63343644), ('n04604644', 'worm_fence', 0.07614482), ('n02843684', 'birdhouse', 0.047126565)]
Easy, but Very Important Exercise!
강아지 이미지를 수집합시다. (다른 것으로 해도 됨.)
본인이 판단하기에 잘 될 법한 강아지 이미지 10개를 찾아봅시다.
본인이 판단하기에 잘 안 될 법한 강아지 이미지 10개를 찾아봅시다.
경로 설정
my_data 폴더 안에 img2 폴더를 생성합니다.
수집한 이미지를 img2 폴더에 업로드 하세요.
import glob
files = glob.glob('/content/drive/MyDrive/my_data/img2/*')
files
['/content/drive/MyDrive/my_data/img2/1.jpg',
'/content/drive/MyDrive/my_data/img2/2.jpg',
'/content/drive/MyDrive/my_data/img2/3.jpg',
'/content/drive/MyDrive/my_data/img2/4.jpg',
'/content/drive/MyDrive/my_data/img2/5.jpg']
images = []
for path in files :
img = image.load_img(path, color_mode='rgb', target_size=(224,224) )
img = image.img_to_array(img)
img = preprocess_input(img)
images.append(img)
images = np.array(images)
features = vgg_model.predict(images)
predictions = decode_predictions(features, top=3)
for i in range(images.shape[0]) :
print(predictions[i])
plt.imshow(image.load_img(files[i]))
plt.show()
# 이미지는 용량이 매우 커 생략하도록한다.
1/1 ━━━━━━━━━━━━━━━━━━━━ 5s 5s/step
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json
35363/35363 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
[('n02085936', 'Maltese_dog', 0.5005949), ('n02113624', 'toy_poodle', 0.10207428), ('n02098413', 'Lhasa', 0.09226305)]
[('n02091244', 'Ibizan_hound', 0.57619363), ('n02091831', 'Saluki', 0.12810868), ('n02091134', 'whippet', 0.10292074)]
[('n02097474', 'Tibetan_terrier', 0.30071172), ('n02111500', 'Great_Pyrenees', 0.23559931), ('n02105641', 'Old_English_sheepdog', 0.09268171)]
[('n02085782', 'Japanese_spaniel', 0.54784787), ('n02086079', 'Pekinese', 0.38067418), ('n02112018', 'Pomeranian', 0.047537852)]
[('n02089078', 'black-and-tan_coonhound', 0.9804248), ('n02088632', 'bluetick', 0.007853577), ('n02088238', 'basset', 0.0062168045)]