본문 바로가기

STUDY/AI

딥러닝 AI 학습 (이미지)

# 이미지 처리

### 이미지 세팅

- 이미지 디렉터리 기준으로 이미지 셋 만들기
    - 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