딥러닝 시각지능은 딥러닝 기술을 활용하여 시각적인 정보를 이해하고 처리하는 능력을 의미한다.
주로 컴퓨터 비전(Computer Vision) 분야에서 사용된다.
이미지 인식: 딥러닝 모델을 사용하여 이미지 내에 존재하는 객체나 패턴을 인식하고 분류하는 기술
ex) CNN을 활용한 모델
객체감지: 이미지나 비디오 속에서 특정 객체의 위치와 종류를 감지하는 기술
ex) Faster R-CNN, YOLO, SSD 모델
이미지 분할: 이미지를 픽셀 수준에서 세분화하여 각 픽셀을 해당하는 객체 또는 클래스로 분류하는 작업
ex) U-NET, Mask R-CNN
이미지 생성: 딥러닝을 사용하여 새로운 이미지를 생성하는 기술. 생성적 적대 신경망을 활용하여 현실적인 이미지를 생성하는 작업
ex) GAN(생성적 적대신경망)
이미지 캡션 생성: 이미지에 대한 설명을 자동으로 생성하는 기술
ex) 이미지와 관련된 텍스트 설명을 생성
자율 주행 및 로봇 비전: 자율 주행 자동차나 로봇 등의 시스템에서 환경을 인식하고 이해하기 위한 시각적 딥러닝 기술 적용
# 케라스 최신버전 사용
!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) )
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차원 형태의 행과 열로 이루어 진 것)Vector, 1D Array라고 함Multidimensional Array, Tensor라고 함from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 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
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)
# 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()
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()
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 권장)
)
model.fit(train_x, train_y, validation_split=0.2,
epochs=10000, verbose=1,
callbacks=[es]
)
model.evaluate(test_x, test_y)
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) )
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 (빼먹지 말고 쓰기)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()
_, 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)
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)
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
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()
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']
)
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}%')
한장 정리