본문 바로가기
CS231n

CS231n(11) Detection and Segmentation

by 민지기il 2024. 3. 18.

Semantic Segmentation

-해당 픽셀의 카테고리가 무엇인지에  대해 모든 픽셀에 독립적으로 레이블을 지정한다.

-소 2마리를 각각의 객체로 보지 않고 소라는 라벨이 붙은 픽셀 덩어리로 본다. 분류하려면 instance segmenatation 수행하면 된다

- Classification이 어떠한 객체를 단위로 분류했다면,  Semantic Segmentation은 픽셀 단위로 분류한다.

Sliding Window

Patch를 만들고, 전체 영역을 모두 돌면서 한 픽셀이 어느 카테고리에 들어가는지 찾아내는 방법이다.

이미지의 모든 픽셀에 레이블을 지정하고 해당 이미지의 모든 픽셀에 대해 별도로 자르기가 필요하다.

각 pixel마다 crop을 진행했을때, 이웃 pixel들은 crop한 영역이 필연적으로 겹치게 된다.  하지만 이 중복되는 computation에 대한 처리가 없어 효용이 떨어진다.

계산량이 많아서 잘 쓰이지 않는다.

 

Fully Convolutional

이미지에서 개별 패치를 추출하고 이를 독립적으로 분류하기보다 Conv Layer가 거대한 스택이 되는 걸 생각해볼 수 있다. 이미지 한 장을 CNN에 통으로 넣는 것이다.

슬라이드를 보면 차원이 계속 동일하다. 3x3 zero 패딩으로 정보 손실을 막고, 스코어 값을 (C,H,W)를 반환한다.

C는 이미지 픽셀들을 분류한 카테고리의 개수이다. 모든 픽셀들을 분류해서 loss를 계산한 뒤, backward로 update해주는 방식이다.

모든 픽셀들에 대한 loss를 계산하기 위해서는 train 이미지 픽셀 전부가 labeling이 되어 있어야 한다.

하지만 이것도 이미지 원본의 size를 계속 유지시켜서 모든 픽셀에 대해서 분류하다보니 연산량이 expensive한 문제가 생긴다.

이미지의 전체 공간 해상도에 대한 모든 convolution을 수행하는 대신 원래 해상도에서 소수의 convolution layer를 거친 다음 max pooling 이나 stride convolution 및 downsampling 같은 기능을 사용하여 해당 기능 맵을 downsample할 수 있다. 이후 중간부터 다시 upsample해서 해상도를 올린다.

image classification에서 처럼 Fully connected layer로 변환하는 대신 spatial resolution(공간 해상도)을 높여서 출력 이미지와 입력 이미지가 동일한 크기가 되도록 한다. 

이러한 Upsampling layer가 실제로 어떻게 생겼고 어떻게 하는 것일까

-unpooling

Max Pooling 사진을 보면 5,6,7,8이 있던 자리에 Max Unpooling 단계에서  1,2,3,4가 가게 된다. 나머지는 0으로 채운다.

저해상도 패치의 요소를 max pooling이 발생한 지점의 고해상도 패치에 붙인다.

 

==> max pooling을 수행하는 경우 저해상도 이미지에서 max pooling으로 인해 기능 맵 내부에서 이질성이 발생한다. 

max pooling 후에 lower solution image에서 해당 feature vector가 어디서 나온건지 공간 정보도 모르게 된다. 

따라서 벡터를 동일한 슬롯에 배치하여 풀링을 해제하면 미세한 세부 사항을 좀 더 잘 처리하고 max pooling 중에 손실된 공간 정보 중 일부를 보존하는 데에 도움이 된다. 

클래스의 Boundary가 나눠지는 경계 픽셀이 분명히 존재하는데, 그 boundary를 제대로 구별하려면 더 꼼꼼해야 한다. 

더군다나 down sampling과정에서 이미 정보 손실이 일어났기 때문에, 손실을 조금이라도 메꾸기 위해서는 자리라도 기억해 Unpooling을 조금이라도 더 정확하게 하는 것이다.

 

Transpose Convolution

여기서 용어를 정확히 짚고 넘어간다.

deconvolutional layer라면 원본 인풋으로 되돌리는 층을 의미한다. transposed layer는 원본 층과 공간 차원만이 같을뿐 원본 값을 되돌리지 못한다. transposed convolution layer는 정확하게 일반적인 convolutional layer가 작동하는 방식과 같다. 그러나 input feature map의 측면에서 조금 다른 것이다.

일반적인 convolutional Layer는 padding, strid가 존재한다.

padding은 input 주변에 pad 되는 0의 갯수이고 strid는 kernel(filter)가 한번에 얼마나 이동하는 지를 결정한다.

kernel과 input 지역의 내적을 통해 output 픽셀을 계산한다.

이는 down-sampling의 효과가 있고, 아웃풋의 공간적 차원은 input의 차원보다 작다.

기능 맵을 unsample하고 해당 upsample을 수행하려는 방법에 대한 일부 가중치를 학습한다.

input(파란색)의 각 pixel을 3x3필터에곱한다.

그럼 필터사이즈만큼의 벡터가 나오는데 이를 지정한 stride만큼 움직이면서 sum up 해서 output을 만든다.

이때 겹치는 부분은 서로 더해준다.

입력 특징맵에서 값을 하나 선택하고, 이 스칼라 값을 필터(3*3)와 곱한다. 그리고 출력의 3*3 영역에 그값을 넣는다.

Transpose convolution에서는 (필터x입력)의 내적을 계산하는 것이 아니라, 입력값이 필터에 곱해지는 가중치의 역할을 한다.

출력 값은 필터 * 입력(=가중치) 이다.

 

 

-Strided convolution

입력의 가능한 모든 지점에서 해당 필터를 팝업하는 대신 필터를 이동할 때마다 입력에서 필터를 2픽셀씩 이동한다. 

stride 2로 stride convolution을 수행하면 이미지나 feature map을 2배로 down sampling 하게 된다.

-Transpose convolution

여기서는 위에거랑 반대다. 입력이 2X2이고 출력이 4X4이다. 내부곱을 취하는 대신 입력 특성 맵의 값을 취하는 것이다

이는 빨간색 부분에 있는 스칼라 값이다. 필터에 해당 스칼라 값을 곱한 다음 해당 값을 출력의 3x3 영역에 복사한다.

필터와 입력의 내적을 취하는 대신 입력에서 사용할 가중치를 제공한다.

필터에 가중치를 부여하면 출력은 입력 값에 따라 가중치가 부여된 필터의 가중치 복사본이 된다.

입력은 스칼라 값이고 (스칼라 값x필터의 값) 하고 가중치가 적용된 필터 값을 출력의 새 영역에 복사한다.

간단하게 2D로 보여준 모습니다. 여기서 겹치는 az+bx는 더해주면 된다.

Stride가 1일때 행렬을 나타낸 것이다. 이때는 a행렬에서 0의 갯수만 다르고 conv와 유사하다. 

하지만 stride가 2가 되면 달라진다.

Stride가 1을 초과하면 transpose conv는 convolution이 아니다. 근본적으로 연산이 달라진다. 

그래서 위는 semantic segmentation의 일반적인 구조이다. 내부에 downsample, upsample 하는 convolution network가 있다.

그리고 모든 픽셀에 cross-entropy를 계산하면 네트워크 전체를 end to end로 학습시킬 수 있다.

 

Classification + Localization

 

cat이 있다는 걸 알고 박스를 쳐서 cat의 위치를 알고자 한다. 

object detection과 달리 객체가 오직 1개뿐이라고 가정한다.

Alex Net이나 이런걸 통해 상단의 class score를 내는 거고 localization으로 box coordinates로 4가지 출력을 하게 된다.

학습 이미지에는 카테고리 label과 해당 객체의 bounding box ground truth를 동시에 가져야 학습한다.

이 네트워크를 학습시키려면 2개의 loss가 존재한다. 2가지 loss 중 하나는 softmax loss이다. Ground truth bbox와 예측한 box 사이에 오차를 측정하는 loss도 있다. 이때 l2를 써서 차이를 구한다.
이 2개의 loss를 합친 걸 multi-task-loss라고 한다. 이 기울기를 구하려면 네트워크 가중치들의 각각 미분 값을 계산하므로 최소화 해야한다. 두 Loss의 가중치를 조절하는 hyperparameter가 있는데 이를 조절하는 것은 매우 어렵다. 따라서 loss만으로 성능을 비교하는 게 아니라 다른 지표들도 본다.

Object Detection

Sliding Window

crop을 나눠서 sliding하면서 어떤 카테고리인지 보는 것이다. 하지만 crop이 매우 많아진다. 따라서 잘 쓰지 않는다

Region Proposals

 

대상이 있을만 한 곳에 box들을 만들어 준다. 

따라서 이미지가 있을 모든 위치와 규모에 classification network를 적용하지 않는다. 대신 객체가 있을만한 proposal region set을 얻은 다음 convolution network를 적용하는 것이다.

R-CNN

이미지가 주어지면 region proposal(ROI) 얻기 위해 region proposal network 수행한다.

분류를 위한 convolution network는 동일한 입력의 이미지를 원한다. 따라서 정해진 사각형 크기로 고정해야 한다. (warped image region)

그리고 ConvNet을 통해 각각의 부분을 통과시킨다. 이때 SVM을 이용해서 classification하여 각 crop에 대한 카테고리를 예측한다.

여기서 Bbox reg 있는데 region proposal 보정하기 위한 과정이다.  Selective search의 region proposal은 대개 정확하지만 그렇지 않을 수도 있기 때문이다. 그래서 RCNN은 BBOX의 카테고리도 예측하고 이를 보정할 수 있는 offset 값도 4개 예측한다. 

 

문제) 계산상에 여전히 비용이 많이 든다. 모든 기능을 disk에 넣으므로 무거워진다. 시간도 많이 걸린다.

이미지 당 test 시간도 매우 느리다.

각 region proposal에 대해 convolution network를 통해 수천 번의 순방향 패스를 실행해야 하므로 매우 느려진다. 

 

그래서 Fast R-CNN이 등장하였다.

이는 ROI마다 각각 CNN을 수행하지 않고 전체 이미지로 CNN을 수행해서 고해상도 feature map을 얻는다.

이제 feature map에서 ROI 얻어낸다.이후 ROI 크기가 조정된다. 과정이 ROI Pooling Layer이다. ROI Pooling 대해 다루지는 않는다. 근데 그림을 보면 CNN에서 나온 feature 값에다가 Image 박스되어 있는 부분에 대해서 pooling 하는 방식이다. 그리고 이거를 FC-Layer 넣는다.

FC-layer 넣으면 classification score linear regression 얻는다. 최종 Loss 둘을 합친 것이다

Faster R-CNN

Fast R-CNN은 빨라서 selective search로 Region Proposal을 계산하는 시간이 대부분이다. 따라서 이게 병목구간이 된다.

그래서 Faster R-CNN이 나오는데 이는 네트워크가 region proposal을 직접 만든다. 이미지가 입력으로 들어오면 전체 CNN을 통해 feature map을 뽑는다. 별도의 region proposal network(RPN)이 있어서 네트워크가 feature map을 가지고 region proposal을 계산하도록 한다. 나머지는 Fast R-CNN과 동일하다.

- 과정

입력이미지 -> CNN -> Feature Map -> RPN (Region proposal network) -> Region proposal -> ROI pooling

-> multi-task loss

multi-task loss : faster R-CNN은 4개의 loss를 한번에 학습한다. 이 loss들의 균형을 맞추는 것은 까다롭다.

- RPN의 2가지 loss

1. 해당 위치에 객체가 있는가 없는가를 예측한 loss

2. 예측한 bounding box에 대한 loss

- Faster R-CNN 최종단의 2가지 loss

1. region proposals의 classification 결정 loss

2. bounding box regression (region proposal을 보정해주는 역할)

RPN의 Classification loss는 region proposal 후보들에 대해서 region 안에 객체가 존재하는지 안 하는지 결정한다. 

 

YOLO / SSD

potential region에 대해 독립적인 processing을 하는 대신 regression 문제처럼 다룬다. CNN을 통과해서 모든 예측을 한번에 수행한 예측 값이 나온다. 

그림을 보면 입력 이미지를 7X7의 박스로 나누고 base bounding box는 3개의 박스가 겹친 모습이 보인다. 이제 이 각 grid cell(7X7) 에 대해서 BBox들을 기반으로 몇가지 예측을 수행한다.

첫번째는 BBox의 offset을 예측한다. 실제 위치가 되려면 base bboc를 얼만큼 옮겨야하는지를 뜻한다.

그리고 각 bbox에 대해서 classification score를 계산한다. 이 bbox 안에 카테고리에 속한 객체가 존재할 가능성을 의미한다.

네트워크에 입력 이미지가 들어오면 7*7 grid마다 (5B + C)개의 tensor를 가진다.

(여기서 B는 bbox의 offset (4)와 confidence score(1)로 구성되며 C는 C개의 카테고리에 대한 classification score이다.)

 

정리하자면, 네트워크의 입력은 이미지이고 출력은 3-dim tensor이다. 그리고 이를 거대한 CNN으로 한번에 학습시킨다.

SSD와 YOLO는 후보 base bounding box와 GT object를 매칭시키는 방법이다. 기본 경계 박스에서 벗어난 offset을 예측해서 벗어난 객체의 실제 위치를 예측하려고 한다. 그리고 기본 경계박스 각각에 대한 분류 점수를 예측하려고 한다. 

 

Instance Segmentation

입력 이미지의 어떤 픽셀이 각 객체 인스턴스에 해당하는지 예측한다.

각각의 object 어떤 class 속하는지, pixel 어떤 class 속하는지 객체의 종류와 위치를 파악한다

Semantic Segmentation+Object Detection 이라고 볼 수 있다.

Mask R-CNN

 

 

Mask R-CNN은 faster R-CNN과 유사하다.

여러 스테이지를 거치는 형태인데, 처음 입력이미지가 CNN과 RPN을 거친다. (faster R-CNN과 유사)

그리고 fast/faster R-CNN에서 한 것처럼 특징맵에서 RPN의 ROI만큼을 뜯어낸다. (projection)

이후 각 bbox마다 segmentation mask를 예측하도록 한다. (RPN으로 뽑은 ROI 영역내에서 각각 sematic segmentation을 수행)

feature map으로부터 ROI pooling을 하면 두갈래로 나뉜다.

상단에 보이는 첫번째 갈래는 faster R-CNN과 유사하게 생겼다. 여기서는 각 Region proposal이 어떤 카테고리에 속하는지 계산한다. 그리고 bbox regression도 예측한다.

그리고 하단의 두번째 갈래는 semantic segmentation을 위한 미니 네트워크처럼 생겼다. 각 픽셀마다 객체인지 아닌지를 분류한다.

pose estimate도 수행가능하다.

사람의 관절 좌표를 예측하는 부분을 추가하면 된다. pose estimation을 위해서 각 region proposals 갈래를 하나 더 추가하고, 현재 region proposal 안의 객체의 관절에 해당하는 좌표를 예측하도록 하면 된다.

이를 위해서는 loss와 layer를 하나 더 추가하면 된다. multi-task loss에 loss가 하나 더 추가되는 것이다.

그리고 한번에 학습시키면 된다

이로써 이미지에 사람이 몇명 있는지, 해당 사람이 어디에 있는지, 각 사람에 해당하는 픽셀, 해당 사람의 자세를 추정하는 뼈대를 그린다.

사람이 많아도 가능하다. GPU에서 초당 5프레임에 실행된다.

 

까먹었다. 다시 복습)

-딥러닝에서 backprop은 손실함수의 기울기를 계산하기 위함이다. 모델의 매개변수를 어느 방향으로 업데이트 해야하는지 알려준다.  

-softmax와 cross-entropy

Softmax function은 신경망의 출력을 확률로 해석하기 위해 사용된다.

주어진 벡터를 입력으로 받아 이를 각 클래스에 대한 확률 분포로 변환하여 모든 요소의 합이 1이 되도록 한다.

Cross-entrophy는 신경망의 출력과 실제 타깃 사이의 차이를 측정하는 데 사용한다.

yi - 인코딩 벡터이고 pi 모델의 예측확률이다.

'CS231n' 카테고리의 다른 글

Assignmenft 1-3 (SoftMax)  (1) 2024.03.30
C231n(12) Visualizing and Understanding  (1) 2024.03.23
Assignment 1-1 (KNN)  (0) 2024.03.18
Assignment Python Tutorial  (1) 2024.03.14
CS231n(10) Recurrent Neural Networks  (0) 2024.03.13