no image
[OD] 1-Stage Detector 변천사 | YOLO v1, SSD, RetinaNet 까지
도입지난 2-Stage Detector 모델(2-Stage)에 이어, 이번에는 1-Stage Detector 모델(1-Stage)의 시작과 비교적 초기 모델들의 변천사를 살펴보고자 합니다. 아래 지난 글에서 다룬 것처럼 객체 탐지 모델(OD)은 후보 영역을 찾고(Localization), 후보 영역에 대한 분류(Classification) 두가지 작업이 이뤄져야 합니다. 그리고 2-Stage는 그 두가지 활동을 나눠서 수행하기 때문에 추론을 진행하는 과정에서도 속도가 느리다는 단점이 있습니다. 2024.10.10 - [노트/Computer Vision] - [OD] 2-Stage Detectors 변천사 | R-CNN 부터 Faster R-CNN 까지 [OD] 2-Stage Detectors 변천사 | ..
2024.10.14
no image
[OD] 2-Stage Detectors 변천사 | R-CNN 부터 Faster R-CNN 까지
기본 개념 객체 탐지(Object Detection, OD)는 입력으로 받은 이미지에서 객체의 위치를 찾고(Localization), 그 객체가 무엇인지 분류(Classification)하는 2가지 작업이 이뤄져야 하는 보다 복합적인 작업입니다. 그러다보니, 별도의 데이터 포맷 형태나 측정 지표가 개발되어 사용되고 있습니다. 2024.10.03 - [Python/Data Prep] - [CV] 객체 탐지(Object Detection) 대표 데이터 포맷 공부 | COCO, Pascal VOC, YOLO [CV] 객체 탐지(Object Detection) 대표 데이터 포맷 공부 | COCO, Pascal VOC, YOLO데이터 포맷주어진 이미지와 그에 해당하는 클래스가 대응되는 분류 문제와 다르게 객체 탐..
2024.10.11
no image
[OD] Neck의 기본 개념과 FPN, PANet, BiFPN 까지 정리 | Backbone의 여러 feature map을 합치는 방법
Neck의 개념과 필요성 객체 탐지(object detection) 모델에서 많은 모델의 구조는 컴퓨터 비전 모델을 기반(Backbone)으로 하는 Backbone 구조에서 이미지를 인식하고 여기서 객체를 분류하는 다른 여러 모듈의 조합으로 이뤄집니다. 다양한 크기의 객체를 잘 탐지하고, 특징의 레벨 수준에 따라 갖는 특성이 다르기 때문에 이를 적절히 섞어주는 방법이 필요한데, 이를 Neck이라고 합니다.  즉, 위 이미지처럼 다양한 레별마다 표현되는 특징들을 교환을 통해 객체를 탐지를 돕는 것이 Neck 입니다. Neck에 대한 여러 연구가 이뤄졌지만, 그중에서도 기본적인 개념인 FPN, PANet, 그리고 이들이 약간의 발전이 이뤄진 BiFPN까지 내용을 정리합니다. FPNFeature Pyramid..
2024.10.10
no image
[OD] 객체 탐지(Object Detection) 성능 판단 지표 정리 | IOU, mAP, FPS, FLOPS
IoUIoU (Intersection Over Union)은 모델이 얼마나 객체 탐지를 정확하게 했는지, 즉 모델이 찾은 객체의 위치가 실제 데이터셋의 ground truth와 겹치는지를 확인하는 지표 입니다. 영문 명칭에서 확인할 수 있는 것처럼 겹치는 부분(Intersection)을 전체 면적(Union)으로 나눈 값으로 계산할 수 있습니다.   IoU xx (예를 들어, IoU 50)와 같은 표현은 IoU 값을 xx(%)를 기준으로 하는 것이며, xx라는 임계값에 따라 제대로 예측했는지 결정됩니다. 이는 뒤에 다룰 mAP에서 까지 확장되는데, mAP 50은 IoU 임계값을 50으로 객체를 탐지하여 성능을 측정합니다. mAPmAP은 객체 탐지 문제에 흔히 사용되는 성능 지표로 mean average ..
2024.10.02
no image
[CV] 이미지 분류 문제에 대한 분류 | Binary vs Multi-, Coarse vs Fine-grained, N-shot learning 까지
1. 문제 정의이미지 분류 문제는 주어진 이미지 데이터에 대해 사전에 정의된 클래스(혹은 '레이블')로 할당하는 문제입니다. 이미지가 가지고 있는 다양한 의미(색, 형태 등)를 해석해 클래스로 할당하여 문제를 해결합니다. 분류 문제의 특징 중 하나는 다양한 형태로 존재하는 이미지도 하나의 클래스로 분류해야 할 필요가 있습니다.   2. 문제 종류분류 문제는 레이블 유형에 따라, 분류 대상의 특성에 따라 구분할 수 있습니다. 2.1. 레이블 유형에 따라레이블은 쉽게 표현하면, 분류 문제에서 정답에 해당되는 것으로 해당 이미지가 어떤 유형에 속하는지를 의미합니다. 레이블의 유형에 따라 둘 중 하나(예를 들어, 사람 vs 사람 x)를 구분하는 이진 분류(Binary Classification), 여러 개의 클..
2024.09.20
no image
[CV] 3D 렌더링 기술 간단히 살펴보기 | NeRF와 3DGS를 중심으로
NeRFNeural Radiance Fields(NeRF)는 3D 대상이나 장면을 신경망을 통해 학습하여 표현하는 방법입니다. 공간적 위치를 표현하는 (x, y, z)와 방향을 표현하는 (∅,ϴ)를 조합하여 5차원의 좌표계를 입력으로 하여 색(R, G, B)과 밀도(σ, 얼마나 투명한지)를 통해 나타냅니다. 학습 방법NeRF는 3D 공간에 있는 광선의 밀도와 색상을 누적 합산을 통해 Volume Rendering(이하'볼륨 렌더링')을 수행합니다. 볼륨 렌더링은 신경망을 활용해 특정 시점의 2D 이미지 데이터를 입력 받아 3D 구조를 생성합니다. 방법은 간단하게 살펴보면 다음과 같습니다. 1) 다양한 각도에서 찍은 2D 이미지를 입력 데이터로 받아 여러 점들을 샘플링 합니다.2) 각 지점에서 색상과 투명..
2024.09.08
no image
[CV] 생성형 모델(Generative models) | VAE부터 Diffusion, Stable Diffusion까지
VAEVariational Autoenconder(VAE)는 데이터의 잠재 표현(latent representation)을 확률적으로 인코딩하고, 이를 통해 원본을 재구성하거나 새로운 데이터를 생성하는 모델을 말합니다. VAE 구조VAE는 크게 인코더 - 잠재 공간 - 디코더로 구분된 구조를 가지고 있습니다.인코더(Encoder)- 입력 데이터 x를 받아서 잠재 변수 z의 확률 분포 매개변수(평균, 분산)을 출력합니다.- 인코더는 신경망을 통해 구현합니다.잠재 공간(Latent Space)- 가우시안 분포를 따르는 잠재 변수 z를 샘플링합니다.- 샘플링할 때 reparametrization을 사용합니다. 디코더(Decoder) - 샘플링된 잠재 변수 z를 받아서 원본 데이터 공간의 재구성 x'을 출력합니..
2024.09.07
반응형

도입

지난 2-Stage Detector 모델(2-Stage)에 이어, 이번에는 1-Stage Detector 모델(1-Stage)의 시작과 비교적 초기 모델들의 변천사를 살펴보고자 합니다. 아래 지난 글에서 다룬 것처럼 객체 탐지 모델(OD)은 후보 영역을 찾고(Localization), 후보 영역에 대한 분류(Classification) 두가지 작업이 이뤄져야 합니다. 그리고 2-Stage는 그 두가지 활동을 나눠서 수행하기 때문에 추론을 진행하는 과정에서도 속도가 느리다는 단점이 있습니다.

 

2024.10.10 - [노트/Computer Vision] - [OD] 2-Stage Detectors 변천사 | R-CNN 부터 Faster R-CNN 까지

 

[OD] 2-Stage Detectors 변천사 | R-CNN 부터 Faster R-CNN 까지

기본 개념 객체 탐지(Object Detection, OD)는 입력으로 받은 이미지에서 객체의 위치를 찾고(Localization), 그 객체가 무엇인지 분류(Classification)하는 2가지 작업이 이뤄져야 하는 보다 복합적인 작업입

seanpark11.tistory.com

 

이러한 문제의식에서 출발한 1-Stage는 이 두가지 활동을 합쳐서 수행하기 때문에 속도 측면에서 강점을 보입니다. 이는 영역을 별도로 추출하지 않고, CNN Backbone 모델에서 추출한 피쳐 맵에서 바로 객체를 검출하기 때문입니다. 즉, 1-Stage는  Faster R-CNN의 RPN 처럼 Region Proposal의 과정이 없습니다. 

1-Stage 모델 초기 변천사

YOLO v1

YOLO라는 모델은 You Only Look Once의 줄임말로 한번만 보면 된다는 모델의 철학을 담고 있습니다. 하나의 이미지에서 인식한다는 개념은 여러 아이디어의 조합으로 완성되었는데, 우선 YOLO v1 모델이 어떻게 이미지에서 객체를 인식하는지 과정을 살펴보면 다음과 같습니다. [2] 

 

1) 입력 이미지를 S x S의 그리드로 분할 

2) 각 그리드 셀에서 바운딩 박스와 점수(confidence score), 클래스 확률 계산 

    - 점수는 바운딩 박스에 객체가 없는 경우 0, 객체가 있는 경우 IoU로 정의합니다.

    - 바운딩 박스에는 그리드 셀 기준 상대적인 박스 정보(x, y, w, h)와 점수를 포함해 5개 정보를 포함합니다.

    - 클래스 확률은 박스에 객체가 있을 경우 해당 클래스일 확률이며, 이 확률은 클래스마다 존재합니다. 

    - 하나의 그리드 셀에는 (박스 개수 x 5 + 클래스 수)의 정보를 예측

3) 2) 과정을 모든 그리드 셀마다 수행

    - 총 S x S 개의 그리드에 대해 2)를 수행 

DarkNet

YOLO v1에서는 다른 CNN 구조를 쓴 것이 아니라, DarkNet이라는 별도의 네트워크를 제안합니다. 논문에 따르면, GoogLeNet 모델에서 영감을 받아 설계했다고 합니다. 24개의 conv 층, 2개의 fully-connected 층으로 연결하고, GoogLeNet의 inception 모듈 대신에 1x1 reduction 층을 사용합니다. 또한, OD는 fine-grained 문제이기 때문에 이를 효과적으로 수행하기 위해 2배 해상도로 높여 진행한다고 설명하고 있습니다. 

 

DarkNet 구조 [3]

 

입력 이미지는 DarkNet을 통해 위 객체 예측 결과 텐서를 반환합니다. 그리고 아래에 다뤄질 손실함수를 이용해 훈련을 진행합니다. 

손실함수

손실함수 역시 YOLO의 철학을 반영하듯이 여러가지 손실함수를 합한 형태로 구성된 것으로 보입니다. 아래 이미지의 첫 두 항은 Localization(중심점 손실 + w & h 손실), 중간의 두 항은 Confidence score (객체가 있는 경우 + 객체가 없는 경우), 마지막은 분류 문제에 대한 손실입니다.

YOLO 손실함수 [3]

SSD

YOLO v1는 한번에 두가지 작업을 수행한다는 점에서 짧은 추론시간과 이미지 전체에서 객체 탐지가 이뤄지기에 학습되지 않은 데이터셋에서도 강점을 보이긴 했지만, 그리드 영역 단위로 수행했기 때문에 그보다 작은 객체에 대해 성능이 떨어지고 신경망의 마지막 피쳐 맵만 사용하기에 제한된 성능을 보였습니다.

 

Single Shot multibox Detector(SSD)는 이러한 단점들을 보완하기 위해 모든 피쳐 맵에 대해 OD를 수행합니다. 

 

SSD와 YOLO v1 비교 [4]

Multi-scale feature maps

SSD는 VGG16을 backbone으로 추가 conv 층을 갖고 있는 구조로 이러한 추가 층을 통해 추가적인 피쳐 맵에 대해서 예측을 진행할 수 있게 됩니다. 총 6개의 서로 다른 스케일의 피쳐 맵(각각 conv4_3, conv7, conv8_2, conv9_2, conv10_2, conv11_2에서 추출)을 가져와서 객체 탐지에 사용합니다. 큰 피쳐 맵은 작은 물체를 탐지할 수 있고, 작은 피쳐 맵은 큰 물체 탐지에 사용할 수 있습니다. 즉, 다양한 피쳐 맵을 사용하여 다양한 크기의 객체를 탐지할 수 있게 됩니다. 추가적으로 fully-connected 층 대신에 conv 층을 사용하고, 연산 속도가 빨라지는 효과도 가져오게 됩니다. 

Default box

또한, Faster R-CNN에서 사용된 anchor box와 같은 default box를 이용합니다. 서로 다른 스케일과 가로세로비를 가진 박스를 사용했다는 점에서 anchor box와 유사하지만, SSD에서는 앞서 언급한 Multi-scale feature maps에 적용합니다. default box의 스케일은 아래 공식에 따라 결정되며, 가로세로비율은 {3,2,1, 1/2, 1/3}에 따라 곱한 값으로 결정됩니다.  

 

 

default box에서는 박스의 위치(offset)와 각 클래스에 대한 신뢰도를 예측합니다. 위치는 이전의 다른 모델과 동일하게 (x, y, w, h)로 default box마다 예측을 수행하게 되고, 클래스 + 1(배경) 까지 신뢰도 점수를 계산합니다. 

 

SSD Framework [4]

 

학습에서는 default box와 ground truth 사이에 IoU가 0.5 이상이면 positive, 아니면 negative로 구분합니다. 다만, 일반적으로 negative sample이 많기 때문에 높은 confidence loss를 갖는 샘플을 추가하는 hard negative mining을 통해 해결합니다. [5]

 

 

손실함수

손실함수는 Localization loss와 Confidence loss의 합으로 계산합니다. Localization은 smooth L1, Confidence는 Softmax로 계산합니다. 

 

RetinaNet

RetinaNet은 하나의 backbone 네트워크와 두가지 서브 네트워크로 구성되어 있습니다. backbone에서는 입력 이미지의 피쳐 맵을 계산하고, 첫번째 서브 네트워크는 backbone에서 나온 아웃풋에 대해 객체 분류를 수행 / 두번째 서브 네트워크는 bbox regressor로 동작합니다. [6] 

 

앞서 SSD에서도 간단하게 언급했지만, 배경으로 분류되는 negative 샘플이 너무 많기 때문에 hard negative mining과 같은 방법이 사용되고 있었습니다. RetinaNet은 Focal loss라는 새로운 개념을 제시하여 이러한 클래스 불균형 문제를 해결하고자 했습니다. 2-stage에서는 region proposal 과정에서 후보 위치를 빠르게 작은 숫자로 줄여주지만, 1-stage에서는 하나의 이미지에서 연산을 수행하면서 훨씬 많은 연산을 필요로 했습니다. 논문의 저자들은 맞는 클래스의 숫자가 증가함에 따라 손실이 급격하게 감소할 수 있도록 설계한 Focal loss를 제안했습니다.  

Focal Loss

Focal loss는 논문의 제목처럼 RetinaNet에서 사용되는 핵심적인 아이디어입니다. 이진 분류 문제에서 사용했던 손실함수를 우선적으로 활용합니다. (아래 식 참고) 

 

크로스 엔트로피 손실함수 [7]

 

보통의 크로스 엔트로피 손실함수는 모든 예측 결과를 동등하게 예측하기 때문에 앞서 이야기한 것처럼 클래스 불균형이 발생하게 되면 학습이 제대로 이뤄지지 않을 우려가 있습니다. 이를 해결하기 위해 등장한 것이 가중치를 곱한 Balanced Cross Entropy가 있습니다. Focal Loss는 여기서 더 나아가, 쉬운 예시에는 작은 가중치 / 어려운 예시에는 큰 가중치를 곱할 수 있도록 파라미터를 추가하였습니다.

 

Focal Loss [7]

훈련

RetinaNet에서 훈련은 다음과 같은 과정으로 이뤄지게 됩니다.

 

1) 입력 이미지를 backbone에 입력해 피처 맵을 추출

2) 추출된 피처 맵을 서로 다른 스케일을 가진 피처 피라미드 추출 (논문에서는 ResNet + FPN 활용)

3) 피라미드 레별별 피처 맵을 서브 네트워크에 입력

    - Classification 서브 네트워크에서는 분류 수행 (클래스 수 * 앵커 박스 수 만큼의 채널)

    - bbox regression 서브 네트워크에서는 위치 조정 (x/y/w/h 4 * 앵커 박스 수만큼의 채널)

 

RetinaNet 구조 [7]

 

참고자료

[1] 송원호. "5) 1 stage Detectors". 부스트캠프 ai tech.  

[2] https://herbwood.tistory.com/13

[3] Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi. "You Only Look Once : Unified, Real-Time Object Detection"

[4] Wei Liu et al. "SSD: Single Shot MultiBox Detector"

[5] https://herbwood.tistory.com/15

[6] https://paperswithcode.com/method/retinanet

[7] Tsung-Yi Lin, Priya Goyal, Ross Girshick, Kaiming He, Piotr Dollar. "Focal Loss for Dense Object Detection" 

반응형
반응형

기본 개념 

객체 탐지(Object Detection, OD) 입력으로 받은 이미지에서 객체의 위치를 찾고(Localization), 객체가 무엇인지 분류(Classification)하는 2가지 작업이 이뤄져야 하는 보다 복합적인 작업입니다. 그러다보니, 별도의 데이터 포맷 형태나 측정 지표가 개발되어 사용되고 있습니다.

 

2024.10.03 - [Python/Data Prep] - [CV] 객체 탐지(Object Detection) 대표 데이터 포맷 공부 | COCO, Pascal VOC, YOLO

 

[CV] 객체 탐지(Object Detection) 대표 데이터 포맷 공부 | COCO, Pascal VOC, YOLO

데이터 포맷주어진 이미지와 그에 해당하는 클래스가 대응되는 분류 문제와 다르게 객체 탐지 문제는 객체를 찾고(Localization), 이를 분류(Classification)해야 하는 두가지 일이 존재하기 때문에 데

seanpark11.tistory.com

 

2024.10.02 - [노트/Computer Vision] - [CV] 객체 탐지(Object Detection) 성능 판단 지표 정리 | IOU, mAP, FPS, FLOPS

 

[CV] 객체 탐지(Object Detection) 성능 판단 지표 정리 | IOU, mAP, FPS, FLOPS

IoUIoU (Intersection Over Union)은 모델이 얼마나 객체 탐지를 정확하게 했는지, 즉 모델이 찾은 객체의 위치가 실제 데이터셋의 ground truth와 겹치는지를 확인하는 지표 입니다. 영문 명칭에서 확인할

seanpark11.tistory.com

 

두가지 주요한 작업(Localization, Classification)이 있다보니, 이를 2가지로 나눠 처리하는 모델을 2-Stage Detector라고 합니다. 대표적인 모델은 R- CNN 이름이 붙은 모델들이 해당합니다. 여기서 2가지 단계는 Region Proposal, Classification으로 구분할 수 있습니다.  

OD 모델의 구조 [1]

Region Proposal 

먼저 이미지에서 객체가 있을 가능성이 높은 영역을 찾아냅니다. 후보 영역을 제안(생성)한다는 명칭으로 전체 이미지에서 객체가 있을 법한 영역을 예측하는 것 입니다. Region Proposal 방법은 각 모델마다 제시될 정도로 다양하며, 이전 모델에서 갖고 있던 한계나 문제점을 개선하는 방식으로 진화해왔습니다. 

Classification 

다음으로 첫 번째 단계에서 추출한 영역들을 정교하게 분류하여 객체의 클래스를 추론합니다. 때로는 Region Proposal과 경계에 있는 과정으로 박스의 위치를 조정하는 과정을 거치기도 합니다. 앞으로 살펴볼 2-Stage Detector 모델들의 변천사를 살펴볼 때 앞서 이야기한 2가지를 중점적으로 살펴볼 예정입니다. 


2-Stage Detector 변천사

R-CNN

Regions with CNN features(R-CNN)이란 이름에서 알 수 있는 것처럼 OD 분야에서 최초로 CNN을 적용시킨 모델이 R-CNN 입니다. R-CNN에서 사용한 방법은 다음과 같습니다. 

 

1. 입력 이미지에서 Selective Search를 통해 약 2000개의 영역(Region of Interest, RoI)를 추출합니다.

2. RoI의 크기를 분류에 사용할 크기로 변형합니다. (warped region)

3. 각 2000개의 RoI를 CNN에 통과해 특징을 추출합니다.

4. 추출된 특징을 SVM에 넣어서 분류를 진행합니다. 여기서 분류는 전체 클래스 C개 + 배경 여부를 포함한 C+1개에 대해 분류를 진행했습니다. 

5. Selective Search 결과로 나온 RoI의 Bounding Box(bbox)에 대해 선형회귀를 통해 bbox 위치를 조정하는 과정을 거칩니다. 

 

만약 Selective Search에 대한 보다 깊은 이해를 원하신다면, 아래 파일을 참고해보시기 바랍니다. 

Schuyler Smith_Selective Search for Object Recogntion.pdf
12.95MB

SPPNet

R-CNN은 CNN의 입력 이미지가 고정되어 있다보니 그 크기를 맞춰주는 과정이 필요했고, 모든 RoI (약 2,000개)에 대해 CNN을 통과해야 해서 시간이 다소 소요되는 단점이 있습니다. Spatial Pyramid Pooling Network (SPPNet)은 기존에 있던 이미지를 조정(Crop/Warp)하는 과정 대신에 Spatial Pyramid Pooling을 도입하면서 이러한 문제를 해결하고자 등장했습니다.

 

SPP 구조 [2]

 

Spatial Pyramid Pooling은 CNN을 통과해서 나온 특징 맵들을 영역만 나눠서 고정된 길이의 표현을 동일하게 전달하는 방식입니다. 해당 개념이 제안된 논문에서는 4x4, 2x2, 1x1의 세 영역을 max pooling으로 받는다고 설명합니다. Region Proposal에서 이러한 방식을 도입하 항상 동일한 크기의 입력을 받을 수 있고, 여러 RoI를 통과해야 하는 불편함을 제거할 수 있게 됐습니다.

 

Spatial Pyramid Pooling 개념 [2]

Fast R-CNN

이름에 나와있는 것처럼 R-CNN의 속도에 대한 문제를 해결하기 위해 등장한 것이 Fast R-CNN 모델입니다. 기존 R-CNN 모델은 Region Proposal 과정에서 여러 가지 요소들 때문에 굉장히 많은 시간이 소요됩니다. 하지만, Fast R-CNN에서는 이러한 속도 저하 현상을 해결할 수 있는 여러 아이디어를 제안하여 문제를 해결하였습니다.

 

먼저 Fast R-CNN의 전반적인 과정을 살펴보면 다음과 같습니다. ([3], [4])

 

1. 이미지를 CNN을 통과시켜 특징 맵을 추출합니다. (여기서 CNN에 사용되는 모델은 backbone이라고 불립니다.)

2. 이미지에서 Selective Search를 통해 RoI를 추출합니다. 여기서 이미지를 추출하는 것이 아니라, (x,y,h,w)와 같이 정의된 튜플을 추출합니다. 

3. 1에서 추출한 특징 맵에 줄어든 비율만큼 튜플을 변경시키는 과정을 수행합니다. (이를 RoI Projection라 합니다.)

4. 특징 맵과 변경된 튜플을 RoI Pooling을 통과해 고정된 사이즈의 벡터를 얻습니다.

5. 이렇게 얻은 고정된 벡터를 Fully-Connected layer(FC)에 통과시켜 하나는 분류를 수행하고, 나머지 하나는 bbox의 위치를 조정하는 bbox regressor에 전달합니다. 

 

Fast R-CNN의 전반 구조 [5]

 

이전에 없던 새로운 개념들이 추가되었는데, 이에 대해 아래에서 세부적으로 살펴보고 위에 흐름을 다시 살펴보면 이해에 도움이 될 것 입니다. 

RoI Pooling

RoI Pooling은 특징 맵에서 RoI를 일정한 크기의 영역으로 나눈 후 max pooling을 수행하는 방법입니다. 이 방법은 앞서 SPP에서 유사한데, 논문에서도 SPP의 단일 층에 대해서  수행하는 특수 케이스로 설명하고 있습니다. 

훈련 (Multi-task loss)

Fast R-CNN 모델에서는 RoI Pooling 후 FC를 통과한 값을 Softmax classifier와 bbox regressor로 전달합니다. (여기서 클래스의 개수는 배경을 포함한 C+1 개) 각각의 작업의 손실함수는 분류에 대해서는 크로스 엔트로피를 사용하고 있으며, bbox에 대해서는 Smooth L1 loss를 사용합니다. 

 

Smooth L1 loss [5]

 

한편, 두가지 작업을 수행하기 위한 새로운 손실로 Multi-task loss를 제안하는데, 이는 분류와 bbox 회귀의 값을 합한 형태로 구성됩니다. 

 

Multi-task loss [5]

Hierachical sampling

Fast R-CNN에서는 N개의 이미지, R개의 region proposal을 한다고 할 때 이미지에서 R/N개의 region proposal을 샘플링합니다. 이렇게 하여 한 배치 안의 같은 이미지에서 추출된 RoI들에 대해서는 forward, backward 연산에서 메모리를 공유할 수 있도록 해서 효율성을 높입니다.

 

이외에도 Truncated SVD 등 연산 효율성을 높이려는 시도를 통해 속도를 개선하였습니다.

Faster R-CNN

Fast R-CNN에서 여러 시도를 통해 속도 측면에서 개선을 이뤘지만, 여전히 CPU에서 동작하는 Selective Search [6]를 사용하기 때문에 시간의 제약은 존재하고 있습니다. Faster R-CNN은 더 빨라진 R-CNN을 말하는 것처럼, 다른 방식(RPN)을 사용하여 연산의 방식을 개선하였습니다. 

Region Proposal Network (RPN)

기존 Fast R-CNN에서는 Selective Search를 통해 RoI Projection을 하는 방식으로 region proposal을 진행했습니다.  Faster R-CNN에서는 서로 다른 크기(scale)와 가로-세로비율(aspect ratio)을 적용한 사전에 만들어진 anchor box라는 개념을 제시합니다. 크기 [128, 256, 512] / 비율 [1:1, 1:2, 2:1] 3가지씩을 제시해 총 9 개의 서로 다른 anchor box를 사전에 정의합니다. 이로써 더 다양한 크기의 객체를 탐지할 수 있게 됩니다. 

 

RPN은 CNN backbone에서 만들어진 특징 맵을 입력으로 받아 정의된 anchor box를 생성합니다. 그리고 그것들을 3x3 conv을 통과시켜 intermediate layer를 생성하고, 1x1 conv를 통과시켜 binary classification(객체인지 아닌지)과 bbox regression(x, y, w, h)을 수행할 수 있게 전달합니다. 이 일련의 과정을 통해 이미지의 region proposal을 수행합니다. 

 

RPN 구조 [6]

Non Maximum Suppression (NMS)

하지만, 여러 proposal이 만들어지는만큼 겹치는 것도 발생하게 되는데 이를 제거하기 위해 NMS라는 방법을 사용합니다. NMS는 IoU를 기준으로 일정 기준 이상인 proposal에 대해서는 중복된 영역으로 간주하고 제거하는 방식으로 동작합니다. (아래처럼 요약할 수 있습니다.[7])

 

1) 특정 클래스의 Score(혹은 confidence) 중 가장 높은 proposal을 선택 및 최종 제안에 추가

2) 해당 클래스에 대한 Score가 높은 proposal과 IoU 값이 일정 기준 이상이면, 동일한 물체라고 간주하고 제거 

3) 나머지 제안 중 Confidence가 높은 proposal로 바꿔 1~2 과정 반복

Faster R-CNN 전체 과정

Faster R-CNN은 Fast R-CNN과 큰 차이는 없지만, region proposal을 RPN으로 대체합니다. 전체 과정은 아래와 같이 요약될 수 있습니다. [8]

 

1. 원본 이미지에 대해서 anchor box를 생성합니다. 

2.  CNN backbone에서 특징 맵을 추출합니다.

3. 추출한 특징 맵을 3x3, 1x1 conv를 통과시켜 class layer, bbox regressor에 전달합니다.

4. 1에서 만든 anchor box와 RPN에서 학습한 class score, bbox regressor를 통해 region proposal을 수행합니다. NMS로 불필요한 proposal은 제거하고 class score 상위 anchor box를 추출합니다. 그리고 regressor로 anchor box를 조정합니다.

5. RPN이 학습하는데 사용할 수 있는 anchor를 1) ground truth와 가장 큰 IoU를 갖는 경우 2) ground truth와 IoU가 0.7을 넘는 것으로 선택합니다. 

6. region proposal과 ground truth와 IoU가 0.5를 기준으로 이상이면 positive / 그 외에는 negative로 레이블링한 샘플을 선택합니다.

7. 추출했던 특징 맵과 6을 통해 얻은 샘플에 대해 RoI Pooling을 수행합니다. (Fast R-CNN 참고)

8. 이렇게 얻은 고정된 벡터를 Fully-Connected layer(FC)에 통과시켜 하나는 분류를 수행하고, 나머지 하나는 bbox의 위치를 조정하는 bbox regressor에 전달하고 결과 값에서 Multi-task loss를 계산해 Fast R-CNN 모델을 학습합니다. 여기서 RPN과 Fast R-CNN 학습을 위해 아래와 같은 4단계를 반복합니다.

참고자료

[1] Alexey Bochkovskiy, Chien Yao Wang, Hong Yuan Mark Liao. YOLOv4: Optimal Speed and Accuracy of Object Detection

[2] Kaming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. "Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition"

[3] https://blog.naver.com/siniphia/221538276677

[4] https://herbwood.tistory.com/8

[5] Ross Girshick. "Fast R-CNN" 

[6] Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun. "Faster R-CNN : Towards Real-Time Object Detection with Region Proposal Networks"

[7] https://ctkim.tistory.com/entry/Non-maximum-Suppression-NMS

[8] https://herbwood.tistory.com/10

 

 

 

 

반응형
반응형

Neck의 개념과 필요성

객체 탐지 모델 전반[1]

 

객체 탐지(object detection) 모델에서 많은 모델의 구조는 컴퓨터 비전 모델을 기반(Backbone)으로 하는 Backbone 구조에서 이미지를 인식하고 여기서 객체를 분류하는 다른 여러 모듈의 조합으로 이뤄집니다. 다양한 크기의 객체를 잘 탐지하고, 특징의 레벨 수준에 따라 갖는 특성이 다르기 때문에 이를 적절히 섞어주는 방법이 필요한데, 이를 Neck이라고 합니다.

 

특징의 레벨별 차이 [2]

 

즉, 위 이미지처럼 다양한 레별마다 표현되는 특징들을 교환을 통해 객체를 탐지를 돕는 것이 Neck 입니다. Neck에 대한 여러 연구가 이뤄졌지만, 그중에서도 기본적인 개념인 FPN, PANet, 그리고 이들이 약간의 발전이 이뤄진 BiFPN까지 내용을 정리합니다. 

FPN

Feature Pyramid Network(FPN)은 Backbone에서 추출된 특징 맵들을 High level 특징 맵부터 Top-down 방식으로 섞어가는 방식입니다. 우선, 각 특징 맵들을 1x1 conv을 통과시킵니다. 그리고 윗층에서는 업샘플링(nearest neighbors 방식)을 한 값을 (1x1 conv를 통과한) 그 아래층의 값에 원소간 합을 취합니다. 이런 방식을 Lateral connection이라고 하며, 이 구조를 FPN이라 합니다. (아래 그림 참고)

 

FPN의 구조 [3]

PANet

PANet(Path Aggregation Network)는 FPN의 구조적 약점을 보완하기 위해 등장했습니다. FPN은 Top-down 방식을 통해 고수준부터 저수준까지 특징 맵들을 더해주는 방식을 취하고 있으나, 이러한 방식은 저수준(이미지에 가까운) 특징 맵이 고수준 특징 맵과 정보를 교환할 수 없습니다. 이러한 약점은 PANet에서 반대 방향, 즉 Bottom-up 방식을 추가하여 보완됩니다. 전체 구조는 아래와 같습니다. 

 

PANet 구조 [4]

 

PANet에서 연산은 위 이미지에서 (a)까지는 FPN과 동일하게 수행합니다. 그리고 (b)처럼 Bottom-up 방식으로 쌓아가는데, Ni는 Pi에 대응해 다운 샘플링을 통해 생성된 값입니다. Ni를 3x3 conv (stride=2)를 통과해 나온 값과 Pi+1을 더해서 새롭게 Ni+1을 생성하는 방식으로 Bottom-up을 추가해갑니다. (아래 이미지 참고)

Bottom up augmentation 설명 [4]

Bi-FPN

Bi-FPN의 원래 이름은 weighted bi-directional feature pyrmaid network로 이름에서 알 수 있듯이 단순하게 양방향 FPN이 아니라 가중치에 대한 내용이 추가되어야 합니다. Bi-FPN은 크게 두가지로 나눠서 설명할 수 있습니다. 우선, 구조적인 측면에서 FPN에서 있었던 하나의 input edge를 갖던 노드를 제거하고, 같은 레벨에서 input으로부터 output으로 연결하는 edge를 추가(cross-scale connection)합니다. 

 

BiFPN의 구조[5]

 

그리고 가중치를 부여하기 위해 특징 맵마다 다른 기여도를 가질 수 있도록 단순합이 아닌 가중합 방식으로 구성합니다. 아래 식 예시로 주어진 td는 중간(top-down 방식)값이고, out은 bottom-up 으로 올라가는 노드를 가리킵니다. 

 

가중합 방식 [5]

 

이것 외에도 어떻게 하면 특징 맵을 잘 전달할 수 있을지 구조/연산 등에 대한 다양한 연구가 이뤄졌습니다. Neck에 대한 추가적인 개선이 필요하다면, DetectoRS/NASFPN/AugFPN 등 다른 내용들을 찾아본다면 도움이 될 것입니다. 

참고자료

[1] Alexey Bochkovskiy, Chien Yao Wang, Hong Yuan Mark Liao. “YOLOv4: Optimal Speed and Accuracy of Object Detection”

[2] https://medium.com/analytics-vidhya/the-world-through-the-eyes-of-cnn-5a52c034dbeb

[3] https://jonathan-hui.medium.com/understanding-feature-pyramid-networks-for-object-detection-fpn-45b227b9106c 

[4] Shu Liu, Lu Qi Haifang Qin Jianping Shi Jiaya Jia. "Path Aggregation Network for Instance Segmentation"

[5] Mingxing Tan, Ruoming Pang, Quoc V. Le. "EfficientDet : Scalable and Efficient Object Detection"

 

반응형
반응형

IoU

IoU (Intersection Over Union)은 모델이 얼마나 객체 탐지를 정확하게 했는지, 즉 모델이 찾은 객체의 위치가 실제 데이터셋의 ground truth와 겹치는지를 확인하는 지표 입니다. 영문 명칭에서 확인할 수 있는 것처럼 겹치는 부분(Intersection)을 전체 면적(Union)으로 나눈 값으로 계산할 수 있습니다. 

 

IOU 계산[1]

 

IoU xx (예를 들어, IoU 50)와 같은 표현은 IoU 값을 xx(%)를 기준으로 하는 것이며, xx라는 임계값에 따라 제대로 예측했는지 결정됩니다. 이는 뒤에 다룰 mAP에서 까지 확장되는데, mAP 50은 IoU 임계값을 50으로 객체를 탐지하여 성능을 측정합니다. 

mAP

mAP은 객체 탐지 문제에 흔히 사용되는 성능 지표로 mean average precision의 줄임말 입니다. mAP의 의미에 대해 결론부터 얘기하자면, 각 클래스의 AP(average precision)의 평균을 의미합니다. 한 클래스에 여러 데이터가 있으니 average를 계산하고, 여러 클래스가 존재하니 이에 대한 평균을 계산한다는 의미일텐데, mAP에 대해 이해하기 위해서는 정밀도(precision)을 알아야 합니다. 

precision

정밀도는 True라고 예측한 것 중 실제 True인 것의 비율을 말합니다. 한글 명칭인 정밀도의 의미(동일한 조건에서 여러 번 반복 측정할 경우 측정값이 얼마나 가깝게 나오는지)를 생각해볼 때 예측한 것들 중 얼마나 맞추느냐로 이해할 수 있습니다. 함께 나오는 개념으로 재현율(recall)이 있는데, 이는 정답 중 얼마나 잘 맞추느냐로 이해할 수 있습니다. 

Precision과 Recall 식 [2]

PR Curve와 AP

precision과 recall은 서로 관련이 있다보니, 함께 그래프를 나타내는 경우가 많은데 이를 PR Curve라고 합니다. 아래의 좌측 그래프 처럼 PR Curve는 recall이 증가함에 따라 precision은 (정확히 반비례하지는 않지만) 떨어지는 것처럼 그림이 그려지게 되는데 이를 값이 일정한 함수로 바꿔서 아래 면적을 계산하면 AP(average precision)이라고 합니다.

PR Curve와 AP 계산[2]

 

이렇게 나온 AP는 하나의 클래스에 대한 값이고, 데이터셋마다 개별의 클래스가 있기 때문에 이를 평균해서 구한 값이 mAP입니다. 

mAP 계산[2]

속도 지표 

객체 탐지는 그 활용(자율주행, CCTV 등) 특성에 따라 속도가 중요한 경우가 많습니다. 따라서, 속도에 대한 지표도 측정이 필요한데, 대표적으로 FPS와 FLOPS가 있습니다. 

FPS

FPS는 Frames Per Second의 약자로 초당 프레임수를 이야기합니다. 게임에서도 많이 언급되는 개념인데, 1초라는 단위 시간 동안 얼마나 많은 이미지들이 있는지를 의미합니다. FPS가 높을수록 1초 안에 더 많은 이미지가 있고, 이는 더욱 자연스러운 모션을 구현할 수 있게 됩니다. 객체 탐지에서 FPS는 초당 처리할 수 있는 이미지 수를 의미하게 됩니다. 객체 탐지에서 FPS 측정하는 방법은 다음과 같이 정의할 수 있습니다. [3]

FPS  = 처리한 프레임(이미지) 수 / 처리 시간 

 

위 정의를 바탕으로 아래와 같이 코드를 만드는 것이 가능합니다.

 

import time

num_frames = len(input_images)
start_time = time.time()

# 객체 탐지 수행 코드 (예시)
for i in range(num_frames):
    model.detect_objects(input_images[i])

end_time = time.time()
processing_time = end_time - start_time
fps = num_frames / processing_time

FLOPS

 

FLOPS는 Floating Point Operations의 약자로 모델이 얼마나 빠르게 동작하는지 측정하는 지표입니다. 곱하기, 더하기, 빼기와 같은 연산량의 횟수로 계산이 가능합니다. 주요 연산들의 FLOPS를 대략적으 계산하는 방법은 다음과 같습니다.[4]

  • Convolution layer : 입력 채널 x 출력 채널 x 커널 높이 x 커널 너비 x 출력 특징맵 높이 x 출력 특징맵 너비
  • Fully Connected layer : 2 x 입력 수 x 출력 수 

이러한 연산들이 여러 개가 중첩되는 경우 전체의 합을 통해 해당 모델의 FLOPS를 계산할 수 있습니다. 하지만, torch 계열의 fvcore의 FlopCountAnalysis를 통해 간편하게 볼 수 있습니다.

 

import torch
from fvcore.nn import FlopCountAnalysis

# 모델 정의
model = MyObjectDetectionModel()

# 입력 텐서 정의
input = torch.randn(1, 3, 256, 256)

# FLOPS 계산
flops = FlopCountAnalysis(model, input)
print(f"Total FLOPS: {flops.total()}")

참고자료

[1] https://pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/ 

[2] 송원호. "Object Detection Overview". 부스트캠프

[3] https://blog.roboflow.com/what-is-fps/

[4] https://medium.com/@pashashaik/a-guide-to-hand-calculating-flops-and-macs-fa5221ce5ccc

반응형
반응형

1. 문제 정의

이미지 분류 문제는 주어진 이미지 데이터에 대해 사전에 정의된 클래스(혹은 '레이블')로 할당하는 문제입니다. 이미지가 가지고 있는 다양한 의미(색, 형태 등)를 해석해 클래스로 할당하여 문제를 해결합니다. 분류 문제의 특징 중 하나는 다양한 형태로 존재하는 이미지도 하나의 클래스로 분류해야 할 필요가 있습니다. 

 

분류 문제 예시 [1]

 

2. 문제 종류

분류 문제는 레이블 유형에 따라, 분류 대상의 특성에 따라 구분할 수 있습니다. 

2.1. 레이블 유형에 따라

레이블은 쉽게 표현하면, 분류 문제에서 정답에 해당되는 것으로 해당 이미지가 어떤 유형에 속하는지를 의미합니다. 레이블의 유형에 따라 둘 중 하나(예를 들어, 사람 vs 사람 x)를 구분하는 이진 분류(Binary Classification), 여러 개의 클래스 중 하나로 분류하는 다중 클래스 분류(Multi-class Classification), 데이터가 여러 개의 클래스로 동시에 분류될 수 있는 문제입니다. 여기서 Multi-label은 데이터에 여러 개의 class가 동시에 존재하기 때문에 예측할 때마다 이진 분류를 수행합니다.

 

Multi-class vs Multi-label [2]

 

각 문제 유형마다 적용되는 손실함수가 다릅니다. 이전에 이진분류를 구현하면서 언급[3]한 것 처럼, 이진 분류는 Sigmoid, Multi-class 분류 문제는 Softmax를 통해 클래스에 해당할 확률을 구합니다. 그리고 자연스럽게 해당 손실함수인 Binary Cross Entropy(BCE), Multi-class 분류 문제는 Cross Entropy를 통해 손실을 계산합니다. 

 

그렇다면 Multi-lable 문제는 어떻게 해결할까요? 위에서 언급한 것처럼 각각의 클래스에 이진 분류 문제를 적용하게 됩니다. 즉, 모든 클래스 마다 Sigmoid로 확률을 구하고, BCE를 통해 손실을 계산합니다. 

2.2. 분류 대상 특성에 따라

이미지 분류 문제에서도 클래스의 (상대적일 수 있지만) 차이에 따라 Coarse-grained, Fine-grained 로 나눌 수 있습니다.  비교적 클래스 간 연관성이 적어 (즉, 클래스 끼리 차이가 큰 경우) 객체를 분류하는 것을 Coarse-grained라고 하며, 같은 상위 범주에서 세부적인 하위 분류를 수행하는 Fine-grained 문제가 있습니다. Fine-grained 분류 문제는 미묘한 차이에서 분류를 해야 하기 때문에 조금 더 어려운 분류 문제이기도 합니다. Fine-grained 데이터셋에 대한 분류 문제를 풀기 위한 다양한 시도들이 있으니 참고하여 문제 풀이에 영감을 받을 수 있을 것입니다. [4] 

2.3. 데이터 양에 따라 

앞서 분류했던 방식은 아니지만, 사용되는 데이터 양에 따라 학습하는 방법을 다르게 적용할 수 있습니다. 데이터 양이 충분하다면 이렇게 분류할 필요도 없이 지도학습을 통해 학습이 가능하겠지만, 데이터 양이 한정될 경우 접근 방식에 대해  Few-shot / One-shot / Zero-shot으로 크게 분류 할 수 있습니다.  

 

Few-shot 분류는 클래스 당 몇 개(Few) 데이터로 학습하고 예측하는 문제 입니다. [5] (데이터가 부족한 흔하게 발생할 수 있는 상황이라고 생각됩니다.) 하지만 이와 다르게, 클래스에 하나의 데이터만으로 예측을 수행해야 하는 One-shot 분류도 있습니다. 흔한 상황은 아니지만, 자료가 거의 없는 고대/원시 언어에 대한 학습을 시킬 때 해결한 사례가 있습니다. [6] Zero-shot 분류는 학습 없이 분류를 수행하는 것을 말합니다. 최근에 핫한 Foundation Model인 BERT, CLIP, GPT-3 등이 해당되며, Foundation Model에 기초하기 때문에 이들의 품질에 의해 크게 좌우됩니다. [7]

3. 참고자료

[1] Archit Parnami, Minwoo Lee. "Learning From Examples: A Summary of Approaches to Few-Shot Learning" 

[2] https://www.geeksforgeeks.org/multiclass-classification-vs-multi-label-classification/

 

Multiclass Classification vs Multi-label Classification - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

[3] https://seanpark11.tistory.com/111

 

PyTorch로 Binary Classifier 구현하기 | 로지스틱 회귀, 이진 분류

1. 도입선형 분류(Linear Classifier)는 선형 회귀에 있던 것처럼 Wx+b의 선형 방정식 형태로 데이터를 분류하는 것을 말합니다. W를 바꾸게 되면 결정할 수 있는 기준(결정 경계)가 회전하게 되고, b를

seanpark11.tistory.com

[4] https://paperswithcode.com/task/fine-grained-image-classification

 

Papers with Code - Fine-Grained Image Classification

**Fine-Grained Image Classification** is a task in computer vision where the goal is to classify images into subcategories within a larger category. For example, classifying different species of birds or different types of flowers. This task is considered

paperswithcode.com

[5] https://paperswithcode.com/task/few-shot-learning

 

Papers with Code - Few-Shot Learning

**Few-Shot Learning** is an example of meta-learning, where a learner is trained on several related tasks, during the meta-training phase, so that it can generalize well to unseen (but related) tasks with just few examples, during the meta-testing phase. A

paperswithcode.com

[6] https://paperswithcode.com/task/one-shot-learning

 

Papers with Code - One-Shot Learning

One-shot learning is the task of learning information about object categories from a single training example. <span style="color:grey; opacity: 0.6">( Image credit: [Siamese Neural Networks for One-shot Image Recognition](https://www.cs.cmu.edu/~rsalakhu/p

paperswithcode.com

[7] https://paperswithcode.com/task/zero-shot-learning

 

Papers with Code - Zero-Shot Learning

**Zero-shot learning (ZSL)** is a model's ability to detect classes never seen during training. The condition is that the classes are not known during supervised learning. Earlier work in zero-shot learning use attributes in a two-step approach to infer un

paperswithcode.com

 

 

 

반응형
반응형

NeRF

Neural Radiance Fields(NeRF)는 3D 대상이나 장면을 신경망을 통해 학습하여 표현하는 방법입니다. 공간적 위치를 표현하는 (x, y, z)와 방향을 표현하는 (∅,ϴ)를 조합하여 5차원의 좌표계를 입력으로 하여 색(R, G, B)과 밀도(σ, 얼마나 투명한지)를 통해 나타냅니다. 

NeRF 개요 [1]

학습 방법

NeRF는 3D 공간에 있는 광선의 밀도와 색상을 누적 합산을 통해 Volume Rendering(이하'볼륨 렌더링')을 수행합니다. 볼륨 렌더링은 신경망을 활용해 특정 시점의 2D 이미지 데이터를 입력 받아 3D 구조를 생성합니다. 방법은 간단하게 살펴보면 다음과 같습니다.

 

1) 다양한 각도에서 찍은 2D 이미지를 입력 데이터로 받아 여러 점들을 샘플링 합니다.

2) 각 지점에서 색상과 투명도를 계산하고 그 값들을 합성합니다. (Ray marching, 아래 식 참고)

 

 

3) 예측한 렌더링 결과와 실제 이미지 간의 손실을 계산하고, 역전파를 통해 가중치를 업데이트 합니다. 

4) 최종적으로 학습이 완료되면, 훈련에 사용되지 않은 시점에서 장면도 렌더링해 3D 형태의 이미지를 만듭니다. 

 

이에 대한 간단한 개요는 홈페이지에서 소개하고 있는 이미지를 통해 이해할 수 있습니다. 

 

합성 방법 [1]

3DGS

지점마다 ray marching이라는 계산을 수행해야 하는 NeRF는 태생적으로 많은 연산이 발생할 수 밖에 없습니다. 이에 대한 보완 연구들이 많이 이뤄져서 개선이 있긴 하지만, 고해상도일수록 더욱 많은 연산이 필요하기 때문에 렌더링이 더욱 어렵습니다.

 

이에 3D 렌더링의 새로운 패러다임으로 3D Gaussian Splatting(3DGS)가 등장합니다. 3D Gaussian은 일반적으로 많이 보는 종모양 가우시안 분포(정규분포)를 3차원 공간으로 확장한 것으로 평균(중심 위치)과 공분산 행렬(각 방향의 분산)의 매개변수를 갖습니다. (기존 정규분포는 평균, 분산을 갖던 것에서 확장) 여기서 3DGS는 더 나아가서 색상(RGB)과 투명도 (σ)까지 포함합니다. 

학습 방법

3DGS의 학습 방법은 다음과 같이 소개하고 있습니다. 도식으로 표현하면 아래 그림을 참고하시기 바랍니다. 

 

1) 다각도의 2D 이미지와 카메라 위치를 수집합니다. (SfM이란 표현을 쓰긴 했지만, NeRF와 같습니다)

2) 3D Gaussian을 초기화 합니다. 평균, 공분산, RGB을 초기화 합니다. 

3) 입력 데이터의 값을 활용해 Rasterizer로 예측한 이미지 값을 비교해 손실을 계산하고 최적화를 수행합니다.

4) 일련의 절차에 따라 Gaussian을 판단 및 정리하여 밀도를 조정합니다. 

- 일정 기준보다 낮은 투명도를 가진 경우 Gaussian을 제거 합니다.  

- 기하학적 특징을 파악하지 못한 경우(Under-reconstruction) : positional gradient 방향으로 복사 합니다.

- 광범위하게 Gaussian이 모델링 된 경우(Over-reconstruction) : Gaussian을 분리합니다. 

- 위 과정들을 반복하며서 형상을 잡아갑니다. 

 

3DGS 학습 방법[3]

 

다만, NeRF나 3DGS 모두 더 복잡하므로 관심이 있다면, 관련 논문 및 자세하게 분석된 블로그 글을 통해 더 자세하게 살펴볼 필요가 있습니다.

참고자료

[1] https://www.matthewtancik.com/nerf

[2] Midenhall et al. "NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis". https://arxiv.org/abs/2003.08934

[3] Kerbl et.al. "3D Gaussian Splatting for Real-Time Radiance Field Rendering". https://arxiv.org/abs/2308.04079

 

 

반응형
반응형

VAE

Variational Autoenconder(VAE)는 데이터의 잠재 표현(latent representation)을 확률적으로 인코딩하고, 이를 통해 원본을 재구성하거나 새로운 데이터를 생성하는 모델을 말합니다. 

VAE 구조

VAE는 크게 인코더 - 잠재 공간 - 디코더로 구분된 구조를 가지고 있습니다.

인코더(Encoder)

- 입력 데이터 x를 받아서 잠재 변수 z의 확률 분포 매개변수(평균, 분산)을 출력합니다.

- 인코더는 신경망을 통해 구현합니다.

잠재 공간(Latent Space)

- 가우시안 분포를 따르는 잠재 변수 z를 샘플링합니다.

- 샘플링할 때 reparametrization을 사용합니다. 

디코더(Decoder) 

- 샘플링된 잠재 변수 z를 받아서 원본 데이터 공간의 재구성 x'을 출력합니다. 

- 디코더는 신경망을 통해 구현합니다. 

 

여기서 구조에 따라 두가지 손실이 존재합니다. 하나는 재구성 손실(reconstruction loss)이 있고 다른 하나는 쿨백-라이블러 발산(KL divergence)입니다. 재구성 손실은 입력 x와 재구성 x'와 차이이며, KL 발산은 잠재 공간의 분포와 가우시안 부포의 차이를 의미합니다. VAE에서는 두가지를 합쳐서 총 손실(재구성 손실 + KL 발산)을 계산합니다. [1]

 

 

Auto-Encoding Variational Bayes

How can we perform efficient inference and learning in directed probabilistic models, in the presence of continuous latent variables with intractable posterior distributions, and large datasets? We introduce a stochastic variational inference and learning

arxiv.org

적용 방법

주어진 훈련 데이터셋을 미니 배치로 나눠 앞서 구성한 인코더와 디코더에 학습시키고, 역전파를 통해 네트워크의 가중치를 업데이트 합니다.

 

이렇게 학습된 인코더와 디코더는 데이터의 추론 및 생성에 활용됩니다. 먼저, 인코더에 입력된 값들은 평균과 분산을 활용해 reparametrization을 통해 z을 샘플링해 잠재 공간을 생성하게 됩니다. 그리고 샘플링된 데이터를 디코더에 넣어 새로운 데이터를 생성하게 됩니다.

 

아래 예제 코드를 통해 적용 방법에 대해 이해할 수 있습니다. 

 

GitHub - Jackson-Kang/Pytorch-VAE-tutorial: A simple tutorial of Variational AutoEncoders with Pytorch

A simple tutorial of Variational AutoEncoders with Pytorch - Jackson-Kang/Pytorch-VAE-tutorial

github.com

DDPM

Denoising Diffusion Probablistic Model(DDPM)은 최근에 많이 사용되는 이미지 생성 애플리케이션의 근간이 되는 디퓨전 모델을 처음 제시한 모델입니다. 디퓨전 모델은 데이터에 점진적으로 노이즈를 추가하는 과정(forward process)과 노이즈를 제거하고 데이터를 복원하는 과정(reverse process)을 학습합니다.

 

DDPM 구조[2]

Forward process

최종 단계(T)까지 나눈 단계(time step)마다 노이즈를 추가하면서 최종에서는 완전한 가우시안 노이즈에 가깝게 변환합니다. 가우시안 노이즈를 만드는데 필요한 확률분포는 아래와 같이 모델링하고 있습니다. (여기서 beta 값은 하이퍼파라미터입니다.)

 

노이즈가 추가된 데이터와 타임스텝을 신경망에 입력해 신경망에서 노이즈 예측값을 계산하고, 예측 노이즈와 실제 노이즈 사이의 차이를 계산합니다. 이를 손실함수로 훈련을 진행합니다. 

 

Reverse process

가우시안 노이즈인 T에서 점진적으로 노이즈를 제거하면서 원본 데이터 분포의 샘플을 생성하는 것을 목표로 합니다. 현재 상태와 타임스텝을 신경망에 입력해 계산된 노이즈 예측값을 제거하는 과정을 거칩니다. 

 

간단한 것처럼 설명했지만, 실제로 보면 꽤 복잡한 구조를 갖고 있습니다. 구현된 코드를 살펴보면서 이해가 필요하니 참고용으로 링크를 남깁니다.

 

ML-Paper-Review/ComputerVision/Diffusion/DDPM/DDPM.ipynb at main · Glanceyes/ML-Paper-Review

Implementation of ML&DL models in machine learning that I have studied and written source code myself - Glanceyes/ML-Paper-Review

github.com

Latent Diffusion (Stable Diffusion)

Latent Diffsuion(LDM) 또는 Satble Diffusion이라 불리는 기술은 단연컨데, 최근에 생성형 이미지에 가장 많이 사용되는 기술일 것입니다. 그만큼 일반적으로 활용이 가능하고 결과물의 퀄리티가 높은 편이라 꼭 알아두어야 하는 기술이라고 생각합니다. LDM은 이미 학습된 오토 인코더를 활용해 latent space에 있는 DDPM을 학습하는 형태로 모델의 훈련이 진행됩니다.

LDM 구조

LDM의 구조는 아래 그림과 같습니다. 크게 구분할 수 있습니다.

 

1) 픽셀 공간(Pixel Space) : 입력 및 출력을 담당하는 인코더와 디코더를 포함한 오토인코더 존재

2) 잠재 공간(Latent Space) : Diffusion 프로세스와 Denoising하는 Unet 구조를 포함해 DDPM 학습 수행

3) 조건부 메커니즘(Conditioning Mechanism) : 다른 입력 값(텍스트 등) 처리

 

LDM 구조 [3]

 

각 구조별 손실함수는 다음과 같습니다. 

픽셀 공간 손실함수 [3]
잠재 공간 손실함수 [3]
조건부 메커니즘 손실함수 [3]

적용 방법

앞서 VAE와 DDPM을 이해했다면, 적용 방법 자체는 비교적 간단합니다. 왜냐하면 DDPM과 가장 큰 차이점이 DDPM은 확산 및 학습 과정이 픽셀 공간에서 이뤄졌다면, LDM은 픽셀 공간에서는 이미 학습된 오토 인코더를 가져와서 인코딩/디코딩을 수행하고 잠재 공간에서 확산 및 학습 과정이 이뤄지기 때문입니다. 즉, 여러 기능들을 모듈화하여 조합하는 형태라고 이해할 수 있을 것 같습니다. 참고할만한 github 파이썬 파일 링크를 아래와 같이 기록합니다. 

 

 

latent-diffusion/ldm/models/autoencoder.py at a506df5756472e2ebaf9078affdde2c4f1502cd4 · CompVis/latent-diffusion

High-Resolution Image Synthesis with Latent Diffusion Models - CompVis/latent-diffusion

github.com

 

 

latent-diffusion/ldm/models/diffusion/ddpm.py at main · CompVis/latent-diffusion

High-Resolution Image Synthesis with Latent Diffusion Models - CompVis/latent-diffusion

github.com

응용 사례

Stable Diffusion의 추가적인 활용 사례에 대한 연구도 지속적으로 이뤄지는 것으로 보입니다. 기존 모델에서 제어 가능한 입력을 추가해 이미지 생성 과정을 정밀하게 조절할 수 있도록 제어하는 ControlNet[4], 사전 학습된 모델에 추가적인 작은 모듈만 더해 모델을 조정하는 LoRA[5]와 같은 모델들이 있습니다.

참고자료

[1] Diederik P Kingma, Max Welling. "Auto-Encoding Variational Bayes". https://arxiv.org/abs/1312.6114

[2] Jonathan Ho, Ajay Jain, Pieter Abbeel. "Denoising Diffusion Probablistic Models". https://arxiv.org/abs/2006.11239

[3] Rombach et al. "High-Resolution Image Synthesis with Latent Diffusion Models". https://arxiv.org/abs/2112.10752

[4] Lvmin Zhang, Anyi Rao, Maneesh Agrawala, "Adding Control Control to Text-to-Image Diffusion Models". https://arxiv.org/abs/2302.05543

[4] Hu et al., "LoRA : Low-Rank Adaptation of Large Language Models". https://arxiv.org/abs/2106.09685

 

 

 

 

 

 

 

 

 

반응형