반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

블로그

[CV] 시각지능 딥러닝 #1 CNN (Convolutional Neural Networks) 본문

공부/DL

[CV] 시각지능 딥러닝 #1 CNN (Convolutional Neural Networks)

beenu 2024. 4. 2. 02:10
반응형
  • ML
    • 주어진 데이터가 '성능'을 좌우함
    • 주어진 데이터로 의사결정 rule을 만듦
    • 규칙화하긴 어렵지만 어떤 복잡한 논리적인 절차의 결론으로 의사결정 자동화
    • 머신러닝 : 쉽게 자동화된 논리적인 절차
      • 주어진 데이터가 얼마나 적절하냐에 따라 의사결정 rule 만드는 난이도가 달라짐
      • 사람이 생각하기에 용이할 것 같은 데이터 제작
    •  Feature Engineering
      • 주어진 데이터를 의사결정에 도웅이 되도록 더 적절하게 만드는 것
      • 수제작이기 때문에 설명이 용이함
      • Error 줄이는데 도움이 될지는 모델링을 해봐야 알 수 있음
      • 만든 것 중 어떤 피처가 얼마나 도움될지 모름
      • 도움이 되던 것이 다른 피처를 만들었더니 도움 안될 수 있음
      • 충분한 개수의 특징을 제작했는지 모름
      • 많이 만들면 말이 길어져서 설명이 지저분해짐
    •  좋은 Feature
      • Error를 줄여줌(예측 good)
      • 설명이 용이함(의사소통)
      • 모델링하기에 충분히 많아야 함
    • math보다 domain knowledge가 훨씬 중요함
    • 기호주의(If-else), 유추, 베이지안, 진화, 연결주의(DL)

 

  • DL
    • 자동화된 Feature Leaning
      • 공간만 만들어주면 예측에 도움이 되는 좋은 특징들을 잘 만들어줌
    • Node와 Layer 
      • 하나의 노드는 앞 레이어의 노드들의 값들로부터 ‘뭔지 모를 간단한 특징 (Feature)’을 추출함 (그것이 현실의 무언가와 연결되는 것인지는 장담할 수 없음)
        • n번째 히든 레이어들의 노드들은 n-1번째 레이어의 노드들에서 고려해볼 수 있는 간단한 특징들을 잡아낼 수 있는 장치들의 모임이 됨.
      • 다음 레이어에서는 다시 바로 간단한 특징들을 추출하며 이는 앞 레이어에서 추출된 특징들보다 더 깊은(추상적인) 특징임
      • 마지막 레이어의 노드는 최종적으로 추출된 피처들임
      • 노드의 수는 추출할 피처의 개수, 레이어의 수는 Feature Engineering 수준을 의미함 

 

  • Tabular Data
    • 이미 잘 정제된 데이터
    • 보통 데이터가 많지 않음(row, col)
    • 사람이 Feature Engineering 할만함
  • 딥러닝은 Image, Text 데이터를 다룰 때 많이 사용됨!
    • 다양한 형태의 데이터를 다루려면 딥러닝 사용하기

Intro to Computer Vision

 

  • Rule Based Programming  vs  Machine Learning
    • Rule Based Programming(Traditional Programming) : 데이터와 알고리즘이 주어지면 정답을 도출 (코테같은 것)
    • Machine Learning : 데이터와 정답이 주어지면 데이터에서 정답이 도출되는 알고리즘을 찾아냄
  • Pixel : 화면을 구성하는 가장 기본이 되는 단위
    • 컴퓨터는 pixel을 보고 이미지를 인식하는데, pixel 수에 따라 연산량이 매우 많아질 수 있음
  • Edge Detection
    • 값의 급격히 변화하는 곳이 경계
    • 미분을 이용하여 값이 급격히 변화하는 곳을 모두 찾아서 연결하면 경계를 찾을 수 있을 것
    • 실제 이미지에 적용해보면 경계의 일부분이 제대로 찾아지지 않음 (예외 상황이 매우 많음)
    • 경계를 찾아도 종종 노이즈가 존재함
  • 1960’s : 간단한 Block으로 구성된 이미지를 해석 => 컴퓨터에게 엣지(선과 면)를 이해시킴
  • 1970’s : 이미지 선택 기술과 선택된 이미지의 해석 기술 진전 => 컴퓨터에게 사물간 “계층(Layer)”과 사물의 움직임을 이해시킴
  • 1990’s : 인식 기술 확장 => 컴퓨터에게 사물의 스케일을 이해시킴

"SIFT" & Object Recognition, David Lowe, 1999

  • 2000’s : 컴퓨터가 “특정 이미지 조각”을 가지고 분류할 수 있게 만듦 => Feature의 등장
  • Convolutional Neural Network
    1. 이미지 조각을 봄
    2. 각 조각이 조합된 패턴을 봄
    3. 점점 더 복잡한 조합의 패턴을 봄
    4. 반응하는 여러 패턴의 조합을 가지고 이미지를 인식
  • 필터를 CNN이 스스로 학습함

 

Convolutional Neural Networks Basics
  • Fully-Connected
    • 컬러 채널과 픽셀 정보 등을 평탄화 (Flatten)
    • 위치 정보 소실
  • Convolutional Neural Networks
    • Convolutional Layer Filter sliding
      • Filter를 이동시키면서 이미지 특징을 추출함
    • Feature map : Convolutional Layer를 거쳐 만들어진 서로 다른 Feature의 모임
    • Filter 값은 Random
    • Stride : filter의 이동 보폭, Feature map 크기에 영향을 미침
    • Padding
      • Feature map 크기 유지
      • 외곽 정보를 더 반영
      • Zero Padding : 0으로 padding
    • Pooling Layer : Feature map 가로 세로에만 영향
      • Max pooling Layer : pooling filter 범위 안에서 가장 큰 값을 선택
      • Average pooling Layer : pooling filter 범위에서 값들의 평균을 선택
  • scaling : global minimum에 접근하는 속도가 줄어듦
  • Fashion MNIST 데이터를 활용한 CNN 모델
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import scipy.stats as stats
import statsmodel

from sklearn.metrics import accuracy_score
import keras
from keras.utils import to_categorical
from keras.utils import clear_session
(train_x, train_y), (test_x, test_y) = keras.datasets.fashion_mnist, load_data()
labels = ["T-shirt/top",    # index 0
            "Trouser",      # index 1
            "Pullover",     # index 2
            "Dress",        # index 3
            "Coat",         # index 4
            "Sandal",       # index 5
            "Shirt",        # index 6
            "Sneaker",      # index 7
            "Bag",          # index 8
            "Ankle boot"]   # index 9
# MinMaxScaling
max_n = train_x.max()
min_n = train_x.min()

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

# Reshape(끝에 1 붙여서 흑백 이미지 명시)
train_x = train_x.reshape((-1, 28, 28, 1))
test_x = test_x.reshape((-1, 28, 28, 1))

# y : One Hot Encoding
class_n = len(np.unique(train_y))

train_y = to_categorical(train_y, class_n)
test_y = to_categorical(test_y, class_n)
from keras.models import Sequential
from keras.layers import Input, Conv2D, MaxPool2D, BatchNormalization, Dropout, Flatten, Dense
from keras.optimizers import Adam

## Functional API
# 1. 세션 클리어 : 메모리에 모델 구조가 남아있으면 지워줘.
clear_session()

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

model.add(Input(shape=(28, 28, 1)))
model.add(Conv2D(filters=32,
                 kernel_size=(3, 3),
                 strides=(1, 1),
                 padding='same',
                 activation='relu'))
model.add(Conv2D(filters=32,
                 kernel_size=(3,3),
                 strides=(1, 1),
                 padding='same',
                 activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(MaxPool2D(pool_size=(2, 2),
                    strides=(2, 2)))

model.add(Input(shape=(28, 28, 1)))
model.add(Conv2D(filters=64,
                 kernel_size=(3, 3),
                 strides=(1, 1),
                 padding='same',
                 activation='relu'))
model.add(Conv2D(filters=64,
                 kernel_size=(3,3),
                 strides=(1, 1),
                 padding='same',
                 activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(MaxPool2D(pool_size=(2, 2),
                    strides=(2, 2)))

model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(10, activation='softmax'))

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

# 4. 요약
model.summary()
728x90
반응형