본문 바로가기
AI Study/Computer Vision 기초 처음부터 정리

[1] Computer Vision 소개 및 대표 모델

by 하람 Haram 2024. 2. 12.
728x90

Machine Learning VS Deep Learning 

  • Machine Learning
    • Input -> Feature Extraction( 전문가가 수행 ) -> Machine Learning (classification) -> Output
  • Deep Learning (Machine Learning 기법 중 하나)
    • Input -> Deep Learning (Feature Extraction -> classfication) -> Output

 

 

Convolutional Neural Network (CNN)

  • IDEAL (ex K-NN (K-Nearest Neighbors))
    • K-NN은 정의하고자 하는 Data 주변에 어떤 Data들이 분포하는 지를 보는 것 (ex 주변에 개가 많으니 개 이다! )
    • 전체 경우에 대한 Data(개, 고양이 분류에 대해서는 전세계 모든 개 고양이 종)를 가지고 있으면 이상적이다
      • 그냥 분류해 놓고 Search 알고리즘 돌리면 되니깐 K-NN으로도 충분
      • 하지만 솔직히 말이 안되는 상황이다
      • 일부 데이터만 가지고 분석을 해야하는데 유사도 분석이 문제가 된다
      • 이에 대한 해결책으로 나온 것이 모든 픽셀을 서로 다른 가중치로 Weighted Sum진행 (Single layer Fully-connected Neural Network)
        • 근데 이것도 문제점이 있음
        • 이 Network는 그냥 개 고양이의 전체적인 평균 이미지를 가지고 비교를 하는 방식이다 (특정 부위를 통한 분석이 아님)
        • 또한 이미지가 Crop된 경우도 다른 이미지 라고 생각해버리는 문제가 발생
      • 이에 대한 해결책으로 Single layer Locally-connected Neural Network가 등장한다
      • parameter도 줄어들고 부분부분에 대한 정보도 얻을 수 있고 overfitting도 줄어듬
      • 이걸 베이스로 CNN이 등장
  • CNN(Convolutional Neural Network)
    • 대표 모델 순서
      • LeNet-5 -> 굉장히 간단한 구조
      • AlexNet(2012) -> 이게 ILSVRC에서 1등하면서 Neural Network가 주목 받음
      • VGGNet(2014) -> ICLR
      • GoogleNet(2015) ->CVPR
      • ResNet \(2016) -> CVPR

 

 

LeNet-5

 

  • 굉장히 단순한 구조  -> 주로 우편번호 인식(한 글자씩 인식)
  • Conv - pool - Conv - pool - FC - FC
  • 이때는 약간 kernel size가 3이 아니라 5를 씀 (3 두개 쓰는게 더 좋은지 몰랐음..) / stride 1
  • Pooling : 2x2 max pooling / stride 2

 

AlexNet

  • Relu(Activation Function) 이랑 Dropout 써서 떡상
  • 네트워크를 두개로 구성해서 중간중간 교차 시킴
  • 학습도 ImageNet 사용 (1.2 millions)
  • Kernel size가 11로 엄청 컸음
    • 이게 근본 없이 큰 걸 쓴게 아니라 Receptive field를 고려해서 큰 걸 사용한 거임
    • Receptive Field : (P+K+1) x (P+K+!) 
  • 그냥 하드웨어 스펙으로 이김 (7 hidden layer 사용해서 60 million parameters 가지는 구조임)
    • 이렇게 큰 모델을 쓰니깐 Out of Memory 많이 떳을 거임 (그래서 네트워크를 두개로 구성)
    • 그래서 그림에서는 48차원으로 되어 있는데 밑에 Flow에서는 96으로 나타나 있는 거임

MaxPooling2D 의 결과 값을 3차원 tensor 형태인데

이게 밑에 Linear Layer로 이어지기 위해서는 tensor를 vector로 바꾸는 벡터화가 필요하다

벡터화에는 두가지 옵션을 기대할 수 있는데

  • Average pooling
    • 참고로 torch.nn.AdaptiveAvgPool2d(output_size) 이다
      • 6,6 hyperparameter 는 Output size이고
      • 이렇게 나온 (256,6,6) size를 flatten 시켜서 Linea에 넣는 거임

그래서 코드 중 일부를 보면 다음과 같이 구현 가능

 

[pytorch] 이미지 분류를 위한 AlexNet 구현

AlexNet은 컴퓨터 비전 분야의 발전에 중요한 역할을 한 합성곱 신경망(CNN) 아키텍처입니다. 이는 Alex Krizhevsky, Ilya Sutskever, Geoffrey Hinton에 의해 개발되었으며, 2012년 ImageNet 대규모 시각 인식 챌린지

resultofeffort.tistory.com

추가로 LRN 은 Local Response Normalization 인데 지금은 사용하지 않는다고 한다

(activation map 에서 명암을 normalization 하는 느낌임)

==> 지금은 Batch Normalization을 사용

 

 

 

 

VGGNet

  • 3x3 kerrnel의 포문을 열음(야 ㅋㅋ 3x3써도 좋은데 ??? )
  • 작은 kernel을 쓰지만 엄청 깊게 쌓으면 ㅈ결국에는 큰 Receptive size를 얻을 수 있다는 마인드
    • 더 깊지만 simple 하게 (높은 성능 / 좋은 일반화)
      • layer 수만 16 or 19 개임
  • 얘도 ReLU 씀 (이후론 거의 다 쓰는 듯)
  • 2x2 max pooling operation

 

비교

 

 

 

GoogleNet

아니 그럼 무지성으로 깊어질 수록 좋은 거 아니냐??

문제점

  • Gradient Vanishing / Exploding 문제 발생
  • Parameter가 너무 많아져서 Computationally Complex가 증가
  • Overfitting problem이 발생
    • 이때 당시에는 overfitting 문제가 발생한다고 생각하였지만
    • 엄밀하게는 Degradation Problem이다
      • Depth가 너무 깊어지면 Gradient Vanishing이나 Exploding같은 문제가 생겨서 학습이 저해되는 현상

GoogleNet은 이에 대해서 다음과 같은 방법으로 해결하고자 하였다

  • 1x1 Convolution layer
  • Inception Module
  • Auxiliary Classifiers

전체 구조는 다음과 같음

먼저 일반적인 구조와 달리 옆으로 넓어보이는 이유는 Inception Module 때문인데

(Depth가 아닌 Width를 확장)

Inception Module

다음과 같이 3개의 Convolution 연산과 1개의 Max pooling을 단순 Concate연산을 시켜서 다음 layer로 넘긴다

  • 이러면 좀 더 다양한 특징들을 뽑을 수 있지 않을까 생각한 거 같음
  • 대충 생각해도 이러면 계산 복잡도가 엄청 오를거 같음
    • 이걸 해결해준 것이 1x1 Convolution이다
    • 1x1은 쉽게 설명하면 Channel수를 우리 마음대로 조절할 수 있는 로직이다
    • 이걸 통해서 Inception Module을 구성하였다
    • Max pooling 에 1x1 conv를 사용한 이유는 dimension을 조절하기 위해서이다

 

1x1 Convolution

이렇게 Channel축과 동일한 크기로 1x1 Convolution을 적용하면

Depth 정보를 하나의 Pixel로 압축해서 나타낼 수 있다

 

만약 위와 같은 주황색 1x1 Conv가 N개가 있다면 민트색 같은 결과가 N개가 나오게 되어

D 개의 Dimension을 N개의 Dimension으로 바꿀 수 있을 것이다

"공간의 크기는 변하지 않고 Channel 수만 바뀜"

 

그래서 모델을 부분 별로 끊어서 보게 되면

여기까지는 우리가 아는 일반적인 Model 구조(Stem Network)이고

Inception module을 쌓아 올린다

 

근데 여기서 우리가 예상할 수 있는 문제점이

다음 그림과 같이

이렇게 쌓아 올리면 누가봐도 Gradient Vanishing 이던 Exploding이던 발생할 것이다

이걸 해결하기 위해 Auxiliary Classifiers를 부분적으로 적용한다

Auxiliary Classifier

위 그림에서 Inception 모듈 옆에 달려있는 주사기 같은 것이 Auxiliary Classifier이다

  • SoftMax에서 loss를 발생시켜줘서 중간중간 Gradient를 주사기 처럼 주입시킴
  • 구조는 마지막 단에 있는 구조(Classifier output layer)와 동일 (중간에 끝났다고 가정하는 느낌)
  • 학습할 때만 사용하고 test시에는 제거하는 layer들이다

이렇게 하고 마지막 단에

Pooling하고 FC layer 통과 시켜주고 Softmax를 적용하는 구조

 

 

 

ResNet

추후 작성 예정

 

 

VGGNet : https://arxiv.org/pdf/1409.1556.pdf

 

 

 

핵심 요약

  • AlexNet(2012)
    • ㅁㅁㅁㅁ
    • ㅁㅁㅁㅁ
  • VGGNet(2014)
    • ㅁㅁㅁㅁㅁ
    • ㅁㅁㅁㅁㅁ
  • GoogleNet(2015)
    • ㅁㅁㅁㅁㅁㅁ
  • ResNet(2016) 
    • ㅁㅁㅁㅁ
    • ㅁㅁㅁㅁ
728x90