https://taeyoung96.github.io/cs231n/CS231n_11/
https://lsjsj92.tistory.com/416
1) Sementic Segmentation : 이미지의 픽셀이 어느 클래스에 속하는가?
이는, 미리 클래스의 수와 종류를 정해야 한다.
근데, 위의 소를 보면 알 수 있듯, 개별 객체는 구별되지 않는다.
이러한 Sematinc Segmentation의 구현에는, Sliding Window 기법이 있다.
atch를 만들고, 전체 영역을 모두 돌면서, 각 픽셀이 어느 카테고리에 들어갈지 찾아내는 것이다. 이는 연산량이 매우 많다는 단점이 존재. 또한, 설령 다른 영역(Patch)더라도, 인접해있다면 그 특징을 공유할 터인데, 이건 그게 안됨.
따라서, 다음으로 Fully Connected Network가 고안되었다.
연산량은 줄었겠지만, 보면 알수 있듯 Spatial size(공간 정보)를 유지해야 한다.
이 역시, 모든 픽셀에 대해 카테고리 Score를 계산해야 하기에, 여전히 무겁다.
따라서, 공간정보를 줄였다가 늘리기로 했다. 마치 U-net처럼...
다운샘플링과 업샘플링을 진행하는 것.
이 업풀링의 예시를 보자.
그냥 봐도 뭘 하고자 하는지 알 수 있다.
위는 네트워크가 downsampling할 때의 정보(혹은 위치)를 기억해서, 그곳에 선택된 값을 넣는 것이다.
max pooling은 특징맵의 공간정보를 잃게 되는 단점이 있는데, 이를 통해 공간정보를 더 균형있게 유지가 가능하다.
마지막으로 Transpose Convolution을 고려하자. 이는 간단하게 말하면, 커널 사이즈보다 작게 stride를 진행하는 것이다.
위처럼, 3x3 transpose convolution, stride 2, pad 1을 한다고 가정한다.
입력값을 가중치라 하고, 필터의 값을 곱해서 output에 채워넣는다고 치자.
겹치는 부분이 있다면, 그 구간의 값을 전부 더하면 된다(Sum where output overlaps). 평균내는게 아니다!
결과값은 크게 차이나지 않는다. 이 때, 왼쪽이 Stride가 1인 Convolution, 오른쪽이 stride가 1인 Transpose convolution.
그런데 만약 stride가 2라면, 차이가 나게 된다.
Stride 1과 달리, xyz가 1개씩이 아니라 2개씩 움직였다. 또한, 00xyz0 상태에선 2칸을 움직일 수 없기에, 여기에서 멈췄다.
아무튼, stride 2의 transpose convolution은, normal convolution과는 완전히 다른 연산이 되었음을 알 수 있다.
이러한 Upsampling과, 일반적으로 알려진 Downsampling을 진행하면서 공간 스케일을 줄인다.
또한, 모든 픽셀에 Cross-entropy를 계산하여, 네트워크 전체를 end-to-end로 학습시킨다.
여기에 Localization을 더한다.
하나의 FC를 더 넣는데, 이는 Box coordinate를 하는 역할을 맡는다. 따라서, width, height, x, y의 4개 값을 지닌다.
하나의 FC Layer가 더해진 것을 볼 수 있다. 위의 식은 Score을 반환하고, 밑의 식은 Bounding box의 좌표를 반환하며, 각각 하나씩 2개의 Loss를 지닌다. 이들은 완전한 Supervised이기에, 학습 이미지에는 카테고리 레이블과, 해당 객체의 Bounding box ground Truth(GT)를 동시에 가지고 있어야 한다.
이 두 개의 Loss를 합한 multitask loss를 이용해 gradient를 구하려면, 네트워크 가중치 각각의 미분값(Scalar)을 계산해야 한다. 이 Loss 2개를 모두 최소화하는 것이 목표이며, 이 두 loss의 가중치를 조절하는 parameter가 존재하는데, 이 하이퍼파라미터를 조절하는 것은 매우 어렵다. 따라서, loss가 아니라 다른 지표로 성능을 보는 경우도 있다.
사람 포즈 확인의 예시. 14개의 관절 위치 좌표값이 나오며, 이 14개의 점에 대해 regression loss를 계산하고 bakprop으로 학습한다.
다음은 Object detection. 이는 이미지가 몇 개인지 예측이 불가하기에, regression을 통한 해결은 어렵다.
슬라이딩 윈도우 : 각각 진행해가면서, 개인지 고양인지 판별.
Object가 몇 개인지, 어디 존재하는지, 크기가 얼마나 되는지 확인이 불가.
Region proposal : 객체가 있을 법한 후보를 찾아낸다. 1000개의 region을 selective search을 통해 찾아낸다.
'뭉친' 곳을 찾아내며, 이 region proposal은 CNN의 입력으로 해서 추출.
여기에 쓰이는게 R-CNN, Faster R-CNN, YOLO/SSD다.
이 각각에 대해서는 이미 정리한 바가 있다.
R-CNN & Faster R-CNN : https://jwgdkmj.tistory.com/235
욜로 : https://jwgdkmj.tistory.com/232
R-CNN : Selective Search 알고리즘을 통해, ROI(Region of Interest)를 추출.
이를, CNN에 훈련을 시키기 위해 input size를 맞춘 다음, CNN을 통과시켜 SVM을 통해 Classificatino을 한다.
다음으로, Linear Regression을 통해 Bounding box도 Loss값을 계산, 두 개의 Loss가 최소가 되는 방향으로 훈련시킨다.
그러나 이는 계산비용이 많고, 용량이 드며, 학습이 느리고, Test time이 느리며, 학습이 되지 않는 Region proposal이 존재한다.
ROI영역에서 CNN을 진행했으니 계산비용이 많으니까, Fast R-CNN에서는 Input image에 대해 한번만 cnn을 한다.
다음으로, feature map에서 region proposal을 찾아낸다.
이 때, ROI 영역에 모두 다른 issue가 발생한다. 일반적인 방법으론 Pooling을 통해 input size를 맞추는데, 여기에선 ROI가 각각 다르기에, 일반적인 풀링으로는 input size가 맞춰지지 않는다.
따라서, ROI 풀링이라는 방법으로 Feature map의 사이즈를 통일.
Fast R-CNN의 핵심인 RoI Pooling은 RoI 영역에 해당하는 부분만 max-pooling을 통해 feature map으로부터 고정된 길이의 저차원 벡터로 축소하는 단계를 의미한다. RoI Pooling에 대한 자세한 내용은 아래의 그림을 참고하며 설명하도록 하겠다.

위의 h*w의 영역이 바로 CNN의 output인 feature map에서 RoI 영역에 해당한다. 이 RoI 영역은 CNN을 통과한 feature map에 selective search 기반의 region proposal을 통해 추출된다.
이렇게 정의된 RoI(h*w)를 H*W의 고정된 작은 윈도우 사이즈로 나누고, 나눠진 영역에서 max-pooling을 적용하면 결과값으로 항상 H*W 크기의 feature map이 생성된다. 이런 pooling을 하는 이유는, 다 제각각의 크기인 RoI 영역을 동일한 크기로 맞춰 fc(fullly connect) layer로 넘기기 위함이다.

위의 이미지를 보면 RoI 영역 안의 max-pooling 영역이 모두 동일하지 않음을 알 수 있다. 그럼에도 불구하고 고정된 길이의 벡터로 만드는 것이 RoI pooling layer의 역할이다.
이렇게 RoI pooling layer를 통해 전부 동일한 크기가 된 output들은 fully connected layer를 거쳐 softmax classifcation과 bounding box regression이 수행된다.
다음으론, FC Layer을 통과해 Classficatoin에 대한 Loss값을 계산 후, 바운딩 박스에 대한 Loss값도 계산.
마지막으로 Faster R-cnn은, 이 Region proposal 역시 딥러닝으로 수행시키는 것.
Faster R-CNN은 Feature map을 만드는 CNN과 그 이후 classification + localization하는데 사용하는 CNN을 공유해서 사용하자는 아이디어에서 출발했다.
따라서 총 4개의 Loss function이 필요하다.
- RPN classify object / not object (binary classification)
- RPN regress box coordinates
- Final classification score (object classes)
- Final box coordinates
RPN은 Region Proposal Network을 의미한다.
Faster R-CNN에서는 총 9개의 anchor box를 사용하는데, Anchor box란 물체의 모양이 어떻게 생겼는지 모르니 서로 다른 비율의 Bounding Box를 만들고, 모두 시도를 해봐서 최적의 Bounding Box를 찾기 위해 사용하는 것이라 생각하면 된다.
물체가 있을 확률을 IoU(Intersection over Union)을 통해 계산한다.
내가 예측한 Boundnig Box의 크기와 실제 Groundtruth의 값을 비교해보는 것이다.
그림으로 Faster R-CNN을 나타내면 다음과 같다.
이 Region proposal Network(RPN)의 구조는 아래와 같다.
Mask R-CNN
Mask R-CNN은 Image segmentation을 수행하기 위해 고안된 모델이다.
Mask R-CNN은 기존의 Faster R-CNN을 Object detection 역할을 하도록 하고 각각의 RoI에 mask segmentation을 해주는 작은 FCN (Fully Convolutional Network)를 추가해주었다.
Faster R-CNN과 다른 점은 크게 3가지가 있다.
1. Faster R-CNN에 존재하는 “bounding box regression branch”에 병렬로 “object mask prediction branch” 추가.
2. ROI Pooling 대신 ROI Align 을 사용함.
3. Mask prediction 과 class prediction 을 decouple 함. (클래스 상관없이 masking)
Object mask prediction branch : 각 픽셀이 오브젝트에 해당하는 것인지 아닌지를 마스킹하는 네트워크(CNN)를 추가했다고 생각하면 된다.
ROI Align : 기존 Faster R-CNN에서 사용한 ROI pooling의 같은 경우 정확한 위치 정보를 담는 것이 크게 중요하지 않았기 때문에 픽셀 좌표 값이 소수점으로 나올 경우 먼저 각 좌표를 반올림 해준 후 Pooling을 거치는데, Pixel단위로 detection을 진행해야 하는 segmentation task에 대해서는 문제가 발생한다.
구조는 다음과 같다.
'버츄얼유튜버' 카테고리의 다른 글
Generative Models (0) | 2022.08.11 |
---|---|
Visualizing and Understanding (0) | 2022.08.10 |
RNN & LSTM (0) | 2022.07.30 |
여러 CNN 아키텍처(LeNet, GoogleNet, Alexnet, VGG, ResNet) (0) | 2022.07.28 |
Regularization (0) | 2022.07.27 |