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
[boostcamp] 부스트캠프 AI Tech 8주차 돌아보기
1. 잘한 것- 할당된 강의 내용을 듣고 과제와 내용을 정리하였습니다. - 프로그래밍 능력을 높이기 위해 이번 주에 할당된 코딩테스트 문제 풀이는 모두 완료하였습니다. 2. 부족한 것- 라이브러리(MMDetection, Detectron2)에 대한 사용법을 잘 이해하지 못했습니다. - 프로젝트에 대한 EDA를 수행하는 정도 수준이 너무 단순한 것만 시도했습니다. 3. 배운 것- 객체 탐지에 필요한 기본 개념 : https://seanpark11.tistory.com/137, https://seanpark11.tistory.com/138📖객체 탐지 지표(IoU, mAP, FPS, FLOPS), 데이터 포맷(COCO, Pascal VOC) - 2 Stage Detectors : https://seanpar..
2024.10.11
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
[boostcamp] 부스트캠프 AI Tech 7주차 돌아보기
1. 잘한 것- 프로젝트에서 정확도를 높이기 위한 코드로 일부 기여하였습니다. - 프로그래밍 능력을 높이기 위해 이번 주에 할당된 코딩테스트 문제 풀이는 모두 완료하였습니다.- 프로젝트 완료 후 필요한 일련의 작업(Wrap-up report 등)들을 지원하면서 팀을 지원했습니다. 2. 부족한 것- 모델을 사용함에 있어 해당 모델을 채택해야 하는 이유에 대한 탐구가 부족했습니다. - 이번 주에 배운 것들이 많았는데, 그 모든 것을 다 시도해보지 못했습니다. 3. 배운 것- 딥러닝에서 사용할 수 있는 베이스 코드 템플릿 :https://seanpark11.tistory.com/124, https://github.com/SuyoungPark11/my-code-snippet📖 데이터셋, 훈련, 테스트 등 딥러..
2024.09.27
no image
[CV] 이미지 분류 문제에 대한 분류 | Binary vs Multi-, Coarse vs Fine-grained, N-shot learning 까지
1. 문제 정의이미지 분류 문제는 주어진 이미지 데이터에 대해 사전에 정의된 클래스(혹은 '레이블')로 할당하는 문제입니다. 이미지가 가지고 있는 다양한 의미(색, 형태 등)를 해석해 클래스로 할당하여 문제를 해결합니다. 분류 문제의 특징 중 하나는 다양한 형태로 존재하는 이미지도 하나의 클래스로 분류해야 할 필요가 있습니다.   2. 문제 종류분류 문제는 레이블 유형에 따라, 분류 대상의 특성에 따라 구분할 수 있습니다. 2.1. 레이블 유형에 따라레이블은 쉽게 표현하면, 분류 문제에서 정답에 해당되는 것으로 해당 이미지가 어떤 유형에 속하는지를 의미합니다. 레이블의 유형에 따라 둘 중 하나(예를 들어, 사람 vs 사람 x)를 구분하는 이진 분류(Binary Classification), 여러 개의 클..
2024.09.20
[boostcamp] 부스트캠프 AI Tech 6주차 돌아보기
1. 잘한 것 - 수행해야 할 것들이 많아서 할당된 강의를 수강했습니다. - 리뷰해야할 논문(ResNet)에 대한 준비 및 발표를 했고, 관련해서 torch로 직접 구현해봤습니다. - 잘 작동하지 않는 것에 대해 팀원과 Boost Camper에게 물어보면서 해결했습니다. 2. 부족한 것- 해야할 것들과 잘 작동하지 않는 것들이 많아, 알고리즘 공부를 제대로 하지 못했습니다. - 새로운 환경(Linux, 원격 서버 연결 등)에 적응하느라 많은 시간을 허비했습니다.- 다른 내용들을 먼저 수행하느라 프로젝트 관련 내용을 충분히 보지는 못했습니다.  3. 배운 것- Linux 사용 :📖 Linux (나의 경우 Ubuntu 환경) 커맨드 📖 VS Code에서 SSH로 원격 서버에 연결 - Streamlit  ..
2024.09.13
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
반응형

도입

지난 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" 

반응형
반응형

 

1. 잘한 것

- 할당된 강의 내용을 듣고 과제와 내용을 정리하였습니다. 

- 프로그래밍 능력을 높이기 위해 이번 주에 할당된 코딩테스트 문제 풀이는 모두 완료하였습니다. 

2. 부족한 것

- 라이브러리(MMDetection, Detectron2)에 대한 사용법을 잘 이해하지 못했습니다. 

- 프로젝트에 대한 EDA를 수행하는 정도 수준이 너무 단순한 것만 시도했습니다. 

3. 배운 것

- 객체 탐지에 필요한 기본 개념 : https://seanpark11.tistory.com/137, https://seanpark11.tistory.com/138

📖객체 탐지 지표(IoU, mAP, FPS, FLOPS), 데이터 포맷(COCO, Pascal VOC)

 

- 2 Stage Detectors : https://seanpark11.tistory.com/141, https://seanpark11.tistory.com/142

📖 R-CNN, SPPNet, Fast R-CNN, Faster R-CNN

📖 객체 탐지 모델의 구조 및 Neck의 개념 : FPN, PANet, Bi-FPN

 

- 1 Stage Detectors 

📖 YOLO, SSD, RetinaNet

4. 시도할 것

- 라이브러리에 모델을 구축 및 등록하여 수행할 예정입니다.

- WandB 사용법을 익힐 예정입니다.

- 다음 주까지는 배웠던 내용들을 모두 정리할 예정입니다. 

반응형
반응형

기본 개념 

객체 탐지(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. 잘한 것

- 프로젝트에서 정확도를 높이기 위한 코드로 일부 기여하였습니다. 

- 프로그래밍 능력을 높이기 위해 이번 주에 할당된 코딩테스트 문제 풀이는 모두 완료하였습니다.

- 프로젝트 완료 후 필요한 일련의 작업(Wrap-up report 등)들을 지원하면서 팀을 지원했습니다. 

2. 부족한 것

- 모델을 사용함에 있어 해당 모델을 채택해야 하는 이유에 대한 탐구가 부족했습니다. 

- 이번 주에 배운 것들이 많았는데, 그 모든 것을 다 시도해보지 못했습니다. 

3. 배운 것

- 딥러닝에서 사용할 수 있는 베이스 코드 템플릿 :

https://seanpark11.tistory.com/124, https://github.com/SuyoungPark11/my-code-snippet

📖 데이터셋, 훈련, 테스트 등 딥러닝에서 공통적으로 사용할 수 있는 코드

➡️ 새롭게 알게 된 내용들을 지속적으로 정리/추가/수정하면서 딥러닝 코드를 작성할 때 속도와 효율을 높일 수 있도록 할 예정입니다.  

 

- 효율적인 훈련을 위한 테크닉

📖 Data Caching : 전체 이미지를 미리 벡터화해서 npy 형태로 저장해 활용

📖 Gradient Accumulation : 여러 배치에서 계산된 그래디언트를 누적해 업데이트

📖 Mixed Precision : FP16로 타입캐스팅을 통해 연산 효율화

 

- 이미지 분류 문제에 대한 정의 : https://seanpark11.tistory.com/128

📖 레이블 유형에 따른 분류(Binary, Multiclass, Mulilabel), 이미지 특성(Coarse-grained, Fine-grained), 접근 방식(Few-shot, One-shot, Zero-shot) 

 

- 이미지 데이터에 대한 사용하기 위해 : https://seanpark11.tistory.com/133

📖 PIL, OpenCV 라이브러리 사용 

 

- 그 외 프로젝트를 진행하면서 해결했던 오류 : https://seanpark11.tistory.com/132

4. 시도할 것

- 이번 프로젝트에서는 WandB를 사용하지 않았는데, 새로운 프로젝트에서는 활용할 예정입니다.

- 학습된 모델의 가중치를 활용하는 전이학습을 시도해볼 예정입니다.

- 쉘 스크립트로 좀 더 나은 환경을 구축하는데 활용해볼 예정입니다.

- 새로운 프로젝트의 주제인 Object Detection에 대해 그동안 배웠던 것을 복습해보고, 적용할만한 모델들에 대해 공부해볼 계획입니다. 

반응형
반응형

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

 

 

 

반응형
반응형

1. 잘한 것 

- 수행해야 할 것들이 많아서 할당된 강의를 수강했습니다. 

- 리뷰해야할 논문(ResNet)에 대한 준비 및 발표를 했고, 관련해서 torch로 직접 구현해봤습니다. 

- 잘 작동하지 않는 것에 대해 팀원과 Boost Camper에게 물어보면서 해결했습니다. 

2. 부족한 것

- 해야할 것들과 잘 작동하지 않는 것들이 많아, 알고리즘 공부를 제대로 하지 못했습니다. 

- 새로운 환경(Linux, 원격 서버 연결 등)에 적응하느라 많은 시간을 허비했습니다.

- 다른 내용들을 먼저 수행하느라 프로젝트 관련 내용을 충분히 보지는 못했습니다.  

3. 배운 것

- Linux 사용 :

📖 Linux (나의 경우 Ubuntu 환경) 커맨드 

📖 VS Code에서 SSH로 원격 서버에 연결

 

- Streamlit  : 웹 서비스 관점에서 AI 모델을 프로토타입 제품화 프레임워크 

📖 Albumentations Demo - a Hugging Face Space by IliaLarchenko

📖 App Gallery • Streamlit

➡️ 위 링크의 내용들을 참고해서 나중에 AI 모델을 한번 만들어보는 시도도 해볼 예정입니다.

 

- 이미지 분류 문제를 어떻게 풀 것인가 : 

📖 이미지 분류 문제의 구분(레이블 유형 - Binary, Multi-class, Multi-label / 개체 속성 - Coarse-grained, Fine-grained)

📖 CNN과 Transformer(ViT)의 특징과 그에 따른 선택

4. 시도할 것

- Sketch 데이터의 특징에 대해 공부하고, 프로젝트의 feature를 추출해 데이터셋에 대한 이해(EDA)를 진행할 예정입니다.

- 데이터의 특징을 고려해 데이터 증감 기법에 대한 논리를 고민하고, 시간이 된다면 수행해볼 예정입니다. 

- 몇몇 모델이 이미지를 어떻게 이해하는지 시각화해서 모델에 대한 이해를 높일 계획입니다. 

반응형
반응형

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

 

 

반응형