본문 바로가기
BOOSTCAMP AI TECH/7주차_Computer Vision

[BOOSTCAMP AI TECH] 31일차_Image classification

by 이민우 2021. 3. 8.
728x90
반응형
  • 강의 목록

- Image Classification 1

- Annotation data efficient learning


  • 요약

강의

 

 Computer Vision에 대한 전반적인 설명과, CV의 대표적인 작업인 분류에 대한 설명을 들었다.

 또한 적은 수의 데이터로 효율적으로 학습을 하는 방법을 이해했으며, VGGNet을 활용한 구현 과제를 수행했다.

 

피어세션

 


  • 학습정리

Computer Graphics : 분석한 정보를 이용해 장면에 해당하는 이미지나 3D 신을 재구성한 것 (Rendering)

 

Computer Vision : 컴퓨터 그래픽스가 하는 일을 반대로 하는 것. 즉, 시각적 데이터에서 representation을 추출하는 일.

 

*Interpolation = representation = 사물을 보고 한 해석

 

 

Image Classification

-Classifier는 입력을 어떤 카테고리 값과 매핑시켜 내보내는 장치이다.

-이미지 분류는 이 분류기의 입력값으로 시각적 데이터를 사용하여 추론하는 것이다.

 

 

이미지 인식에 이상적인 접근법

-세상의 모든 데이터를 보유하고 있다면 KNN으로도 충분히 모든 분류가 가능하다.

-즉, 보유한 데이터에서 입력 데이터를 검색하는 방법으로 구현이 가능하다.

 

-하지만 세상의 모든 데이터를 보유하는 것은 당연히 불가능하다.

-또한 많은 데이터를 가지고 있더라도 그 안에서 입력 데이터를 검색하는 것은 너무 오랜 시간이 덜린다.

-애초에 KNN을 통해 군집화를 수행할 때도 이미지 간 유사도의 계산에 시스템 복잡도가 많이 올라간다.

 

 

Single Layer Neural Network (Fully Connected Layer)

-모든 픽셀들을 서로 다른 가중치로 내적을 한 후 비선형 활성화 함수로 분류 스코어를 출력한다.

-하지만 잘 작동은 하지 않는데, 두 가지 문제 때문이다.

 1) 레이어가 단순해서 평균 이미지 같은 것 외에는 표현이 불가능하다.

 2) 테스트 타임(적용 시점)도 문제인데, 학습에 사용한 이미지와 조금이라도 다르면 잘 분류하지 못한다.

    이는 일부가 아닌 전체 이미지에 대한 학습만 진행하기 때문이다.

 

 

Convolution Neural Networks (CNN)

-위의 문제를 해결하기 위해 CNN이 등장했다. CNN은 모든 노드들을 다음 계층으로 전부 연결시키는 것이 아니라,

 국소적인 연결을 사용한다.

-동일한 국소적 SLIDING WINDOW를 이미지의 모든 부분에 대입시켜 특징을 뽑아냄으로써 치우쳐 있는 이미지나

 잘린 이미지라도 특징을 추출할 수 있고, 파라미터를 재활용하여 메모리도 적게 사용할 수 있다.

 

 

CNN 아키텍처의 역사

LeNet-5

-최초로 발명된 CNN으로, 아주 심플한 구조였다.

-한 글자 정도의 손글씨 인식, 우편번호 인식 등에 사용되었다.

 

AlexNet

-LeNet-5를 참조했으나 층이 더 깊어졌고, 더 많은 데이터셋을 사용했다.

-또한 활성화 함수로 ReLU를 사용하기 시작했고, 드롭아웃을 사용했다.

-그리고 GPU를 사용하기 시작했는데, 부족한 메모리로 두 개의 GPU를 병렬적으로 사용했다.

-Local Response Normalization (LRN)을 사용했는데, Activation map에서 정규화를 수행한다.

 근데 요즘에는 사용하지 않고 Batch Normalization을 주로 사용한다.

-11*11 커널을 사용했는데, 이 또한 요즘에는 사용하지 않는다.

 

*Receptive Field

-activation에서 한 요소가 나왔을 때 그 요소가 나오게 된 입력 픽셀의 영역

-input에서부터 계속해서 참조된 영역이다.

-학습이 진행될수록 영역은 커진다.

 

 

VGGNet

-16, 19 레이어로 AlexNet보다 깊어졌다.

-LRN을 사용하지 않았고, 3*3 합성곱 커널과 2*2 맥스 풀링만 사용했다.

-미리 학습된 태스크를 다른 태스크에 적용 가능할 정도로 일반화가 잘 되었다.

-즉 더 깊지만 심플하고, 더 좋은 성능을 보인다.

-3*3, 2*2의 작은 커널 사이즈만 사용한 이유는 작은 커널들로 스택을 쌓으면 큰 커널의 효과를 얻을 수 있다.

-또한 작은 커널을 사용해 큰 Receptive Field를 얻음으로써 이미지의 영역의 많은 부분들을 고려하게 되는데, 더 적은

 파라미터를 가지며 더 깊고 복잡한 비선형성을 학습할 수 있게 된다.

 

 

AlexNet에서 VGGNet으로 발전하며 깊은 네트워크일수록 더 좋은 성능을 얻는다는 것이 밝혀졌다.

하지만 층을 단순하게 깊이 쌓으면 더 좋은 학습 결과를 얻을 수 있는 것은 아니다.

층의 깊이가 깊어지면 다음의 문제들이 발생했다.

 1) 경사도 손실, 폭주

 2) 연산 복잡도 증가

 3) 성능이 떨어지는 Degradation문제

그래서 이후의 연구들은 이러한 문제들을 극복하며 층을 깊게 쌓기 위해 노력했다.

*오버피팅은 잘 일어나지 않는다.

 

 

GoogleNet

-Inception 모듈을 여러 층 쌓는 형태를 제안했다.

-즉 하나의 층에서 다양한 크기의 필터를 사용하여 여러 측면의 특징을 파악한다. (깊이가 아닌 폭 증가)

-그리고 그 결과들을 concat 하여 다음 층으로 넘겨준다.

-이 때 1*1 합성곱을 적용해 채널 수를 줄여 계산 복잡도를 떨어뜨려준다.

 

-또한 Auxiliary classifier을 네트워크 중간 중간에 두었다.

-구글넷의 구조 중 풀링 계층에서 시작해 1*1 -> fc -> fc -> softmax로 loss를 측정하는 구조이다.

-역전파 시 여기에도 역전파가 수행되고, 기존의 기울기와 결합하여 학습을 돕고 학습이 끝나면 제거한다.

-기울기 소실 문제를 막아주고 정규화 역활도 수행해준다.

 

 

ResNet

-최초로 100개가 넘는 layer를 쌓음으로써, 더 깊은 layer를 쌓을수록 성능이 더 좋아진다는 것을 보여준 첫 모델이다.

 또한, 인간의 지각 능력을 뛰어넘은 첫 모델이기도 하다.

 

-원래 네트워크 깊이를 늘리다보면 어느 순간부터 정확도가 감소되어 포화상태에 이르게 된다.

 원래는 오버피팅의 문제로 생각했으나, 사실 오버피팅의 문제가 아니었다.

 이 때 degradation 문제라는 것이 생겨났다.

-즉, 기울기 소실로 인해 최적화가 덜 되어 깊은 층의 네트워크가 잘 학습되지 않은 문제.

 

-이러한 문제를 방지하기 위해 Residual connection을 도입했다.

 

-residual(skip) connection : 층이 깊어질수록 기존의 input x의 영향력(기울기)이 소실되어 충분히 학습하기 어렵다.

 따라서, 몇 개의 층을 지나면 기존의 x와 동일한 값(identity)를 잔차(residual)로 더해주어, 잔여부분만 학습함으로써

 학습 부담을 경감시킨다. (분할정복과 비슷한 원리)

 

-역전파 시에도 기울기가 원래 네트워크의 레이어와 skip connection 두 군데로 흐르므로 한 곳에서 기울기

 소실이 일어나도 다른 한 쪽으로 정상 학습을 진행할 수 있다.

 

 

DenseNet

-Dense block : x 식별자를 그대로 더하던 ResNet의 Residual Block과 달리 레이어의 출력을 채널 축 방향으로

 concat하는 블록

-기울기 소실 문제를 해결했고, 특징 전파를 강화했다.

-또한 특징 재활용이 가능해졌다. 이는 concat으로 메모리는 더 많이 쓰게 되지만, 이전 층 레이어들의 정보를 합치지

 않고 그대로 보존하고 있어 필요하면 꺼내서 쓸 수 있게 되었다.

 

 

SeNet

-깊이를 깊게 만들거나 connection을 사용하지 않고 채널 간 관계를 모델링하여 중요한 특징에 어텐션할 수 있도록

 만드는 방법

-Attention을 생성하는 방법에는 두 가지가 있다.

  1) Squeeze : 글로벌 평균 풀링으로 각 채널의 공간정보를 없애고 분포만 보게 한다.

  2) Excitation : 완전연결층을 하나 두어 Squeeze한 값을 통과시키며 채널간의 연관성을 나타내는 어텐션 스코어 계산

 

 

EfficientNet

-기존의 네트워크는 성능을 높이기 위해

 1) 폭 증가

 2) 깊이 증가

 3) resolution scaling

 을 사용했는데, 각각 방법은 서로 다른 정확도 향상을 보여준다.

-EfficientNet은 위의 세 방법들을 적절한 비율로 섞은 compound scaling을 제안했다.

 

 

Deformable Convolution Network

-불규칙한 2D 이미지에 대한 컨볼루션으로, 사람이나 동물은 팔다리가 어떤 위치에 있느냐에 따라 전체적인 형태가

 달라진다.

-기존의 컨볼루션 필터에 추가로 2D 오프셋 맵을 추정하기 위한 Branch가 결합되어 있다.

-즉 합성곱 연산의 결과에 offset 필드를 추가해 offset된 특징 맵을 추출한다.

 


 

 

Data augmentation

-NN은 데이터를 통해 지식을 얻는다. 그렇기에 데이터의 양과 비편향성은 모델의 성능에 큰 영향을 끼친다.

-하지만 데이터는 언제나 편향되어 있어 실제 데이터와는 다르다.

-즉 학습 데이터는 결코 실제 데이터와 같을 수 없고, 실제 데이터의 일부분에 불과하다.

 이는 모델의 일반화 가능성을 떨어뜨린다.

 

-예를 들어 밝은 이미지로 학습한 모델은 어두운 이미지를 제대로 인식할 수 없다.

-이러한 문제는 데이터를 변형하여 풍부한 학습 셋을 만듬으로써 어느정도 해결할 수 있다.

-그 방법으로는 밝기를 변경하거나 회전, 잘라내기 등의 방법들이 있다.

-이러한 방법으로 학습 데이터를 실제 데이터와 어느정도 유사하게 만든다.

 

-밝기 변화의 경우 Numpy를 활용해 채널의 RGB 값을 변경함으로써 구현할 수 있다.

-Rotate은 OpenCV의 rotate 함수로 구현이 가능하다.

-Crop의 경우에는 numpy를 사용해 구현이 가능하다.

-기하학 변화(Affine transformation)의 경우 numpy로 대응쌍 (원래의 위치와 변경될 위치)를 선언하고

 cv의 getAffineTransform으로 구현이 가능하다.

-cutmix는 이미지들을 잘라 합성하는 것인데, 라벨이 원 핫에서 소수 단위로 변경된다.

 물체의 위치를 정교하게 학습할 수 있게 된다고 한다.

 

-이러한 augmentation은 하나만 수행하는 것이 아니고, 여러 가지 방법들을 조합하여 사용해야 한다.

-즉, crop의 경우 crop만 하는 것이 아니라 밝기를 변화시켜 crop한다.

-방법들의 조합과 순서는 임의로 정하기 힘들고, 랜덤으로 섞어서 수행해보면서 가장 성능이 좋은 방법을

 사용해야 한다.

-랜덤 augment는 어떤 방법을 사용할지, 얼마나 세게 적용할지가 중요한 파라미터가 된다.

 

 

 

Leveraging pre-trained information

-모델 학습에는 다양한 데이터와 레이블이 필요하다.

-데이터와 레이블을 수집하는 것은 비싼 비용이 들게 된다.

-하지만 그렇게 수집한 데이터와 레이블이 오히려 별로인 것일 수 있다.

-그래서 transfer learning으로 새로운 모델을 학습시키는 것이 아닌, 기존에 학습된 모델을 불러와

 높은 정확도를 달성할 수 있다.

 

-Transfer Learning은 다른 데이터 셋에서 학습한 모델을 또다른 데이터 셋에 적용하는 것이다.

-즉 한 데이터셋에서 학습한 지식 중 다른 데이터셋에 적용할 수 있는 공통된 지식을 이용하는 것이다.

 

-여러 가지 방법이 있다.

 1) 미리 학습한 모델을 가져와 완전연결층만 교체하여 새로운 데이터 셋에 적용한다. 즉 미리 학습한 모델은

    추가 학습을 진행하지 않는다.

 2) 미리 학습한 모델에서 완전연결층을 교체한 후, 미리 학습한 모델의 lr을 낮게 하여 느리지만 새로운 업데이트를

    진행한다. 즉 미리 학습한 모델을 약간 더 학습시킨다.

 3) Knowledge distillation : 미리 학습한 모델을 새로운 모델에 주입한다.

 

 

Knowledge distillation (teacher-student learning)

-모델 재사용의 진보적인 방법으로, 심플하다.

-미리 학습한 모델의 지식을 새로운 모델에 전달하여 학습한다.

-최근에는 Teacher model의 출력을 unlabled 슈도 레이블로 사용하여 더 큰 Student model을 학습할 때

 더 많은 데이터를 사용하게 할 수도 있다.

-student는 teacher보다 더 작은 모델을 사용하는 것이 일반적이다.

-같은 Input에 대해 student와 teacher가 동시에 예측을 하고, 예측값의 차이에 따라 student만 학습을 진행한다.

-즉 student는 teacher를 따라하게 되고, 레이블을 사용하지 않기에 비지도 학습에 속한다.

 

-만약 레이블이 존재하는 데이터를 가지고 있을 경우, student의 예측값과 실제 레이블을 계산한 Student Loss와

 Teacher의 예측값을 비교한 Distillation Loss를 각각 구한다.

-Disillation Loss는 KL-divergence에 Soft 라벨을 사용한다.

-Student Loss는 CrossEntropy에 Hard 라벨을 사용한다.

 

*Hard Label (원핫 벡터)

*Soft Label (소프트 맥스 결과로 나온 벡터)

 

 

Laveraging unlabeled dataset for training

-추가적인 레이블링 없이 성능을 향상하는 방법

-Semi-supervised learning(반지도 학습)인데, 라벨이 있는 일부 데이터셋과 라벨이 없는 대부분의 데이터셋으로

 학습을 진행한다.

-실제 데이터들은 대부분 라벨이 없는 데이터인데, 즉 여러 종류의 데이터를 활용할 수 있게 된다.

-라벨이 있는 데이터로 모델을 학습시킨 후 라벨이 없는 데이터들의 슈도 라벨을 생성한다.

-그 후 모든 데이터를 활용해 모델을 다시 한 번 학습시킨다.

 

 

Self-training

-기존에 비해 성능 향상이 압도적이었다.

-Augmentation과 Teacher 재사용을 합친 방법이다.

-한 번 학습 후에는 새로 학습된 Student Model이 Teacher Model이 되어 다시 한 번 학습을 전개한다.

-이러한 과정을 반복한다.

-원래는 Student가 Teacher보다 더 작은데, 여기서는 반대가 되어 Student Model이 조금씩 커진다.

 

 


  • 피어세션 회의 내용

 


  • 해야할 일

 


 

728x90
반응형