Object Detection Library

  • MMDetection & Detectron2

1. Object Detection을 위한 Library

Overview

  • 통합된 라이브러리의 부재
  • 실무 / 캐글에서는 아래 두 라이브러리를 주로 활용함
    • MMDetection
    • Detectron2

2 MMDetection

2.1 MMDetection

2.2 Config File

Object Detection Overview

Backgrownd for Object Detection Task

2.1 Task

이미지 안에서 객체를 검출하는 Task이다.

Semantic segmentation 은 객체의 영역을 구분하는 Task 이다. 같은 클래스를 구분하진 않는다.

반면에 Instance Segmentation 객체의 영역을 구분하고, 어떤 클래스인지에 대해서 까지 구분하는 Task이다.

2.2 Real World

2.3 History

2.4 Evaluation

  • 성능
    • mAP (mean average precision) : 각 클래스당 AP의 평균
  • 속도
    • FPS
    • Flops

mAP를 계산하기 위해 필요한 개념

  • Confusion matrix
  • Precision & Recall
  • PR curve
  • AP (Average Precision)
  • IOU (Intersection Over union)

Confusion matrix

Precision & Recall

PR Curve

AP

PR Curve를 그린 후 아래 면적을 구하면 AP가 된다.

mAP

IOU

FPS

FLOPs (Floating Point Operations)

2.5 Library

Lecture

3.1 Curriculum

  1. Onject Detection Overview
  2. 2 Stage Object Detectors
  3. Object Detection Library
  4. Neck
  5. 1 Stage Object Detectors
  6. EfficientDet
  7. Advanced Object Detection 1
  8. Advanced Object Detection 2
  9. Ready For Competition !
  10. Object Detection in Kaggle

3.2 Special Mission

3.3 ETC

퓨샷 러닝(few show learning) 이란?

퓨샷 러닝은 말 그대로 적은(few) 양의 데이터를 가지고 학습하는 것을 의미한다. 퓨샷 러닝 모델이 완전히 새롭게 주어진 데이터에서도 잘 작동하도록 만들기 위해서는 에피소딕 훈련(episodic training) 방식의 메타러닝(Meta learning, 사람이 통제하던 기계학습 과정을 자동화함으로써 기계 스스로 학습 규칙을 익힐 수 있게 하는 방법)이 필요하다. 에피소딕 훈련은 퓨샷 작업과 유사한 형태의 훈련 작업을 통해 모델 스스로 학습 규칙을 찾아낼 수 있도록 하여 일반화 성능을 향상하는 역할을 한다.

사람에게 왼쪽과 같은 support set 의 이미지를 주고 오른쪽의 Query가 Armadillo 인지 Pangolin 인지 풀게 한다면 모두 Query image는 Pangolin 이라고 대답할 것이다.

전통적인 딥러닝 모델은 이와 같이 각 클래스별 사진 단 두장을 가지고 Query 이미지를 맞출 수 있었을까? 아마도 Armadillo image 1000장, Pangolin image 1000장을 준비했어야 할지도 모른다. 그렇다면 우리는 이 문제에 어떻게 이문제에 대해서 쉽게 답할 수 있었을까? 이러한 학습시도를 Meta Learning 이라고 한다.

하지만 우리가 구분하는 "방법을 배우는" 과정 에서는 수많은 학습이 있었다. 사자와 호랑이가 다른 것을 배우고, 토끼와 고양이가 다른 것을 배우고와 같은 수 많은 시행착오와 학습이 바로 지금의 내가 천산갑과 아르마딜로가 다르다는 판단을 내릴 수 있게 도와주었던 것이다.

Few shot learning은 바로 이러한 점에 착안된 Meta learning의 한 종류이다. 따라서 "배우는 법을 배우려면" 어찌 되었든 많은 데이터가 필요하고 아래와 같은 데이터들로 학습이 될 것이다. 다만 다른 점은 구분하려는 문제 (Armadillo 인지 Pangolin 인지) 의 데이터는 Training set에 없어도 무방하다.

우리는 Few show learning을 위해 Training set, Support set, Query image가 필요하다는 점을 이해할 수 있다. 한마디로 정리하면, Training set을 통해 구분하는 법을 배우고, Query image가 input으로 들어왔을 때, 이 Query image가 Support set 중 어느 것과 같은 종류인지를 맞추는 일을 하는 것이다. 즉 Query image가 어떤 클래스에 속하느냐의 문제를 푸는 것이 아니라 어떤 클래스와 같은 클래스냐 의 문제 를 푼다고 생각하면 이해하기가 쉽다.

What's the difference?

먼저 Supervised learning은 아래의 그림처럼 Test image(Query image)의 클래스가 Training set에 있다. 즉, 학습에 강아지 사진을 주고 강아지를 잘 학습했는지 묻는 것이다.

하지만 Few sohw learning은 Training set에 없는 클래스를 맞추는 문제이다.

이 Support set의 클래스 개수와 샘플 수를 기준으로 k-way n-shot 이라는 표현을 쓴다. k-way는 Support set이 k개의 클래스로 이루어졌다는 것이고, 이는 Query image가 k개의 클래스 중 어떤 것과 같은 것인지 묻는 문제가 되므로 k가 클수록 모델의 정확도는 낮아지게 된다. n-shot은 각 클래스가 가진 sample의 개수로 비교해볼 사진이 많으면 많을수록 어떤 클래스에 속하는지 알기 쉽기 때문에 n이 클 수록 모델의 정확도가 높아지게 된다. 그리고 이 n이 1이 되면 one-shot learning 이라고 부르게 된다.

Transfer learning과 다른 점은 사실 굉장히 애매하다. Transfer learning은 특히 vision 분야에서도 다른 도메인으로 학습된 모델의 layer의 일부를 frezee 하고 일부를 다른 도메인의 image로 fune-tuning하는 과정을 통칭한다. 이 때 새로운 도메인의 경우 많은 라벨링된 데이터가 있을 수도 있다. 하지만 Few shot learning의 경우 꼭 일부를 frezee하고 fine-tuning 하는 것을 의미하지는 않으며(fine-tuning을 안해도 상관이 없음) 말 그대로 새로운 도메인(or unseen dataset)이 적게 있는 경우를 지칭한다.

학습 방법

Few shot learning의 기본 학습 방법은 유사성을 학습하는 것이다. 즉, 두 개의 사진이 주어졌을 때 각 사진을 잘 분석해서 두 사진이 유사한지 다른지를 판단할 수 있다면, Query image가 주어졌을 때 Support set의 사진들과 비교하여 어떤 클래스에 속하는지 알아낼 수 있다.

그림에서 x1과 x2 는 같은 class이고, x1과 x3는 다른 class인 것을 잘 알아내는 모델을 학습하는 것이다. 따라서 우리의 모델은 많은 training set을 통해 각 사진별로 중요한 특징들을 잘 추출해서 "같다"와 "다르다"를 학습해야 한다.

이후에 Query image에 대해 Support set의 image들과 유사성을 구하고 가장 유사한 이미지를 가진 class로 분류할 수 있게 된다.

How to make dataset?

그림과 같이 Positive set, Negative set으로 구성하여 학습이 진행된다. 이 때 Feature extraction을 잘 학습할 수 있는 모델을 디자인해야 하는데 일반적인 Conv-Relu-Pool의 구조도 충분히 적합하다.

기초 Few show learning에서는 샴 네트워크(Siamese Network)를 사용하는데, 같은 CNN 모델을 이용하여 hidden representation을 각각 구한 뒤 이 차이를 이용하는 방식이다.

이후 Positive pair와 Negative pair에 대해서 번갈아가며 학습을 진행하게 된다.

Prediction에서는 위에서 설명한 것과 같이 Support set의 이미지의 representation과 Query image의 representation 간의 차이를 샴 네트워크를 이용하여 training에서의 방법과 같이 계산하여 유사성을 구할 수 있게 된다.

Trend of research on fuset learning

1. 거리 학습 기반 방식 (metric learning)

범주별 훈련 데이터의 수가 적은 few shot task에서는 딥러닝 처럼 classification의 weight를 훈련하는 방식이 적합하지 않다. 아래 그림과 같이 task를 구성하는 N * K개의 소수 훈련 데이터에만 지나치게 적응하는 overfitting 현상이 발생할 수 있기 때문이다.

그 대신 아래 그림처럼 Support data와 Query data 간의 거리(유사도)를 측정하는 방식을 활용한다. 모델은 주어진 서포트 데이터를 특징 공간(feature space)에 나타낸다(=특징 추출). 이 공간 상에서 Query data의 범주는 유클리디안 거리(Euclidean distance)가 가장 가까운 Support data의 것으로 예측된다. (거리 계산 + 최근린 선택).

모델은 아래 그림처럼 두 데이터의 범주가 같으면 거리를 더 가깝게 두고, 다를 때는 거리가 더 멀게 만드는 방법을 학습한다. 이를 두고 거리 학습(distance training)이라고 한다. few shot learning 초기에 활용되던 거리 학습은 가장 간단하면서도 효과적인 것으로 알려져 있다.

1. Siamese Neural Network for one-shot image recognition

이전에는 인간이 직접 설계한 특징으로 거리 학습을 시도했다면, 샴 네트워크(Siamese network)는 처음으로 Deep Neural Network(DNN) 를 활용했다는 점에서 의의가 있다고 본다. 대표적인 DNN 응용 알고리즘인 CNN으로 특징 추출기를 만든 것이다. 매개변수를 공유하는 동일한 구조의 특징 추출기는 두 데이터 간 거리를 학습한다.

자세히 설명하자면, CNN은 검증 손실 함수(verification loss funtion) 값을 최소화할 때까지 훈련된다. 이 검증 손실 값은 두 입력 데이터의 범주가 같은 상황에서 특징 공간상 거리가 멀면 커진다. 두 데이터의 범주가 다른 상황에서 거리가 가까워져도 마찬가지이다. 이런 검증 손실 값을 최소화함으로써 모델은 범주가 같은 두 데이터 거리가 가까워질수록, 또는 범주가 다른 데이터의 거리가 멀어지게 하는 특징을 얻게 된다.

2. Matching networks for one-shot learning

샴 네트워크에서 특징 추출기는 두 개의 입력 데이터 간 거리를 절대적으로 0으로 만들거나 크게 만드는 훈련에 집중한다. 그러나 이는 테스트 단계에서 주어지는 N-way K-shot 문제를 푸는 데 최적화된 방법론이라고 볼 수는 없다. 쿼리의 범주는 상대적으로 더 가까운 Sopport data의 것으로 결정되기만 하면 된다. 따라서 N-way K-shot 문제에서는 데이터 간 상대적 거리를 잘 표현하는 특징 추출기를 만들 필요가 있다.

이 논문에서는 최근린 선택기를 미분이 가능한 형태로 제안함으로써 특징 추출기가 스스로 데이터 간 상대적 거리를 표현하는 방법을 익히도록 했다. 아울러 N-way K-shot training task에 기반한 에피소딕 훈련 방식을 하는 등 모델의 범주 예측 성능을 높였다.

3. Prototypical networks for few-shot learning

5-way 5-shot task 가 주어졌을 때 기존 방식에서는 Support data 25개와 Query data 간 거리를 일일이 계산했다. 반면, 이 노눔네엇는 범주별 서포트 데이터의 평균 위치인 프로토타입(prototype)이라는 개념을 사용한다. 결과론적으로 모델은 5개 범주를 대표하는 프로토타입 벡터와 쿼리 벡터와의 거리만 계산하면 된다.

저자는 퓨샷 데이터가 주어진 상황에서 프로토타입 네트워크가 Matching networks보다 성능 면에서 더 유리하다고 주장한다. 쿼리 예측에 필요한 계산량을 N * K에서 N개로 줄이는 한편, 그 구조가 더 단순하다는 걸 근거로 제시하고 있다.

위 프로토타입 네트워크는 범주별 서포트 벡터 간 평균 위치인 프로토타입을 활용해 모델의 복잡도를 줄였다.

4. Learning to compare : relation network for few-shot learning

한 task에서{고양이, 자동차, 사과} 처럼 서로 완전히 다른 성격의 범주를 분류하는 문제라면 물체의 모양{shape} 정보만으로도 쿼리 데이터의 범주를 쉽게 예측할 수 있을 것이다. 하지만 특징 추출기가 같은 범주의 데이터를 더 가깝게, 다른 범주의 데이터를 더 멀게 할 정도로 충분히 복잡하지 않다면 어떨까? 그렇다면 {러시안블루, 페르시안, 먼치킨}처럼 고양이의 종류를 구분하는 task를 풀기 어려울 것이다.

이 논문에서는 특징 추출기에 CNN을 적용했을 뿐만 아니라 거리 계산 함수에도 다층 퍼셉트론을 적용시켰다. 다층 퍼셉트론은 같은 범주 또는 다른 범주의 서포트 데이터와 쿼리 데이터를 분류하는 법을 배운다.

2. 그래프 신경망 방식(Graph Neural Network)

최근에는 적은 양의 데이터만으로도 분류 성능을 극대화하고자 데이터 간 복잡한 관계 정보를 학습에 활용하는 추세이다. 가장 많이 연구되는 게 바로 그래프 신경망이다.

우리가 흔히 아는 일반적인 인공 신경망은 입력값으로 벡터나 행렬 형태를 활용한다면, GNN 은 밀집 그래프(dense graph) 구조를 활용한다. 그래프에서 노드는 데이터를, 노드와 노드를 잇는 간선(edge)은 데이터 간 관계 정보를 나타내며 밀집 그래프는 모든 노드가 서로 완전히 연결된 것을 가리킨다. GNN은 바로 이 그래프 구조와 각 노드에 해당하는 데이터의 특징 벡터를 입력받는다.

1. Few-shot learning with graph neural networks

이 논문에서는 GNN의 동작 방식은 다음과 같다. 각 노드는 해당하는 데이터의 특징 벡터로 초기화된다. 그 다음, 특정 노드 V의 이웃 노드에 노드별 거리(유사도)를 곱한 값들의 합(가중평균)을 구한다. 이를 V와 합쳐 새로운 벡터 V'를 얻는다. 다른 노드에 대해서도 같은 연산을 순차적으로 반복한다. 가장 마지막에 쿼리 노드 벡터값의 업데이트를 완료한다. 모델은 N개의 범주와 완전히 연결된 Fully connected layer층을 통해 쿼리 데이터의 범주를 예측한다.

한 task를 구성하는 데이터 간의 관계를 나타내고자 그래프 신경망 구조를 활용하고 있다.

2. Transductive propagation network for few-shot learning (TPN)

TPN 또한 기존 GNN 처럼 특정 노드와 이웃 노드와의 거리를 계산해 범주 정보를 전파한다. GNN과 다른 점은 노드값을 초기화한 후 더는 업데이트하지 않는 데 있다. 이렇게 되면 범주 정보를 연쇄적으로 전퍼하는 부분을 하나의 닫힌 형태 방정싱(close form equation)으로 표현할 수 있게 된다. 이 방식에서는 범주 정보 전파 횟수에 비례해 늘어나는 연산 횟수가 단 한번으로 줄어 들고, 매 단계에서 얻은 각 노드의 범주 벡터는 메모리에 기록될 필요가 없다. 즉, 노드 사이 거리를 고정하면 계산량과 메모리 사용량을 획기적으로 줄일 수 있다는 의미이다.

TPN과 GNN의 또 다른 차이점은 한 그래프에서 참고하는 서포트 데이터의 수입니다. 5-way 5-shot 문제에 10개의 쿼리 데이터가 있다고 가정해보자. GNN은 25개의 서포트 데이터와 1개의 쿼리 데이터, 즉 26개의 노드로 이루어진 그래프를 각각 10개를 구성해 쿼리 10개에 대한 범주를 완전히 독립적으로 예측한다. 반면, TPN은 25개의 서포트 데이터와 10개의 쿼리 데이터, 즉 35개의 노드로 이루어진 단 하나의 그래프를 구성해 쿼리 10개의 범주를 한꺼번에 예측한다.

이처럼 TPN은 모든 쿼리 데이터를 학습에 활용함으로써 그 범주를 더 정확하게 예측하게 된다. 데이터가 지극히 적은 상황에서 쿼리 데이터도 활용하면 저차원의 매니폴드(manifold) 공간에서 결정 경계(dicision boundary)를 더욱 수월하게 찾을 수 있기 때문이다. 이처럼 labeling data와 test data의 분포를 고려해 test data의 범주를 추론하는 방식을 변환 학습(transductive learning)이라고 한다.

TPN은 주어진 서포트 데이터와 쿼리 데이터를 단 하나의 그래프로 구성하고 쿼리의 범주를 동시에 예측한다. 쿼리의 매니폴드를 활용하면 범주 분류 성능을 높일 수 있어서다.


참고자료

https://www.kakaobrain.com/blog/106

https://www.youtube.com/watch?v=hE7eGew4eeg

3D Understanding

Seeing the world in 3D persprective

We live in a 3D space

3D가 중요한 이유?

  • 우리가 3D World 에 존재하고 살아가기 때문에 3D space에 대한 이해가 중요하다.

3D application - AR/VR/Medical application

  • 우리의 몸을 구성하는 요소들이 전부 3D로 구성되어있기 때문에 이러한 과정을 이해하는 것이 중요하다.

1.2 The way we observe 3D

한 가지 point 에 대한 두 가지 위치정보를 알고 있다면 3D point 를 알 수 있는데 이것을 Triangulation 이라고 한다.

1.3 3D data representation

3D image를 2D array에 각각 value 를 저장함. (color일 경우 3차원)

Multi-view image 에서는 각각의 위치에서 저장한 사진을 이용해 3D를 표현하는 방법이다.

Volumetric(voxel) 은 3D space를 격자로 나누어 격자가 3D object가 차지하고 있는지에 대한 것을 0과 1의 binary 형태로 나타낸다.

part assembly는 3D object를 간단한 기본적인 도형으로 parametic한 집합으로 part를 표현하는 방식이다.

Point cloud는 3D 상에 있는 point들의 집합을 통해 표현하는 방법이다. (point 는 x,y,z의 위치정보를 나타냄)

Mesh(Graph CNN) 는 (x,y,z)의 3D point를 삼각형 형태로 나타내고(vortax) 두 점을 잇는 선(edge)과 같이 포함하여 삼각형(면)을 나타내어 표시한다.

Implicit shape는 3D를 고차원의 function 형태로 나타내고 0과 교차하는 부분을 표시하면 3D로 나오게 되는 방법이다.

1.4 3D datasets

  • part들의 instance도 구별되어 있음.

  • 자율주행을 고려한 Data set

2. 3D tasks

2.1 3D recognition

  • Recognition 이나 Detection (3D bounding box) 을 활용할 수 있다.

2.2 3D object detection

  • 무인 차 application 에서 활용 가능성

2.3 3D semantic segmentation

3D object에 대해 각 part를 segmenation

2.4 Condition 3D generation

한 개의 ROI 에서 각각의 feature(Bounding box, Class, Mask) brach 들을 추출한다.

Mash R-CNN 에선 3D branch(mash) 가 추가된다.

더 정교한 3D를 구성하기 위한 3D object Decomposing

Conditional Generative Model

1. Conditional generative model

1.1 Conditional generative model

image

서로 다른 두 도메인을 translation 한다.! -> 하나의 정보(조건)이 주어졌으므로 condition 이라 칭함.

image

기본적인 Generative Model은 영상이나 샘플은 생성할 수는 있었지만 조작은 할 수 없었다. 생성을 더 유용하게 하기 위 해서는 어떤 형태로든 유저의 의도가 반영할 수 있다면 무수히 많은 응용 가능성이 생긴다. 그런 생성 모델 방식을 Conditional generative model 이라고 한다.

image

Low quality audio을 high quality audio로 높혀주는 것도 Conditional Generative model의 일종이다.

image

image

image

1.2 Conditional GAN and image translation

image

1.3 Example : Super resolution

image

image

image

image

image

image

2. Image translation GANs

2.1 Pix2Pix

Task definition

image

Loss function of Pix2Pix

image

Total loss (GAN loss + (L1 loss = MAE loss)) 를 쓰는 이유

  1. y 가 ground Truth 인데 x 라는 입력을 넣었을때 기대하고 있는 출력 페어를 가지고 있는 데이터에 대해 학습을 진행한다.(supervised learning) 이 경우에, GAN Loss 만 사용한다면 입력된 두개의 페어(x,y)를 직접 비교하지않고 독립적으로 Discriminator 해서 real 이냐 fake 이냐에 대해서만 판별을 한다. 따라서 입력이 무엇이 들어와도 y와 직접 비교하지않기 때문에 GAN만 사용한다면 y와 비슷한 결과를 만들어 낼 수 없다. 따라서 L1 Loss 를 사용해서 기대하는 결과인 y 와 비슷한 영상이 나오고 GAN Loss 를 이용하여 reality 한 영상을 만들 수 있게 해준다.

  2. GAN만으로 학습하기엔 굉장히 불안정하고 어렵기 때문에 학습이 조금 더 안정적으로 이루어질 수 있도록 보조하는 역할도 한다.

image

2.2 CycleGAN

image

지금까지의 Pix2Pix는 supervised learning 기법을 사용했기 떄문에 pairwise data가 필요하다.

하지만 pairwise data 를 항상 얻는게 어렵기 때문에 Unpaired data 데이터를 사용해서 X 와 Y 의 대응관계가 없이 data set으로만 주어졌을때 활용하는 방법에 대해서 고민했고 해결책으로 CycleGAN 이 제시되었다.

image

CycleGAN은 도메인간의 non-pairwise datasets 으로 translation 이 가능하도록 하게 해줌.

Loss funtion of CycleGAN

image

X -> Y 스타일로 가는 방향과 Y -> X 스타일로 가는 방향을 동시에 학습하여 모델링을 한다.

GAN loss in CycleGAN

image

If we sloely use GAN loss

image

GAN Loss만 사용할 경우 (Mode Collapese issue) input에 상관없이 하나의 output 만 계속 출력하는 형태로 학습한다. -> GAN Loss 기준에선 좋은 Loss를 갖게 된다!

Solution: Cycle-consistency loss to preserve contents

image

content 보존을 위한 Loss. x를 input으로 G를 활용해 생성한 y^가 F를 활용해 x^를 생성했을때 x와 x^가 비슷하도록 학습.

2.3 Perceptual loss

image

image

high quality output 을 얻기 위한 Loss

GAN is hard to train

image

pretrained 된 visual perception들이 인간의 visual perception과 유사한 측면이 발견됨. ( 사람의 눈과 비슷한 역할 )

image

Perceptual loss 를 사용하면 GAN을 사용하지 않고도 Loss 하나만을 추가함으로서 쉽게 style transfer를 할 수 있는 generator를 학습시킬 수 있다.

image

Image Transform Net : input image가 주어지면 하나의 style로 transformed 을 해준다.

Loss network(Fix된 VGG16) : image classification network -> feature 추출

image

Feature Reconstruction Loss

input x 에서부터 y^ 생성한다.

y^이 의도한 바로 transform이 되기 위해 VGG 를 사용해 feature 를 추출하고 backpropagation 을 해서 중간 transform을 하려는 f를 학습한다.

Transformed image가 input x에 포함되어 있었던 Content 정보를 유지하고 있는지 권장해주는(?) Loss가 바로 Feature reconstruction loss 이다.

Content Target 은 원본 x 를 입력으로 넣어주고, 이후 VGG 를 통과하여 feature 를 추출한다. 그 다음 마찬가지로 transform된 이미지에 대해서도 feature를 추출한다. 이 두가지를 비교해서 Loss 를 분해한다.

이 두개를 분해할땐 L2 Loss 를 통해 backpropagation 을 이용하여 y를 업데이트 할 수 있게끔 해준다.

image

Feature reconstruction loss는 Pre-trained 모델 Hidden Layers에서 출력이미지와 원본이미지의 두 Feature space 을 추출하여 연산하며, 두 Feature space 간의 Euclidean distance를 나타낸다. 해당 Loss의 특징은 아래 그림과 같이 이미지 전반적인 구조(Overall spatial structure)를 유지하며, 그 외 색상이나 질감에 대한 특징은 보존하지 않는다.

Style reconstruction loss

image

변환하고 싶은 style image 를 style target 으로 입력한다.

style target 과 transformed image 를 VGG에 입력으로 넣어줘서 feature를 추출한다.

image

Style reconstruction loss는 바로 위에 설명했던 Feature reconstruction loss와 정반대로, 이미지의 전반적인 구조보다는 원본이미지의 색상이나 질감을 출력이미지가 표현할 수 있도록 만드는데 기여하는 Loss 이다.

Gram Matrices

이미지 전반에 걸친 통계적 특성을 담기 위함.

gram matrix란 flatten feature maps 간 계산한 covariance matrix이다.

이미지 데이터의 style은 CNN 모델의 feature map과 feature map의 correlation(gram matrix)으로 사전 정의한다. 결국 기존 그림의 gram matrix와 새로운 그림의 gram matrix의 loss 차를 최소화 시켜 새로운 그림에 기존 그림의 style을 입히겠다는 의미를 갖는 것이다.

segmentation, localization

1. Instance segmentation


1.1 What is instance segmentation?

image

semantic segmentation 과 instance segmentation 의 가장 큰 차이는 객체, 즉 instance 가 다르다면 구분이 가능한지의 여부이다.

1.2 Instance segmenters

image

RoIAlign (New Pooling layer) : interpolation 을 통해서 정교한 소수점 pixel level 의 pooling을 지원함으로써 조금 더 정교한 feature를 뽑을 수 있게 되어 성능 향상을 이루었다.

image

image

image

  1. 기본 backbone 구조는 feature pyramid 구조를 가져와 사용한다.

  2. 가장 큰 특징은 Mask의 prototypes을 추출해서 사용한다는 점이다. (Mask R-CNN에서는 실제로 사용하지 않는다고 해도, 80개의 클래스를 고려하고 있다고 가정하면, 80개의 각각 독립적인 Mask를 한번에 생성해내는 구조, 여기서는 Mask 는 아니지만 Mask를 합성해낼 수 있는 기본적인 여러 물체의 soft segmentation component들을 생성해낸다.)

  3. Predition Head에서 Prototype들을 잘 합성하기 위한 계수들(coefficient)을 출력한다.

  4. 이 계수들과 prototype을 선형결합해서 각 detection에 적합한 Mask response map을 생성해준다.

  5. 이후 Bounding box 에 맞춰 Crop 도 진행해준다.

여기서 Mask를 효율적으로 생성하기 위해서 prototype 개수를 80개 전부 사용하지 않고, object 개수와 상관없이 적당히 작게 설정하여 그것의 선형 결합으로 다양한 Mask를 생성하는게 Key point 이다.

image

이전 Frame에서 Key Frame에 해당하는 feature를 다음 Frame에 전달해 feature map 의 계산량을 획기적으로 줄였다.

Object detection


1. Object detection

1.1 what is object detection?

image 인식 분류의 기초

image

Semantic segmentation와 imstance segmentation, panoptic segmentation 의 차이점은 같은 클래스라도 객체가 다르다면 구분이 가능한지 아닌지의 여부이다.

image

Object detection 은 Classification 과 Box localization 을 동시에 추정하는 문제.

1.2 What are the applications of object detection?

image

image

그림과 같이 자율주행에 이용되기도 한다.

image

image

Optical Character Recognition 에서도 복잡한 배경 속에서 글자를 인식하여 위치를 특정해야 하기 때문에, object detection이 필요하다.


2. Two-stage detector (Regional proposal과 Classification이 순차적으로 진행)

image

Neural network 이전의 object detection 을 해결하기 위한 과정들.

Selective search

image

  1. 다양한 물체들에 대해서 Bounding box 를 제한을 해준다.

  2. 영상을 비슷한 색끼리 잘게 분할한 후(Over-segmentation) 분할된 영역들을 비슷한(색깔이나 gradient의 유사성) 영역끼리 반복해서 합쳐준다.

  3. 이를 반복하면 큰 segmentation 이 만들어지고, 이를 포함하는 Bounding box를 설정해 물체의 후보군으로 사용한다.

image

  • 기존 Object detection 의 단점

    • 기존에는 sliding window 방식으로, 물체가 있을만 한 곳을 하나씩 탐색하여 물체를 탐색했다. Sliding window 방식은 크기가 고정되지 않아 여러 크기로도 순차적으로 계산해야 하기 때문에 경우의 수가 폭발적으로 증가하여 이를 분류하기 위해서는 연산량이 많아지고 연산시간이 오래걸려 비효율적이다.

2.1 R-CNN

image

첫 deep learning 기반 object detection

R-CNN은 기존 object detection의 단점을 보완하고자 Region Proposal 이라는 방식을 제안한다.

Selective search를 활용해 물체가 있을 법한 장소를 2000개 탐색하고, 이에 대해서 분류를 진행한다.

R-CNN 논문

위 논문에서는 물체가 있을법한 장소를 추출한 뒤, 크기에 상관없이 227x227로 이미지를 압축한다.

그리고 이렇게 모인 이미지를 CNN을 거쳐 feature vector를 계산하고 Linear SVM을 통해 object를 분류하게 된다.

image

2.2 Fast R-CNN

이전 R-CNN 의 문제점

1. 학습이 multi-stage pipline으로 이루어진다.

2. 학습에서 경제성이 떨어진다.

3. object detection이 느리다.

image

이러한 문제를 해결하기 위한 Fast R-CNN 의 출현

Fest R-CNN 모델 구조

1. input image와 multiple regions of interest(ROI = 이미지상 내가 관심있어하는 일부 영역)가 입력으로 사용된다.

2. 각각의 ROI는 ConvNet 연산을 통해 고정된 크기의 ROI에 해당하는 feature map 으로 pooling되고,

FC layers 를 통해 feture vector로 맵핑된다.

3. ROI 별 두개의 output을 가지고, 더 정밀한 bounding box 를 추정하기 위해

bounding box regressor과 softmax 를 통한 classification 을 수행한다. 

Fast R-CNN

image - ROI Pooling layer

2.3 Faster R-CNN

image

IOU = (두 영역의 교집합 / 두 영역의 합집합)

Anchor boxes

image

  • 직관적으로 설명하자면, 동일한 크기의 sliding window를 이동시키며 window의 위치를 중심으로 사전에 정의된 다양한 비율/크기의 anchor box들을 적용하여 feature를 추출하는 것이다. 이는 image/feature pyramids처럼 image 크기를 조정할 필요가 없으며, multiple-scaled sliding window처럼 filter 크기를 변경할 필요도 없으므로 계산효율이 높은 방식이라 할 수 있다. 논문에서는 3가지 크기와 3가지 비율의, 총 9개의 anchor box들을 사용하였다. positive 한 box 들과 negative 한 box 들의 loss를 줘서 학습하도록 유도한다.

image

core contribution = RPN(Region Proposal Network)

image

RPN 의 구조

- feature map 관점에서 fully convolution 하게 sliding window 방식으로 이동하며 매 위치마다 k 개의 anchor box를 고려한다.

각 위치에서 256 dimension 의 feature map 을 추출하고 여기서 2k 개의 classification score 를 출력한다. 

그리고 4k 개의 정교한 bounding box를 만들기 위한 regression output 을 출력한다.

NMS (Non Maximum Suppression)

    1. 동일한 클래스에 대해 높은-낮은 confidence 순서로 정렬한다.
    1. 가장 confidence가 높은 boundingbox와 IOU가 일정 이상인 boundingbox는 동일한 물체를 detect했다고 판단하여 지운다.

image

image

R-CNN Famaily

image


3. Single-stage detector (Region Proposal과 Detection 를 한번에 수행)

One-stage vs tow-stage

image

  • Single-stage detection 은 정확도를 조금 포기하더라도 속도를 확보해 real-time detection 을 가능하도록 설계하는 것에 목적을 둠.

3.1 You only look once (YOLO)

image

  1. input 이미지를 SxS grid로 나눈 후, 각 grid 에 대해서 b 개의 bounding box(4개의 좌표)와 bounding box의 confidence score 를 갖는다. (*confidence score 란 박스가 객체를 보유하고 있다고 생각하는 모델의 신뢰도와 예측하는 박스의 정확도를 반영한다.)

  2. 각 위치마다 Class probability map

image

최종 결과로 NMS 알고리즘을 통해 전개된 bounding box 만을 출력한다. (bounding box 구성 : x, y, w, h, confidence)

image

YOLO 구조

image

YOLO 논문

3.2 Single Shot MultiBox Detector (SSD)

YOLO 는 마지막 layer에서 1번만 prediction 을 하기 때문에 localization 정확도가 떨어지는 결과를 나타냈다. 이를 보완하기 위해 SSD가 나왔다. SSD는 Multi-scale object를 더 잘 처리하기 위해서 중간 feature map을 각 해상도에 적절한 bounding box 들을 출력할 수 있도록 multi-scale 구조를 만들었다.

image

SSD 구조

image

4. Two-stage detector vs. one-stage detector

4.1 Focal Loss

image

single-stage 방법들은 ROI pooling이 없다보니 모든 영역에서의 Loss가 계산이 되고, 일정 gradient 가 발생한다. 따라서 유용하지 않은 영역에서 오는 정보들로 Class imbalance 문제를 가지고 있다.

이러한 Class imbalance 해결하기 위한 방법으로 Focal Loss 가 제안되었다.

image

Focal loss는 분류 에러에 근거한 loss에 가중치를 부여하는데, 샘플이 CNN에 의해 이미 올바르게 분류되었다면 그것에 대한 가중치는 감소한다. 즉, 좀 더 문제가 있는 loss에 더 집중하는 방식으로 불균형한 클래스 문제를 해결했다. Focal loss는 Sigmoid activation을 사용하기 때문에, Binary Cross-Entropy loss라고도 할 수 있다. 특별히, $r$ = 0 일때 Focal loss는 Binary Cross Entropy Loss와 동일하다. (정답에 대한 gradient 보다 오답에 대한 gradient 를 중점으로 두고, 기울기에 대해 생각해볼 것 -> $r$ 이 클때 오답에 대한 Loss 의 기울기가 더 크다.)

4.2 RetinaNet

image

Low level 특징과 high level 특징을 둘다 잘 활용하면서도 각 scale 별로 물체를 잘 찾기 위한 Multi-scale 구조를 갖기 위해 이렇게 생겼음.

5. Detection with Transformer

DETR

image

image

DETR 은 Transformer 를 object detection 에 적용한 사례이다. 기본적인 CNN 의 feature 와 각 위치의 multi-dimension 으로 표현한 encoding을 쌍으로 해서 input token 을 만들어준다. 이렇게 encoding 이 된 후 transformer encoder 를 거치게 되고, 정리된 특징들을 decoder 에 넣어준다. 이후 object queries 를 활용하여 token 이 나타내는 object 가 무엇인지에 대한 질의를 한다. 이후 token 의 위치 정보를 파싱해서 결과값이 출력된다.

DETR 설명 나동빈님 유튜브

image

Semantic segmentaiton

1.1 Semantic segmentation ?

  • Semantic segmentation 이란 image classification 을 영상 단위로 하는게 아니라 pixel 단위로 분류하는 문제(하나의 pixel이 사람에 속하는지, 오토바이에 속하는지 등에 대한 구분하는 문제). 같은 클래스이지만 서로 다른 물체를 구별하지는 않는다.

image

1.2 Where can semantic segmentation be apllied to ?

Application

  • Medical images 나 Autonomous driving 응용 등 영상 내의 장면에 대한 컨텐츠를 이해하는데 다양하게 사용될 수 있다.

image

2.1 Fully Convolution Networks (FCN)

Fully convolutional networks

  • 첫 end-to-end 구조의 semantic segmentation

  • end-to-end 란? 입력부터 출력까지 모두 미분가능한 nueral network 의 형태로 구성되어 입력과 출력데이터의 페어만 있다면 학습을 통해 target task (중간의 nueral network를 학습하여) 를 해결할 수 있다.

image

Fully connected vs. Fully convoltional

  • Fully connected layer : vector 가 주어지면 matrix 가 multiplication 되서 또 다른 fix dimension 이 나오는 구조.

  • Fully convolutional layer : 입력과 출력이 activation map 이고 spatial coordinate(공간 좌표)를 유지한 채, operation이 수행된다. 그리고 1x1 convolution을 활용한다.

image

interpreting fully connected layers as 1x1 convolutions

image

AlexNet에선 Flattening 을 통해 긴 vector 형태로 만들어 주어서 Fully-connected layer 에 input 으로 넣어준다. 이러한 경우 영상의 공간 정보를 고려하지 않고, 하나의 vector 로 섞이게 된다. 어떻게 하면 각 위치마다 classification을 할 수 있도록 할 수 있을까?

image

-> 각 위치 마다 채널 축으로 flatten을 한다. 채널 축의 각각의 값을 vector로 쌓는다. 이렇게 되면 각각에 대해서 입력에 Fully-connected layer를 적용할 수 있게 된다.

image

채널 축으로 1x1 Convolution kernel 이 Fc layer의 한 weight columns 이라고 볼 수 있다. 따라서 filter 갯수만큼 통과시킨다면 우리가 각각의 위치마다 FC layer를 별도로 돌려서 결과값을 채워넣는 것과 동일한 결과를 가질 수 있다.

결론적으로 FC Layer 를 1x1 Convolution 으로 대체할 수 있게 되고, 어떤 입력 사이즈에도 대응이 가능한 그런 Fully-Convolution Neural network 를 만들 수 있게 된다.

이렇게 semantic segmentation 을 통하면 굉장히 작은 score map을 얻게 된다. stride나 pooling layer를 통하면서 최종적으로 굉장히 저해상도인 activation map이 되는데 이러한 저해상도 문제를 해결하기 위해 upsampling이 활용된다.

Upsampling

image

  • Upsampling 의 두가지 방법

    1. Transpose convolution
    2. Upsample and convolution

image

image

transpose convolution를 사용할 때에는 매우 주의해야 할 부분이 convolution kernel size 와 stride 를 잘 조절해서 중첩이 생기지 않도록 신경써서 튜닝을 해줘야 한다. (반복되는 blocky 한 checkboard 구조가 생기지 않도록)

(https://runebook.dev/ko/docs/pytorch/generated/torch.nn.upsample)

Better approaches for upsampling

image

일부분이 Overlap 되는 Transfose 방법과 달리 upsampling은 그러한 중첩 문제가 없고 골고루 영향을 받게 한다.

Adding skip connections for enlaging the score map

image

초반부(낮은 layer)에서는 receptive filed size가 작으므로 굉장히 국지적이고 작은 detail에 민감한 경향이 있고, 후반부(높은 layer)에서는 해상도는 낮아지지만 큰 receptive filed 를 가지며 영상에서 전반적이고 의미론적인 정보들을 많이 포함하는 경향이 있다.

image

Data augmentation


1.1 Learning representation of data set

데이터 셋은 대부분 편향적이다.

image

train data (=camera image) 들은 실제와 다른 image 들을 표현한다.

image

image

편향된 이미지로부터 모델은 Robust하게 학습할 수 없다. (=근본적으로 dataset이 real data를 충분히 표현하지 못했기 때문에)

image

몇몇 데이터들이 주어졌을 때, 이 데이터에 옵션을 추가해서 모델이 더욱 다양성 있게 학습할 수 있도록 해주는 것이 Augmentation 이다.


1.2 Data augmentation

  • dataset 으로 부터의 다양한 이미지 변환을 적용시키기

    • Crop, Shear, Brightness, Perspective, Rotate 등
  • OpenCV나 NumPy 라이브러리에 사용하기 쉽게 잘 구현되어 있다.

목적 : training dataset과 real dataset의 분포를 유사하게 만드는 것!


1.3 Various data augmentation methods

  • Various brightness in dataset

image

def brightness_augmentation(img):
    #numpy array img has RGB value(0~255) for each pixel
    img[:,:,0] = img[:,:,0] + 100 # add 100 to R value
    img[:,:,1] = img[:,:,1] + 100 # add 100 to R value
    img[:,:,2] = img[:,:,2] + 100 # add 100 to R value

    img[:,:,0][img[:,:,0]>255] = 255 # clip R values over 255
    img[:,:,1][img[:,:,1]>255] = 255 # clip G values over 255
    img[:,:,2][img[:,:,2]>255] = 255 # clip B values over 255
  • Rotate, flip

img_rotated = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
img_flipped = cv2.rotate(image, cv2.ROTATE_180)

image

  • Crop
y_start = 500
crop_y_size = 400
x_start = 300
crop_x_size = 800
img_cropped = image[y_start : y_start + crop_y_size, x_start : x_start + crop_x_size, :]

image

  • Affine transformation

    • Preserve 'line', 'length ratio', and 'parallelism' in image
rows, cols, ch = image.shape
pts1 = np.float32([[50,50],[200,50],,[50,200]])
pts2 = np.float32([[100,100],[200,50],,[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
shear_img = cv2.warpAffine(image, M, (cols,rows))

image

image

Modern augmentation techniques

  • Cutmix

    • Mixing both images and labels

image

  • RandAugment

    • 다양한 augmentation 방법이 존재한다. 적용시킬 최적의 augmentation of sequence를 자동으로 찾아준다.

image

어떠한 augmentation 을 사용할 지? 강도(magnitude)는 얼마나 적용시킬 것 인지? 를 parameter로 받는다.


2. Leverageing pre-trained information

2.1 Trainsfer learning

  • 기존의 미리 학습시켜놓은 사전 지식을 활용하여 연관된 새로운 Task 의 적은 노력으로도 더 높은 성능으로 도달이 가능한 방법이다.

  • A Dataset 에서 배운 지식을 B Dataset 에서 활용 가능하다.

image

Approach 1 : pre-trained 된 모델의 마지막 Layer 를 새로운 FC Layer 로 추가하여 학습시키는 방법.

image

Approach 2 : pre-trained 된 모델의 마지막 Layer 를 새롭게 교체하고 전체 model set 에 대하여 learning rate를 다르게 주어 학습하는 방법.

image

2.2 Knowledge distillation

이미 학습된 Teacher Network 지식을 더 작은 모델인 Student Network 에 주입을 시켜 학습한다. (big model -> small model로 지식 전달)

최근엔 Teacher 에서 생성된 output 을 Unlableled 된 데이터에 가짜 label으로 자동 생성하는 매커니즘으로 사용한다. 그렇게해서 가짜 label로 더 큰 student network 를 사용할 때도, regularization 역할로 사용할 수 있다. ( 더 많은 데이터를 사용할 수 있기 때문에)

image

  • Distillation loss 는 teacher model과 유사한 예측 output을 뽑아내기 위한 loss이다.

image

  • Hard label (One-hot vector)

    • Typically obtained from the dataset
    • indicates whether a class is 'true answer' or not
  • soft label

    • Typicall output of the model (=inference result)
    • Regard it as 'knowledge'. Useful to observe how the model thinks

image

  • softmax with temperature(T)
    • Softmax with temperature: controls difference in output between small & larget input values
    • A large T smoothens large input value difference
    • Usefull to synchronize the student and teacher models' outputs

image

  • Distillation Loss

    • KLdiv(Soft label, Soft prediction)
    • Loss = difference between the teacher and student network's inference
    • Learn what teacher network knows by mimicking
  • Student Loss

    • CrossEntropy(Hard label, Soft prediction)
    • Loss = difference between the student network's inference and true label
    • Learn the "right answer"

3. Leveraging unlabeled dataset for training


3.1 Semi-supervised learning

unlabeled data 가 많을 경우.

Semi-supervised learning : Unsupervised(No label) + Fully Supervised(fully labeled)

image

labeled dataset 을 Model에 넣어 Unlabeled dataset 을 Pseudo-labeling 을 실시해 Pseudo-labeled datset으로 만든 뒤 학습에 이용한다.

image

3.2 Self-training

Recap : Data efficient learning methods so far

self-training -> Augmentation + Teacher-Student networks + semi-supervised learning

image

self-training with noisy student

image

image

FaceNet

FaceNet은 각각의 얼굴 이미지를 128차원으로 임베딩하여 유클리드 공간에서 이미지간의 거리(거리가 얼굴 유사도를 나타냄)를 통해 분류하는 모델이다.

image

이 논문에서 Face-Vertication, Recognition, Clustering 세가지의 통합 시스템을 소개한다.

임베딩 공간의 squared L2 Distances(유클리드 거리의 제곱)은 얼굴 유사도와 곧바로 일치한다. 즉 같은 사람의 얼굴은 적은 거리를 가지고 다른 사람일 경우 큰 거리를 가지게 된다.

한번 이 임베딩이 만들어지고 나면 앞서 말한 것들은 쉽게 해결할 수 있다. Face-Verification은 두 임베딩 사이의 거리가 일정 차이를 넘는지, Recognition은 k-NN Classification 문제로, Clustering은 k-means나 agglomerative clustering 같은 것으로 바로 해결이 가능하다.

이전의 deep net 기반 얼굴 인식 접근은 known face identities의 집합으로 학습된 classification layer를 사용하였고 학습에 사용되었던 identities들의 집합을 넘어 얼굴 인식을 일반화하기 위한 방법으로 중간 병목층을 사용했다. 이 접근의 단점은 이 방법의 indirectness과 비효율성이다. 새로운 얼굴에 대해서 병목 representation이 잘 일반화 해주길 바래야 하며, 병목층을 이용하기에 얼굴마다의 representation size가 보통 매우 크기 때문이다. 최근에는 PCA를 이용하여 이런 차원문제를 줄였다.

이러한 접근과는 대조적으로 FaceNet은 LMNN(Large Margin Nearest Neighbor)을 기반으로 triplet loss를 이용하여 128차원 임베딩이 아웃풋이 되도록 곧바로 학습한다. 우리의 triplet은 2개의 일치하는 얼굴과 하나의 다른 얼굴로 이루어져 있으며 loss는 distance margin으로 일치하는 쪽을 불일치하는 쪽으로부터 분리해내는 데 초점을 두고 있습니다. thumbnails는 2D, 3D 정렬이 아니고 얼굴 영역에 맞게 잘려있으며 scale과 translation이 적용 되었다.


Triplet Loss

image

FaceNet은 학습과정에서 Metric Learning을 하기 위해 Triplet Loss를 사용했다. 학습시 미니배치안에서 어떠한 사람(Anchor)에 대해 같은 사람(positive)와 다른사람(negative)를 지정해 놓는다. 그리고 임베딩된 값들의 유클리드 거리를 구해 그림과 같이 Anchor와 Positive의 거리는 가까워지고 Negative와의 거리는 멀어지도록 학습을 스켰고 이러한 과정을 triplet loss로 구현하였다.

image

image

대괄호 안의 첫번째 항이 의미하는 것은 Positive와의 거리이고, 두번째 항은 Negative와의 거리이며 alpha는 마진을 의미한다. 따라서 L을 최소화한다는 의미는 Positive의 거리는 가까워지도록 하고 Negative와의 거리는 멀어지도록 한다는 것이다.

하지만 모데의 성능을 높이기 위해서는 Hard Positive(같은 사람이지만 다르게 보이는 사람)과 Hard Negative(다른 사람이지만 닮은 사람)와 같이 학습을 방해하는 요소를 제어할 필요가 있었고, 이러한 문제를 해결하기 위해 아래와 같은 식을 사용했다.

image


모델 구조

image

모든 실험에서 SGD를 이용한 CNN 활용.


참고자료

https://hwangtoemat.github.io/paper-review/2020-04-02-FaceNet-%EB%82%B4%EC%9A%A9/

https://marades.tistory.com/9

+ Recent posts