# 이미지 처리
### 이미지 세팅
- 이미지 디렉터리 기준으로 이미지 셋 만들기
- image_dataset_from_directory
```bash
import os
import zipfile
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from glob import glob
from PIL import Image
# 하이터 파라미터 정의
num_epochs = 10
learning_rate = 0.001
dropout_rate = 0.5
input_shape = (128, 128, 3)
batch_size = 32
num_classes = 클래스 수
# 이미지 패스 지정
train_img_path ='이미지 경로'
valid_img_path ='이미지 경로'
# Train Dataset 만들기
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
directory=train_img_path,
label_mode="categorical", # binary / categorical
batch_size=batch_size,
image_size=(128, 128),
seed=42,
shuffle=True,
# validation_split=0.2,
# subset="training"
)
# Test Dataset 만들기
test_ds = tf.keras.preprocessing.image_dataset_from_directory(
directory=valid_img_path,
label_mode="categorical", # binary / categorical
batch_size=batch_size,
image_size=(128, 128),
seed=42,
# validation_split=0.2,
# subset="validation"
)
print(train_ds.class_names)
batch_img, batch_label = next(iter(train_ds))
batch_img.shape, batch_label.shape
```
## CNN 학습
```bash
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, Rescaling
model = Sequential()
model.add(Rescaling(1. / 255))
model.add(Conv2D(32, kernel_size=(5,5), strides=(1,1), padding='same', activation='relu', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(Conv2D(64,(3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,(3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(128,(3,3), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(2, activation='softmax'))
# Model compile
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate), # Optimization
loss='categorical_crossentropy', # Loss Function
metrics=['accuracy']) # Metrics / Accuracy
# callbacks
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
# EarlyStopping
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=3)
# ModelCheckpoint
checkpoint_path = "my_checkpoint.keras"
checkpoint = ModelCheckpoint(filepath=checkpoint_path,
save_best_only=True,
monitor='val_loss',
verbose=1)
history = model.fit(
train_ds,
validation_data=(test_ds),
epochs=10,
callbacks=[es, checkpoint]
)
# Test 데이터로 성능 예측하기 (배치 사이즈)
batch_img , batch_label = next(iter(test_ds))
type(batch_img), batch_img.shape
#결과 예측
i = 1
plt.figure(figsize=(16, 30))
for img, label in list(zip(batch_img, batch_label)):
pred = model.predict(img.numpy().reshape(-1, 128,128,3), verbose=0)
pred_t = np.argmax(pred)
plt.subplot(8, 4, i)
plt.title(f'True Value:{np.argmax(label)}, Pred Value: {pred_t}')
plt.imshow(img/255)
i = i + 1
```
## 전이학습
```bash
import os
from glob import glob
from PIL import Image
import zipfile
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
# 전이학습 모델 확인
dir(tf.keras.applications)
base_model = tf.keras.applications.MobileNetV2(input_shape=(128, 128, 3), weights='imagenet', include_top=False)
print(base_model.summary())
base_model.trainable = False # 베이스 모델 고정하기
inputs = tf.keras.Input(shape=(128, 128, 3))
x = tf.keras.layers.Rescaling(1./127.5, offset=-1)(inputs) # 이미지 픽셀값 rescale
x = base_model(x, training=False)
x = tf.keras.layers.GlobalAveragePooling2D()(x) # 3차원(7, 7, 1280) --> 1차원(1280)으로 줄이기
output = tf.keras.layers.Dense(2, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=output)
model.summary()
checkpoint_path = "checkpoint.keras"
checkpoint = ModelCheckpoint(filepath=checkpoint_path, save_best_only=True, monitor='val_loss', verbose=1)
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=3)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate),
loss='categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(
train_ds,
validation_data = test_ds,
epochs=2,
callbacks=[es, checkpoint]
)
# 테스트 데이터 모으기
batch_img, batch_label = next(iter(test_ds))
print(batch_img.shape)
print(batch_label.shape)
# 결과 확인
i = 1
plt.figure(figsize=(16, 30))
for img, label in list(zip(batch_img, batch_label)):
pred = model.predict(img.numpy().reshape(-1, 128,128,3), verbose=0)
pred_t = np.argmax(pred)
plt.subplot(8, 4, i)
plt.title(f'True Value:{np.argmax(label)}, Pred Value: {pred_t}')
plt.imshow(img/255) # 이미지 픽셀값들이 실수형이므로 0~1 사이로 변경해야 에러 안남
i = i + 1
```
'STUDY > AI' 카테고리의 다른 글
자연어 처리 프로세스 (0) | 2024.10.31 |
---|---|
Cat-dog 인식 모델 학습(1) (0) | 2019.12.17 |