7주차 시각지능 딥러닝 (1)

정지원·2024년 4월 1일
0

에이블 스쿨 복습

목록 보기
29/51
post-thumbnail

CNN - Image Classification

딥러닝 시각지능은 딥러닝 기술을 활용하여 시각적인 정보를 이해하고 처리하는 능력을 의미한다.

주로 컴퓨터 비전(Computer Vision) 분야에서 사용된다.

  1. 이미지 인식: 딥러닝 모델을 사용하여 이미지 내에 존재하는 객체나 패턴을 인식하고 분류하는 기술
    ex) CNN을 활용한 모델

  2. 객체감지: 이미지나 비디오 속에서 특정 객체의 위치와 종류를 감지하는 기술
    ex) Faster R-CNN, YOLO, SSD 모델

  3. 이미지 분할: 이미지를 픽셀 수준에서 세분화하여 각 픽셀을 해당하는 객체 또는 클래스로 분류하는 작업
    ex) U-NET, Mask R-CNN

  4. 이미지 생성: 딥러닝을 사용하여 새로운 이미지를 생성하는 기술. 생성적 적대 신경망을 활용하여 현실적인 이미지를 생성하는 작업
    ex) GAN(생성적 적대신경망)

  5. 이미지 캡션 생성: 이미지에 대한 설명을 자동으로 생성하는 기술
    ex) 이미지와 관련된 텍스트 설명을 생성

  6. 자율 주행 및 로봇 비전: 자율 주행 자동차나 로봇 등의 시스템에서 환경을 인식하고 이해하기 위한 시각적 딥러닝 기술 적용

딥러닝 복습

불러오기

# 케라스 최신버전 사용
!pip install --upgrade keras

# 불러오기
import os
os.environ['KERAS_BACKEND'] = 'tensorflow'

데이터 전처리

import numpy as np
import matplotlib.pyplot as plt

from scipy import io

# data 불러옴
data = io.loadmat('변수.mat')

# x, y 분할
x = data['images']
y = data['labels']


# x shape 변경
resolution = 28
classes = 10

x = np.transpose(x, (2, 0, 1)) # 넘파이 배열의 위치를 바꿈
print(x.shape)
x = x.reshape( (-1, resolution, resolution, 1) )

validation

from sklearn.model_selection import train_test_split

train_x, test_x, train_y, test_y = train_test_split(x , y, test_size=.2, random_state=2024)

스케일링

  • Tabular 데이터를 사용할땐 sklearn의 MinMaxScaler를 사용해도 된다. (2차원 형태의 행과 열로 이루어 진 것)
  • 1차원 Vector, 1D Array라고 함
  • 3차원 이상 Multidimensional Array, Tensor라고 함
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
  • 3차원 이상 부터는 아래와같은 방법으로 스케일링을 진행해야 함
  • 직접 계산
# train_x의 최대, 최소 저장
max_n, min_n = train_x.max(), train_x.min()

# 스케일링1
train_x = (train_x - min_n) / (max_n - min_n)
test_x = (test_x - min_n) / (max_n - min_n)
 
# 스케일링2 같은 방법임
# x_train = x_train / 255
# x_test = x_test / 255

One-hot encoding

from keras.utils to_categorical

# y에 대한 인코딩
class_n = len(np.unique(train_y)

train_y = to_categorical(train_y, class_n)
test_y = to_categorical(test_y, class_n)

Modeling

Sequential API

# Sequential API
# 1. 세션 클리어
# keras.backend.clear_session()
keras.utils.clear_session()

# 2. 모델 발판 선언
model = keras.models.Sequential()

# 3. 레이어 블록 조립: add()
model.add( keras.layers.Input(shape=(28,28,1)) )
model.add( keras.layers.Flatten() )
model.add( keras.layers.Dense(256, activation='relu') )
model.add( keras.layers.BatchNormalization() )
model.add( keras.layers.Dropout(0.2)
model.add( keras.layers.Dense(256, activation='relu') )
model.add( keras.layers.BatchNormalization() )
model.add( keras.layers.Dropout(0.2) )
model.add( keras.layers.Dense(10, activation='softmax') )

# 4. 컴파일
model.compile(optimizer='adam',
			  loss=keras.losses.categorical_crossentropy,
              metrics=['accuracy']

# 5. 요약
model.summary()

Functional API

import keras

from keras.utils import clear_session
from keras.models import Model
from keras.layers import Input, Dense, Flatten, Conv2D, MaxPool2D, BatchNormalization, Dropout
# Functional API
# 1. 세션 클리어
clear_session()

# 2. 레이어 엮기
il = Input(shape=(28, 28, 1))

hl = Flatten()(il)
hl = Dense(256, activation='relu')(hl
hl = BatchNormalization()(hl)
hl = Dropout(0.2)(hl)
hl = Dense(256, activation='relu')(hl)
hl = BatchNormalization()(hl)
hl = Dropout(0.2)(hl)

ol = Dense(10, activation='softmax')(hl)

# 3. 모델의 시작과 끝지정
model = Model(il, ol)

# 4. 컴파일
model.compile(optimizer='adam',
			  loss='categorical_crossentropy',
              metrics=['accuracy']
              )

# 5. 요약
model.summary()

Early stopping

from keras.callbacks import EarlyStopping

es = EarlyStopping(monitor = 'val_loss',		# 얼리스토핑의 관측지표
				   min_delta=0,					# Threshold 지표의 성능 개선 임계값
                   patience=5,					# 성능 개선이 발생하지 않을 때, 몇 epochs를 더 진행할 것인가
                   verbose=1,					# 얼리스토핑 발생한 epoch를 알려줌
                   restore_best_weights=True	# 최적의 가중치를 가진 epoch 시점으로 가중치르 되돌림 (True 권장)
                   )

fit

model.fit(train_x, train_y, validation_split=0.2,
		 epochs=10000, verbose=1,
         callbacks=[es]
         )

evaluate()

model.evaluate(test_x, test_y)

predict

y_pred = model.predict(test_x)
# 원핫 인코딩 한 것을 다시 묶어주는 코드
# 평가 지표 및 실제 데이터 확인을 위해 필요

y_pred_arg = np.argmax(y_pred, axis=1)
test_y_arg = np.argmax(test_y, axis=1)

평가

from sklearn.metrics import classification_report

class_names = ['A', 'B', 'C', 'D', 'E', 'F',' G', 'H', 'I', 'J']

print( classification_report(test_y_arg, y_pred_arg, target_names=class_names) )

딥러닝 시각화

Conv2D

  • 위치정보를 보존한다.
  • 합성곱 연산을 수행하는 레이어
  • 입력 이미지에 대해 필터를 슬라이딩하면서 입력 이미지와 필터 간으 ㅣ합성곱을 계산
  • 각 필터는 특정한 특징을 감지하는 역할으 ㄹ하며, 이러한 필터를 여러 개 적용하여 다양한 특징을 추출한다.
  • 레이어는 주로 이미지의 공간적인 특징을 추출하는데 사용함
    -filters, kernel_size, strides, padding, activation을 파라미터로 사용
    • filters: 새롭게 제작하려는 feature map의 수
    • kernel_size: Conv2D filter의 사이즈(이전 feature map의 depth는 keras에서 자동으로 보정함)
    • strides: Conv2D filter의 이동 보폭
    • padding: 이전 feature map의 크기 유지 / 외곽 정보 더 반영
    • activation: relu, softmax (빼먹지 말고 쓰기)

Maxpool2D

  • 최대 풀링 연산을 수행하는 레이어
  • 입력 이미지를 격자 형태로 분할하고각 격장 영역에서 최대값을 추출하여 출력
  • 이지미의 공간적인 해상도를 감소시키는 역할을 하며, 중요한 특징을 강조하는 효과를 가진다.
  • 합성곱 레이어 뒤에 적용되고 특징 맵의 크기를 줄이고 계산량을 줄이는데 사용
  • 최대 풀링 연산에주로 사용 (평균 풀링 등 있음)
  • pool_size, strides를 파라미터로 사용
    • pool_size: Maxpool filter의 사이즈
    • strides: 기본적으로 pool_size를 따르고 이동보폭을 나타냄

코드

라이브러리

# keras 최신버전
!pip install --upgrade keras

# 라이브러리 로딩
import os
os.environ['KERAS_BACKEND'] = 'tensorflow'

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import random as rd
from sklearn.metrics import accuracy_score

import keras

# 데이터 불러와서 각각 train, test에 저장
(train_x, train_y), (test_x, test_y) = keras.datasets.mnist.load_data()

reshape

_, h, w = train_x.shape

train_x = train_x.reshape(train_x.shape[0], h, w, 1)
test_x = test_x.reshape(test_x.shape[0], h, w, 1)

스케일링

  • x 스케일링
max_n, min_n = train_x.max(), train_x.min()

train_x = (train_x - min_n) / (max_n - min_n)
test_x = (test_x - min_n) / (max_n - min_n)

One-hot Encoding

  • y인코딩
from keras.utils import to_categorical

class_n = len(np.unique(train_y))

# 반복실행 주의
train_y = to_categorical(train_y, class_n)
test_y = to_categorical(test_y, class_n)

# 확인
train_x.shape, train_y.shape

모델링

Sequential API

from keras.backend import clear_session
from keras.models import Model
from keras.layers import Input, Dense, Flatten, Conv2D, MaxPool2D
## Sequential API
# 1. 세션클리어
keras.utils.clear_session()

# 2. 모델 선언
model = keras.models.Sequential()


# 3. 레이어 조립
model.add( keras.layers.Input(shape=(28,28,1)) )
model.add( keras.layers.Conv2D(filters=32,         # 새롭게 제작하려는 feature map의 수!
                               kernel_size=(3,3),  # Conv2D Layer filter의 가로세로 사이즈 (depth는 케라스가 보정!)
                               strides=(1,1),      # Conv2D Layer filter의 이동 보폭
                               padding='same',     # 앞전 feature map의 가로세로 사이즈 유지 | 외곽 정보 더 반영
                               activation='relu'
                               ) )
model.add( keras.layers.Conv2D(filters=32,         
                               kernel_size=(3,3),
                               strides=(1,1),      
                               padding='same',    
                               activation='relu'
                               ) )
model.add( keras.layers.MaxPool2D(pool_size=(2,2),  # MaxPooling layer filter의 가로세로 사이즈
                                  strides=(2,2),    # MaxPooling layer filter의 이동 보폭(기본적으로 pool_size를 따름)
                                  ) )

model.add( keras.layers.Conv2D(filters=64,         
                               kernel_size=(3,3),  
                               strides=(1,1),      
                               padding='same',     
                               activation='relu'
                               ) )
model.add( keras.layers.Conv2D(filters=64,        
                               kernel_size=(3,3), 
                               strides=(1,1),      
                               padding='same',    
                               activation='relu'
                               ) )
model.add( keras.layers.MaxPool2D(pool_size=(2,2),  
                                  strides=(2,2),    
                                  ) )

model.add( keras.layers.BatchNormalization() )
model.add( keras.layers.Dropout(0.25) )
model.add( keras.layers.Flatten() )                # Flatten으로 펼친 이후 Dense layer로

model.add(Dense(128, activation='relu'))
model.add( keras.layers.Dense(10, activation='softmax')) # 10개자리 숫자 다중분류임

# 4. 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy',
              metrics=['accuracy'])

model.summary()

Funtional API

import keras

from keras.utils import clear_session
from keras.models import Model
from keras.layers import Input, Dense, Flatten, Conv2D, MaxPool2D, BatchNormalization, Dropout
## Functional API
# 1. 세션 클리어 : 메모리에 모델 구조가 남아있으면 지워줘.
clear_session()

# 2. 레이어 엮기 : 사슬처럼!
il = Input(shape=(28,28,1) )

hl = Conv2D(filters=32,       # 새롭게 제작하려는 feature map의 수
            kernel_size=(3,3), # Convolutional Filter의 가로세로 사이즈! (depth는 케라스가 보정해줘서 작성 안함)
            strides=(1,1),     # Convolutional Filter의 이동 보폭!
            padding='same',    # 패딩 적용 유무! featuremap 사이즈 유지 | 외곽 정보 더 반영
            activation='relu'  # 활성화 함수 반드시!
            )(il)
hl = Conv2D(filters=32,       # 새롭게 제작하려는 feature map의 수!
            kernel_size=(3,3), # Convolutional Filter의 가로세로 사이즈!
            strides=(1,1),     # Convolutional Filter의 이동 보폭!
            padding='same',    # 패딩 적용 유무!
            activation='relu'  # 활성화 함수 반드시!
            )(hl)

hl = MaxPool2D(pool_size=(2,2), # Pooling Filter의 가로세로 크기
               strides=(2,2)    # Pooling Filter의 이동 보폭! (기본적으로 pool_size를 따라감)
               )(hl)

hl = Conv2D(filters=64,       
            kernel_size=(3,3), 
            strides=(1,1),     
            padding='same',    
            activation='relu'  
            )(hl)
hl = Conv2D(filters=64,      
            kernel_size=(3,3), 
            strides=(1,1),     
            padding='same',   
            activation='relu'  
            )(hl)

hl = MaxPool2D(pool_size=(2,2), 
               strides=(2,2)    
               )(hl)

hl = BatchNormalization()(hl)
hl = Dropout(0.25)(hl)
hl = Flatten()(hl)
hl = Dense(128, activation='relu')(hl)
ol = Dense(10, activation='softmax')(hl)

# 3. 모델의 시작과 끝 지정
model = Model(il, ol)

# 4. 컴파일
# model.compile(optimizer=kerasoptimizers.Adam(), loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy']
              )

EarlyStopping

from keras.callbacks import EarlyStopping

es = EarlyStopping(monitor='val_loss',
				   min_delta=0,
                   patience=5,
                   verbose=1,
                   restore_best_weights=True
                   )

학습 및 평가

# 학습
hist = model.fit(train_x, train_y, epochs=10000, verbose=1,
				 validation_split=0.2,
                 callbacks=[es]
                 )


# 평가
model.evaluate(test_x, test_y)
# 결과출력
print(f'Test Loss : {performance_test[0]:.6f} | Test Accuracy : {performance_test[1]*100:.2f}%')

한장 정리

profile
뒤늦게 프로그래밍을 시작한 응애

0개의 댓글