Detection and Segmentation

·2024년 2월 12일

딥러닝 기초 이론

목록 보기
13/14

Sementic Segmentation

  • 이미지의 각 픽셀을 특정 클래스에 할당하는 과정을 말한다
  • 즉, 이미지에서 픽셀 수준에서 객체를 분리하고 분류하는 작업이다
  • 입력은 이미지이고 출력으로 이미지의 모든 픽셀에 카테고리를 정한다
  • 출력은 모든 픽셀에 대해서 그 픽셀이 "고양이, 잔디, 하늘, 나무, 배경"인지를 결정하는 것이다
  • Sementic Segmentation 에서도 Classification 처럼 카테고리가 있지만 이미지 전체에 카테고리 하나가 아니라 모든 픽셀에 카테고리가 매겨진다
  • semantic segmentation은 개별 객체를 구분하지 않는다
    • 예를 들어 겹쳐져 있는 소 두 마리를 각각 구별하지 못하고 소라는 것만 구별한다

이미지 삽입 p19

Fully Convolutional Network

  • 이미지의 각 픽셀에 대해 클래스 레이블을 예측하는 데 사용된다
  • FCN은 Fully Connected Layer를 1x1의 컨볼루션 레이어로 대체한다. 이렇게 하면 네트워크가 임의의 크기의 입력을 받아들일 수 있으며, 공간 정보를 유지하면서 픽셀 수준의 예측을 생성할 수 있다
  • 또한, FCN은 업샘플링을 통해 저해상도의 피쳐 맵을 입력 이미지와 동일한 해상도로 복원한다. 이는 디코딩 과정에서 중요한 세부 정보를 잃어버리는 것을 방지하며, 이를 통해 FCN은 픽셀 수준에서 정확한 세그멘테이션을 수행할 수 있다
  • FC-Layer가 없고 Convolution Layer 구성된 네트워크를 생각해볼 때 3 x 3 zero padding을 수행하는 Conv Layer들을 쌓아올리면 이미지의 공간정보를 손실하지 않는다
  • 이 네트워크의 출력 Tensor는 C x H x W 이다
    • C : 카테고리의 수
    • 출력 Tensor는 입력 이미지의 모든 픽셀 값에 대해 Classification Scores를 매긴 값이다
  • 이 네트워크를 학습시키려면 우선 모든 픽셀의 Classification loss를 계산하고 평균 값을 취한다. 그리고 기존처럼 back propagation을 수행하면 된다

문제점

  • 입력 이미지의 Spatial Size를 계속 유지시켜야 한다. 그래서 비용이 아주 크다
  • 가령 Convolution의 채널이 64/128/256일 수 있다. 이 네트워크에 고해상도의 이미지가 입력으로 들어오면 게산량과 메모리가 엄청 커서 감당할 수 없을 것이다

해결법

  • Feature Map을 Downsampling/Upsampling한다
  • Spatial resolution 전체를 가지고 Convolution 수행하기 보다 Original Resolution에서는 Conv layer는 소량만 사용한다
  • 그리고 Max pooling, Stride Convolution 등으로
    특징맵을 Downsample 한다
  • convolutions in downsampling을 반복한다
  • Classification Network와 구조가 유사해 보인다. 하지만 차이점은 Image Classification 에서는 FC-Layer가 있지만 여기에서는 Spatial Resolution을 다시 키운다
  • 결국 다시 입력 이미지의 해상도와 같아진다
  • 이 방법을 사용하면 계산 효율이 더 좋아진다. 이 방법을 통해 네트워크가 lower resolution을 처리하도록하여 네트워크를 더 깊게 만들 수 있다

Upsampling

nearest neighbor unpooling

이미지 삽입 p27

  • 입력은 2x2 그리드이고 출력은 4x4 그리드이다
  • 2x2 stride nearest neighbor unpooling은 해당하는 receptive field로 값을 그냥 복사한다

bed of nails unpooling

이미지 삽입 p27

  • 이 방법은 unpooling region에만 값을 복사하고 다른 곳에는 모두 0을 채워넣는다
  • 업샘플링 과정에서 위치 정보를 유지할 수 있어, 위치 정보가 중요한 작업에서 유용하게 사용될 수 있다
  • "a bed of nails" 이라고 불리는 이유는 zero region은 평평하고 non-zero region은 바늘처럼 뾰족하게 값이 튀기 때문이다

Max unpooling

이미지 삽입 p28

  • 각 unpooling과 pooling을 연관짓는 방법이다
  • downsampling시에는 Max pooling에 사용했던 요소들을 잘 기억하고 있어야 한다
  • Upsampling 시에 bed of nails upsampling과 유사하되 같은 자리에 값을 넣는 것이 아니라 이전 Maxpooling에서 선택된 위치에 맞게 넣어준다
  • 정리하자면, Low Resolution 특징 맵을 High Resolution 특징 맵으로 만들어 주는 것인데 이 때 Low Resolution 의 값들을 Maxpooling에서 선택된 위치로 넣어주는 것이다

Transpose Convolution

  • 이 방법은 "고정된 함수"이고 별도로 학습을 시키지는 않는다
  • 특징 맵을 Upsampling 할 때 어떤 방식으로 할지를 학습할 수 있다

이미지 삽입 p37

  • 여기에서는 내적을 수행하지 않는다
  • 우선 입력 특징맵에서 값을 하나 선택한다 (빨간색)
  • 예제에서 처럼 좌상단에서 뽑은 이 하나의 값은 스칼라 값이다
  • 이 스칼라 값을 필터와 곱한다 (3x3). 그리고 출력의 3x3 영역에 그 값을 넣는다
  • Transpose convolution에서는 필터와 입력의 내적을 계산하는 것이 아니라 입력 값이 필터에 곱해지는 가중치의 역할을 한다. 출력 값은 필터 * 입력(가중치) 이다

이미지 삽입 p38

  • Upsampling 시에는 입력에서 한 칸씩 움직이는 동안 출력에서는 두 칸씩 움직인다
  • 왼쪽 입력의 파란색은 스칼라 값이다. 이 값을 필터에 곱한다
  • 이렇게 가중치가 곱해진 필터 값을 출력 값에 넣어준다
  • 출력에서는 Transpose convolution 간에 Receptive Field가 겹칠 수 있다. 이렇게 겹치는 경우에는 간단하게 두 값을 더해준다
  • 이 과정을 반복해서 끝마치면 학습 가능한 upsampling을 수행한 것이다
  • Spatial size를 키워주기 위해서 학습된 필터 가중치를 이용한 것이다
  • stdie를 input/output간의 크기의 비율로 생각하면 이 예제는 stride 1/2 convolution 이라고 볼 수 있다. input : output = 1 : 2 이기 때문이다

Classification + Localization

  • 이미지 내의 특정 개체를 분류하고 개체가 어디에 있는지 바운딩 박스라는 사각형 영역으로 표현한다
  • Classification + Localization 문제는 Object Detection 문제와는 구별된다
    • localization 문제에서는 이미지 내에서 내가 관심있는 객체가 오직 하나 뿐이라고 가정한다. 기본적으로 이미지 내에 객체 하나만 찾아서 레이블을 매기고 위치를 찾아낸다
    • 이 Task를 바로 Classification + Localization라고 한다
  • 이 문제의 구조는 FC-Layer를 2개 가지고 있다
    • 하나는 Class score로 연결되어서 카테고리를 결정한다
    • 다른 하나는 4개의 원소를 가진 vector와 연결되어 있다
    • 이 4개의 출력 값은 x, y 좌표, width, height로 bounding box의 좌표값을 나타낸다
  • 이 구조는 Loss function이 두 가지이다
    • 우선 우선 Class scores를 예측하기 위한 Softmax loss가 있다
    • 그리고 Ground Truth Bbox와 예측한 Bbox 사이의 차이를 측정하는 Loss도 있다
      • L2 Loss로 BBox Loss를 가장 쉽게 디자인할 수 있다
      • 또는 L1이나 smooth L1을 사용해도 된다
    • 이 Loss들은 모두 예측한 Bbox와 GT Bbox 좌표간의 차이에 대한 regression loss이다
  • Bbox와 같이 이미지 내의 어떤 위치를 예측한다는 아이디어는 아주 다양한 문제에도 적용해 볼 수 있다
    • 그 중하나는 human pose estimation이다

Human Pose Estimation

  • human pose estimation 문제 에서는 사람 이미지가 입력으로 들어간다. 출력은 이 사람의 각 관절의 위치이다
  • 이 네트워크는 사람의 포즈를 예측한다. 사람의 팔다리가 어디에 있는지를 예측하는 것이다
  • Data sets은 14개의 관절의 위치로 사람의 포즈를 정의한다
  • 이 네트워크의 입력은 사람 이미지이다. 그리고 네트워크의 출력은 각 관절에 해당하는 14개의 좌표 값이다
  • 예측된 14개의 점에 대해서 regression loss를 계산하고 backprop으로 학습시킨다
  • 가장 심플하게 L2 loss를 사용하기도 하고 또는 다양한 regression losses를 적용할 수 있다

Object Detection

  • 객체 탐지는 이미지나 비디오 안에서 특정 객체의 위치를 찾고, 그 객체의 종류를 분류하는 작업을 말한다
  • Object Detection 문제에서도 고정된 카테고리가 있다
  • Object Detection의 task는 입력 이미지가 주어지면 이미지에 나타나는 객체들의 Bbox와 해당하는 카테고리를 예측한다
  • classification plus localization와는 조금 다르다. 왜냐하면 예측해야 하는 Bbox의 수가 입력 이미지에 따라 달라지기 때문이다
  • Object detection은 Localization과 꽤나 다르다. 왜냐하면 Detection 문제에서는 이미지마다 객체의 수가 달라지며, 이를 미리 알 수 없기 때문이다

Sliding window

  • Semantic segmentation에서 작은 영역으로 쪼갰던 아이디어와 비슷한 방법을 사용한다
  • Sliding window를 이용하려면 입력 이미지로부터 다양한 영역을 나눠서 처리해야 한다. 문제는 '어떻게 영역을 추출할지'이다
  • 이미지에 Objects가 몇 개가 존재할지, 어디에 존재할지를 알 수가 없다. 그리고 크기가 어떨지, 어떤 종횡비로 표현해야 할지도 모른다
  • 따라서 이런 brute force 방식의 sliding window를 하려면 너무나 많은 경우의 수가 존재한다
  • 작은 영역 하나 하나마다 거대한 CNN을 통과시키려면 이 때의 계산량은 도무지 다룰 수 조차 없다

Region Proposals

  • Region Proposal Network는 Object가 있을법한 많은 Bbox를 제공한다
  • Region Proposal Network는 이미지 내에 뭉텅진(blobby) 곳들을 찾아낸다. 이 지역들은 객체가 있을지도 모르는 후보 영역들이다
  • 이 알고리즘은 비교적 빠르게 동작한다
  • Region Proposal을 만들어낼 수 있는 방법에는 Selective Search가 있다
  • Selective Search은 슬라이드에 적힌 1000개가 아니라 2000개의 Region Proposal을 만들어 낸다
    • CPU로 2초간 Selective Search를 돌리면 객체가 있을만한 2000개의 Region Proposal을 만들어낸다
    • 이미지에 객체가 존재한다면 Selective Search의 Region Proposal 안에 속할 가능성이 높다
  • Region Proposal Networks를 적용하고 객체가 있을법한 Region Proposal 을 얻어낸다. 그리고 이 Region Proposals을 CNN의 입력으로 한다. 이 방법을 사용하면 계산량을 다루기 훨씬 수월하다
  • 이미지 내에서 가능한 객체 후보 영역을 효과적으로 찾아내는 방법이다
  • 과잉 분할(Over-Segmentation)
    • 이미지를 의미있는 지역으로 과잉 분할하는 것으로 시작한다
    • 이는 색상, 텍스처 등의 비슷한 특성을 가진 픽셀을 그룹화함으로써 수행된다
  • 영역 병합(Region Merging)
    • 분할된 영역들을 점차 합쳐나가며 후보 영역을 생성한다
    • 여기서는 다양한 크기, 모양, 위치의 영역들을 고려하기 위해, 다양한 비율로 병합을 수행한다
  • 객체 후보 생성(Object Proposals)
    • 병합 과정에서 생성된 모든 영역들을 객체 후보로 사용한다

R-CNN

  • 이미지가 주어지면 Region Proposal을 얻기 위해 Region Proposal Network를 수행한다
  • Region Proposal은 Region of Interest (ROI) 라고도 한다
  • Selective Search를 통해 2000개의 ROI를 얻어낸다
  • 하지만 여기에서는 각 ROI의 사이즈가 각양각색이라는 점이 문제가 될 수 있다
  • 추출된 ROI로 CNN Classification을 수행하려면 FC-Layer 등으로 인해서 보통 같은 입력사이즈로 맞춰줘야만 한다
  • 따라서 Region proposals을 추출하면 CNN의 입력으로 사용하기 위해서는 동일한 고정된 크기로 변형시켜야 한다
  • 다시말해 Region proposals을 추출하면 고정된 사이즈로 크기를 바꾼다. 그리고 각각의 Region Proposals을 CNN에 통과시킨다
  • RCNN의 경우에는 ROI들의 최종 Classification에 SVM을 사용했다
  • RCNN은 Region Proposals을 보정하기 위한 regression 과정도 거친다
  • Selective Search의 Region Proposals이 대게는 정확하지만 그렇지 못한 경우도 있기 때문이다
  • RCNN은 BBox의 카테고리도 예측하지만, BBox를 보정해줄 수 있는 offset 값 4 개도 예측한다. 이를 Multi-task loss로 두고 한번에 학습한다

이미지 삽입 p71

R-CNN의 문제점

  • 여전히 계산 비용이 높다
    • R-CNN은 2000개의 Region proposals이 있고 각각이 독립적으로 CNN입력으로 들어간다
  • 학습이 되지 않은 이 Region Proposal은 앞으로 문제가 될 소지가 많다
  • R-CNN은 학습과정 자체가 상당히 오래걸린다
    • R-CNN의 (original) 구현을 살펴보면 CNN에서 나온 Feature를 디스크에 덤핑시킨다. 용량이 엄청나다
    • 이미지당 2000개의 ROIs를 forward/backwrad pass를 수행하기에 시간이 오래 걸린다
    • 전체 학습시간이 81시간이 걸렸다고 한다
  • Test Time도 아주 느리다
    • 이미지 한 장당 대략 30초가 걸린다
    • 각 Region proposals 마다 CNN을 수행해야 하므로 수천 번의 forward passes가 요구된다

Fast R-CNN

  • Fast R-CNN은 R_CNN의 문제들을 상당부분 해결하였다
  • Fast R-CNN도 R-CNN과 시작은 같다. 하지만 Fast R-CNN에서는 각 ROI마다 각각 CNN을 수행하지 않는다. 전체 이미지에 CNN을 수행한다
  • 그 결과 전체 이미지에 대한 고해상도 Feature Map을 얻을 수 있다
  • Fast R-CNN에는 여전히 Selective Search같은 방법으로 Region proposals을 계산한다
  • 이제부터는 이미지에서 ROI를 뜯어내지 않는다. CNN Feature map에 ROI를 Projection 시키고 전체 이미지가 아닌 Feature map에서 뜯어온다
    • 이제는 CNN의 Feature를 여러 ROIs가 서로 공유할 수 있다
  • 그 다음 FC-layer이 있다. FC-Layer는 고정된 크기의 입력을 받는다. 따라서 CNN Feature Map에서 뜯어온 ROI는 FC-Layer의 입력에 알맞게 크기를 조정해 줘야한다
    • 학습이 가능하도록 미분가능한 방법을 사용해야 한다
    • 그 방법이 바로 ROI pooling layer이다
  • Feature Map에서 뜯어낸 ROI의 크기를 조정하고(warped)나면 FC-Layer의 입력으로 넣어서 Classification Score와 Linear Regression Offset을 계산할 수 있다
  • Fast R-CNN을 학습할 때는 두 Loss를 합쳐 Multi-task Loss로 Backprop를 진행한다
  • 이 방법을 통해 전체 네트워크를 합쳐서(jointly) 동시에 학습시킬 수 있다

이미지 삽입 p79

이미지 삽입 p81

R-CNN vs SPP vs Fast R-CNN 비교

이미지 삽입 P84

  • Train time 에는 fast R-CNN이 10배 가량 더 빠르다
    • Faster R-CNN은 Feature map을 서로 공유하기 때문이다
  • Test time에는 fast R-CNN은 정말 빠르다
    • Fast R-CNN은 정말 빠르기 때문에 Region Proposal을 계산하는 시간이 대부분이게 된다
    • 2000개의 Region Proposal을 Selective Search로 계산하는데 2초 가량 걸린다
    • Region Proposals을 계산한 이후 CNN 을 거치는 과정은 모든 Region Proposals이 공유하기 때문에 1초도 안 걸린다
  • 따라서 fast R-CNN은 Region Proposal을 계산하는 구간이 병목 현상을 일으킨다

Faster R-CNN

  • 해결해야하는 문제는 region proposals을 계산하는 과정이 병목이라는 점이다
  • Faster R-CNN은 네트워크가 region proposal 을 직접 만들 수 있다
  • 입력 이미지가 있다고 했을 때 이 입력 이미지 전체가 네트워크로 들어가서 Feature map 을 만든다
  • Faster R-CNN은 별도의 Region proposal network가 있다
    • RPN(Region Proposal Network)은 네트워크가 Feature Map을 가지고 Region proposals을 계산하도록 한다
  • RPN을 거쳐 Region Proposal을 예측하고나면 나머지 동작은 fast R-CNN과 동일하다
    • Conv Feature map에서 Region proposals을 뜯어내고 이들을 나머지 네트워크에 통과시킨다
    • 그리고 multl-task loss를 이용해서 여러가지 Losses를 한번에 계산한다
  • Faster R-CNN은 4개의 Losses를 한번에 학습한다
  • RPN에는 2가지 Losses가 있다
    • 우선 한가지는 이곳에 객체가 있는지 없는지를 예측한다
    • 그리고 나머지 Loss는 예측한 BBox에 관한 것이다
  • Faster R-CNN의 최종단 에서도 두 개의 Losses가 있다
    • 하나는 Region Proposals의 Classification 을 결정한다
    • 다른 하나는 하나는 BBox Regression 이다
      • Region Proposal을 보정해주는 역할이다

Faster R-CNN의 성능

이미지 삽입 p87

  • Faster R-CNN은 정말로 엄청 빠르다
    • 빨라진 가장 큰 이유는 네트워크 밖에서 계산했던 Region proposals의 병목을 제거했기 때문이다
  • Faster R-CNN에서 흥미로운 점은 Region proposals 자체도 학습되었기 때문에 RPN과 우리의 새로운 데이터 사이의 간극이 존재할 수도 있을 것이다
    • 이 경우에는 새로운 데이터에 맞게 region proposal을 새롭게 학습시키면 된다

YOLO (You Only Look One) / SSD (Single Shot Detectoin)

이미지 삽입 p89

  • 이들의 주요 아이디어는 각 Task를 따로 계산하지 말고 하나의 regression 문제로 푸는 것이다
  • Feed forward를 오로지 한 방향으로 수행하는 네트워크이다
  • 거대한 CNN을 통과하면 모든 것을 담은 예측값이 한번에 나온다
  • 입력 이미지가 있으면 이미지를 큼지막하게 나눈다
    • 예로 7x7 grid로 나눌 수 있다
  • 각 Grid Cell 내부에는 Base BBox가 존재한다
    • 위 이미지에서는 Base BBox가 세 가지 있다
    • 실제로는 세 개 이상 사용한다
  • 각 grid cell에 대한 BBoxes를 기반으로 예측을 수행한다
  • 우선 BBox의 offset을 예측할 수 있다
    • 실제 위치가 되려면 base BBox를 얼만큼 옮겨야 하는지를 뜻한다
  • 그리고 각 BBox에 대해서 Classification scores를 계산해야 한다
  • 이 BBox 안에 이 카테고리에 속한 객체가 존재할 가능성을 의미한다
  • 네트워크에 입력 이미지가 들어오면 7 x 7 Grid마다 (5B + C) 개의 tensor를 가진다
    • 여기에서 B는 base BBox의 offset (4개)과 confidence score(1개)로 구성된다
    • C는 C개의 카테고리에 대한 Classification score이다
  • 정리하면, 네트워크이 입력은 이미지이고 출력은 3-dim tensor이다. 그리고 이를 거대한 CNN으로 한번에 학습시킨다
  • 이런 방식은 Faster R-CNN에서 쓰는 RPN이 이와 유사하다
    • 결국은 둘 다 Regression + Classification 문제를 푸는 것이다
  • R-CNN 계열, Single-Shot 계열 이라고 나눠도 분명 겹치는 아이디어들이 있다
    • Faster R-CNN은 RPN으로 먼저 Regression 문제를 풀고 ROI단위로 Classification을 하는 방식이다
  • 반면 single shot methods는 단 한번의 forward pass만으로 문제를 풀어버린다

Instance Segementation

  • 입력 이미지가 주어지면 객체 별로 객체의 위치를 알아내야 한다. 하지만 객체별로 BBox를 예측하는 것이 아니라 객체 별 Segmentation Mask를 예측해야 한다
    • 이미지에서 각 객체에 해당하는 픽셀을 예측해야 하는 문제이다
  • Instance Segmentation은 Semantic Segmentation과 Object Detection을 섞은 것이다
    • Object Detection 문제 처럼 객체별로 여러 객체를 찾고 각각을 구분해 줘야한다
      • 같은 클래스의 객체라도 개별적으로 구분한다
    • 그리고 각 픽셀이 어떤 객체에 속하는지를 전부 다 결정해 줘야한다

Mask R-CNN

이미지 삽입 p95

  • Mask R-CNN은 여러 스테이지를 거친다
  • Mask R-CNN은 처음 입력 이미지가 CNN과 RPN을 거친다
    • 여기까지는 Faster R-CNN과 유사하다
  • Fast/Faster R-CNN에서 했던 것 처럼 특징 맵에서 RPN의 ROI만큼을 projection한다
  • 그 다음 단계는 Faster R-CNN에서 처럼 Classification/BBox Regression을 하는 것이 아니라 각 BBox마다 Segmentation mask를 예측하도록 한다
  • RPN으로 뽑은 ROI 영역 내에서 각각 semantic segmentation을 수행한다
  • Feature Map으로부터 ROI Pooling(Align)을 수행하면 두 갈래로 나뉜다
  • 위 이미지에서 상단에 보이는 첫 번째 갈래는 Faster R-CNN과 유사하게 생겼다
  • 첫 번째 갈래에서는 각 Region proposal이 어떤 카테고리에 속하는지 계산한다. 그리고 Region Proposal의 좌표를 보정해주는 BBox Regression도 예측한다
  • 하단의 두 번째 갈래는 Semantic Segmentation을 위한 미니 네트워크같이 생겼다
    • 각 픽셀마다 객체인지 아닌지를 분류한다

이미지 삽입 p96

출처 및 참조

https://youtu.be/nDPWywWRIRo?si=HgzSXjZBgfmYtvvP

profile
공부 기록

0개의 댓글