티스토리 뷰

728x90

이번 포스팅은 standford university의 cs231 lecture 9EECS 498.008 / 598.008 강의의 Lecture 13 Object Detection, Lecture 14 Object Detectors, Lecture 15 Image Segmentation을 참고했습니다.

 

 

cs231n 강의를 몇 개월째 공부하고 있지만(언제 끝낼거니^^), 개인적으로 후반부터는 EECS의 강의와 강의 자료가 더 상세히 설명되어 있고, 좋다고 느껴졌습니다. cs231n의 기원과 원천은 결국 Justin의 영혼에서 비롯된 것이 아닌가? 하는 생각. 아무튼 위 4개의 슬라이드를 바탕으로 정리한 글이며, 특히 이 글에서 첨부된 이미지는 강의 자료를 바탕으로 직접 제작한 PPT 이미지라서 이미지 사용에 관련해선 댓글로 물어봐주시면 감사하겠습니다.

 


컴퓨터 비전에서 주요 테스크로 이 네 가지를 뽑을 수 있습니다. 분류, 픽셀로만 분류하는 Semantic Segmentation, 객체를 탐지하는 Object Detection, 여러 인스턴스를 픽셀 단위로 분류하는 Instance Segmentation이 있습니다.

먼저 Object Detection을 살펴 보겠습니다.Object Detection을 공부할 때 나오는 개념인 Backbone, Neck, Head 개념입니다.

 

입력은 하나의 RGB 이미지가 들어갑니다. 그럼 출력값으로 각 객체를 예측하는 탐지된 객체의 집합을 얻게 됩니다. 카테고리를 아는 세트로부터 고정된 라벨을 분류하는 것이고, x와 y, 너비 w, 높이 h의 네 가지 변수로 Bounding box를 구하는 것입니다.

해당 작업의 과제로는 결과가 여러 개일 때, 결과가 여러 종류일 때 또한 이미지가 클 때의 경우입니다.

 

Bounding box는 크게 두 종류로 나뉩니다. world coordinate system의 3개의 축을 기저로 정렬된 박스인 AABB가 있는 반면, OBB는 기본적으로 방향이 다른 AABB로 기저 벡터와 평행하지 않게 이뤄진 평행 육면체로 볼 수 있습니다. object가 축과 다른 방향으로 놓여있을 때 빈공간이 많이 생기게 되어 효율이 급격하게 떨어지는데, 이런 경우에 OBB를 사용할 수 있습니다.

또한 객체 탐지의 종류로 Modal과 Amodal이 있는데, 객체에서 보이는 부분만 탐지하는 Modal과 가려진 부분도 포함한 객체의 전체 범위를 탐지하는 Amodal이 있습니다.

 

그리고 잘 탐지되었는지를 비교하기 위해 해당 식을 사용해 구할 수 있습니다.

IoU는 object detection 모델을 평가할 때 ground truth와 prediction Bbox 사이의 교차하는 영역을 계산합니다. 이를 통해 실제 값과 예측 값이 얼마나 겹치는지를 따져 잘 예측했는지 성능을 평가하는 지표입니다.

 

Detection의 과정을 먼저 살펴보면, 앞은 ImageNet으로 사전 훈련한 모델로 전이 학습을 시도하고, class가 무엇인지를 찾는 “What”과 어디에 있는지 찾는 “Where”을 통해 Loss를 따로 계산합니다. 그리고 합하여 최종 Loss를 구합니다.

Detection의 문제로는 이미지 안에 객체가 하나가 아닌 여러 개라는 점입니다.

 

객체를 탐지하기 위한 분류와 회귀 이외 다른 접근법으로 Region proposal가 있습니다. 이는 쉽게 말하면 객체가 있을 것 같은 영역을 모두 잡아내는 것입니다. 예를 들면 blob에 기반한 영역을 찾을 수 있습니다. 특징으로는 class-agnostic하다는 점입니다. 클래스와 무관하게 객체가 있을 것 같으면 모두 탐지하기 때문입니다. 이는 매우 속도가 빠르다는 장점이 있지만 정확도에는 별로 기여하지 않습니다.

이는 크게 두 가지 방법이 존재합니다.

 

첫 번째는 Sliding window입니다.

이미지의 다양한 crop을 CNN에 적용하면 CNN은 각 crop을 object 또는 background로 분류합니다. 여기서 생각해야 될 점은 최종 box가 몇 개가 나오냐인데요. 이미지의 크기, 박스의 크기를 고려하여 최종 box의 수는 아래의 식으로 정리되며, 만약 800*600 이미지라면 58M개의 박스가 생깁니다. 이를 모두 evaluate 할 수 없습니다. 또한, 고정된 window 사이즈로 각기 다른 객체를 탐지하기엔 어려움이 따르기도 합니다.

 

다른 방법으로 Selective search가 있습니다. 이는 Exhaustive search와 Segmentation의 방식을 결합하여 보다 뛰어난 후보 영역을 선정합니다. Exhaustive search는 후보가 될만한 영역을 조사하는 방법이고 Segmentation은 색, 모양, 무늬 등 다양한 기준 등을 그룹화하여 고려합니다. 객체가 다른 크기를 가졌어도 계층 구조를 파악할 수 있는 바텀업 방법을 사용합니다.

이미지로 살펴보면, 초기에 sub-segmentation 과정을 수행하여 각 객체가 1개의 영역에 할당될 수 있도록 많은 초기 영역을 생성합니다. 두 번째로는 작은 영역을 반복적으로 큰 영역으로 통합합니다. 이 과정을 1개의 영역이 남을 때까지 반복합니다. 마지막으론 통합된 영역을 바탁으로 후보 영역을 만듦니다.

 

이제 Detector를 살펴보겠습니다. 2 stage는 Regional proposal과 classification이 순차적으로 이뤄지며, 1 stage는 동시에 이뤄집니다.

 

 


R-CNN

먼저 R-CNN입니다.

 

각 영역을 분류합니다. 여기서의 R은 Region으로 이를 CNN의 feature(입력값)로 활용하여 Object Detection을 수행하는 신경망이라는 의미를 담고 있습니다.

 

그림을 통해 하나씩 살펴보겠습니다. 크게는

  1. 이미지를 입력합니다.
  2. 카테고리와 무관하게 객체의 영역을 찾는 Region proposal이 수행됩니다.
  3. Proposal된 영역으로부터 고정된 크기의 feature vector를 warping과 cropping의 과정을 거쳐 CNN의 입력으로 사용합니다.
  4. CNN을 통해 나온 feature map을 활용하여 SVM을 통해 분류합니다.
  5. bounding box regression을 진행합니다.

 

여기서 bounding box regression의 과정을 더 살펴보겠습니다. $p_x, p_y, p_w, p_y$를 가질 때 영역이 제안됩니다. 제안된 영역을 수정하기 위해 변환을 적용합니다. $x$와 $y$ 좌표는 scale-invaraint한 translation을 진행합니다. 두 번째는 너비 $w$와 높이 $h$에 log space transformation을 적용합니다. 따라서 예측된 박스의 좌표 $b_x, b_y, b_w, b_y$를 얻습니다.

 

결국 얻고자 하는 것은 trasnformation의 함수입니다. 이 함수를 알아야 제안된 박스와 실제 박스와의 차이를 줄일 수 있기 때문입니다. 해당 식에서 transformation 함수는 $\phi$가 학습한 CNN 레이어에서 구한 feature vector이며, $w$가 학습 가능한 weight vector입니다.

 

해당 과정은 모든 output에 적용되는 것이 아니라, IoU가 일정 threshold 이상인 값에 대해서만 진행하게 됩니다. 논문에선 0.6으로 지정했습니다.

 

이 과정을 다시 한 그림으로 보면 이렇습니다. Test time에서도 과정은 동일합니다. 두 가지 문제점이 있다면, CNN은 오버랩 된 box를 출력한다는 점과 임계점을 어떻게 정하는지입니다.

 

Object detector는 많은 오버랩 된 detection 를 출력해서 이중 좋은 하나를 고르기 위해 사용하는 알고리즘이 Non-Max suppression입니다. 따라서 NMS를 사용해서 raw detection을 사후 처리하는 것입니다.

 

가장 높은 점수의 box를 고르고, IoU가 임계점을 넢는 낮은 점수의 box를 제거 합니다. 만약 box가 남아 있으면 1로 돌아가서 반복합니다. 이 방법은 object가 많이 겹치는 경우, 좋은 box를 제거할 수도 있다는 단점이 있습니다.

 

mAP는 Mean Average Precision으로 PR 곡선에서 아래 영역을 의미합니다.

 


Fast R-CNN

기존 R-CNN의 문제점은 매우 느리다는 점입니다. 2천개의 Region proposal이 이뤄지면, 2천번 CNN에 넣어야 합니다. 매우 느립니다. 이를 해결하기 위해 CNN과 warping의 순서가 뒤바뀝니다.

전체 이미지를 CNN에 통과시켜 feature map을 추출합니다. 그리고 R-CNN에서와 마찬가지로 Selective Search를 통해 RoI를 찾습니다. Selective Search로 찾았던 RoI를 feature map크기에 맞춰서 projection시킵니다. projection시킨 RoI에 대해 RoI Pooling을 진행하여 고정된 크기의 feature vector를 얻습니다.

앞 과정에서 얻은 feature vector는 FC layer를 통과한 뒤, 두 브랜치로 나뉩니다. 하나는 softmax를 통과하여 RoI에 대해 object classification을 진행하고, 하나는 bounding box regression을 통해 selective search로 찾은 box의 위치를 조정합니다.

 

Two branches of FC layer

  • category softmax layer branch: softmax를 통과시켜 해당 rol이 어떤 물체인지 classification함
  • category-specific bounding box regression branch: bounding box regression을 통해서 selective search로 찾은 bbox의 위치를 조정함

 

왜 더 'Fast' 할까요? 대부분의 계산은 아래 Backnone network에서 일어나는데, 전체 이미지를 바로 CNN에 통과 시키면 오버랩 된 region proposals에 대해 반복적으로 계산할 필요없이 한번 계산하면 끝나기 때문입니다.

 

Per-region network에 해당되는 CNN은 상대적으로 가볍고 작습니다. 한번 계산한 값들을 region proposals에 공유 할 수 있기 때문에 반복적인 계산 과정이 필요없게 됩니다.

 

 

그렇다면 어떻게 features를 crop시킬까요? backbone까지 backprop이 되어야 하기 때문에 미분 가능하도록 crop시켜야합니다.

 

 

Fast R-CNN 은 기본 R-CNN 네트워크와 다릅니다. 하나의 컨벌루션 feature 추출만 있습니다. 만약에 640 * 480 * RGB 크기의 이미지 입력을 취하고 Backbone network가 512 * 20 * 15 feature map에 매핑합니다. 출력 행렬을 보면 너비와 높이가 입력 이미지보다 정확히 32배 작다는 것을 알 수 있습니다. 이는 모든 RoI가 이 요소로 축소되어야 하기 때문에 중요합니다.

하지만 입력 이미지의 RoI는 32로 나눌 수 없습니다. 32로 나누어 떨어지는 자연수만 20 * 15의 grid에서 의미가 있게 됩니다. 따라서 feature map의 좌표 Quantization 과정이 요합니다. 이는 실수 집합에서 정수로 입력을 제한하는 프로세스입니다. RoI는 feature map의 grid 위에 정확히 올라오지 않습니다. 그리드의 일부 셀이 분할될 것입니다.

 

따라서 Quantization 이 행하는 작업은 모든 결과를 행렬에 배치하기 전에 내림하는 것입니다. 이 과정은 데이터가 손실되었다고 볼 수 있습니다. 여기까지가 RoI를 feature map에 mapping한 과정이고 이제 pooling을 수행할 수 있습니다.

 

다시 한 번 편의를 위해  RoI 풀링 레이어의 크기를 선택할 것이지만 크기가 다를 수 있습니다. RoI 풀링은 왜 적용할까요? RoI 풀링 레이어 다음에는 크기가 고정된 FC 레이어 가 있습니다. RoI의 크기가 다르기 때문에 동일한 크기로 풀링해야 합니다. 여기선 512 * 2 * 2으로 풀링해야 합니다. 위 이미지에서 RoI 크기를 알 순 없지만 이를 딱봐도 2 * 2 크기로 나눌 수 없다는 것을 또 짐작할 수 있습니다. 

 

또 Quantization이 수행되며, 좌표를 다루지 않고 크기만 다루게 됩니다. 동일한 방법으로 내림한 뒤 max pooling을 적용해서 매핑합니다. 결과적으로 Region feature는 input region이 다른 크기를 가져도 항상 같은 사이즈여야 합니다.

 

둘을 비교해보면 각 region이 CNN의 fowrad pass를 거쳐야 해서 test time 시 매우 오래 걸렸습니다. 따라서 Fast R-CNN은 region proposal을 선택 전 CNN을 돌려 연산을 share하여 매우 빠르게 동작하게 했습니다.

 


Faster R-CNN

R-CNN의 네트워크는

  1. "Bounding box" 또는 이미지에서 가능한 객체의 위치를 생성하는 영역 제안 알고리즘
  2. 일반적으로 CNN을 사용하여 이러한 객체의 feature을 얻기 위한 feature 생성 단계
  3. 이 객체가 속한 클래스를 예측하는 분류 계층 및
  4. 객체 bouding box의 좌표를 보다 정확하게 만들기 위한 회귀 레이어
  5.  

해당 과정과 같습니다.

 

R-CNN과 Fast R-CNN 모두 CPU 기반 region proposal algorithms, 예를 들어 이미지당 약 2초가 걸립니다. CPU 계산에서 실행되는 Selective search algorithm을 사용합니다. Faster R-CNN 논문은 region proposal을 생성하기 위해 또 다른 컨볼루션 네트워크(RPN)를 사용하여 이 문제를 해결합니다.

 

이렇게 하면 이미지당 영역 제안 시간이 2초에서 10ms로 단축될 뿐만 아니라 region proposal 단계가 다음 detection 단계와 레이어를 공유할 수 있으므로 feature representation이 전반적으로 향상됩니다.

 

따라서 "Faster R-CNN"은 일반적으로 RPN을 영역 제안 알고리즘으로 사용하고 Fast R-CNN을 detector netowrk로 사용하는 detection파이프라인을 의미합니다.


RPN

 

RPN은 anchor라고 불리는 region box의 순위를 매기고 객체를 포함할 가능성이 가장 높은 항목을 제안합니다. Faster R-CNN의 기본 구성에는 이미지 위치에 9개의 앵커가 있습니다. 다음 그래프는 크기가 (640, 480)인 이미지의 9개의 앵커를 보여줍니다.

RPN(Region Proposal Network)의 출력은 결국 객체의 occurrence를 확인하기 위해 classifier와 regressor가 검사할 box/proposal의 묶음입니다. 더 정확히 말하자면, RPN은 앵커가 background 또는 foreground일 가능성을 예측하고 앵커를 구체화합니다.

 

 

Training - 4 Steps

  1. RPN은 독립적으로 훈련됩니다. 이 작업을 위한 백본 CNN은 ImageNet 분류 작업을 위해 훈련된 네트워크의 가중치로 초기화된 다음 영역 제안 작업을 위해 fine-tuning됩니다.
  2. Fast R-CNN detector network도 독립적으로 훈련됩니다. RPN 가중치는 고정되어 있으며 RPN의 제안은 Faster R-CNN을 교육하는 데 사용됩니다.
  3. 이제 RPN이 이 Faster R-CNN의 가중치로 초기화되고 지역 제안 작업에 맞게 fine tuning됩니다. 이번에는 RPN과 detector 사이의 공통 레이어에 있는 가중치는 고정된 상태로 유지되고 RPN에 고유한 레이어만 fine tuning됩니다. 이것이 최종 RPN입니다.
  4. 새로운 RPN을 사용하여 다시 한 번 Fast R-CNN 검출기가 fine tuning됩니다. 다시 말하지만, detector netowrk에 고유한 레이어만 fine tuning되고 공통 레이어 가중치는 고정됩니다.

 

이는 공유 컨벌루션 레이어가 있는 더 빠른 faster한 R-CNN 감지 프레임워크를 제공합니다.


FPN

다양한 규모의 객체를 detection하는 것은 특히 작은 object의 경우 어려운 일입니다. 이를 위해 동일한 이미지의 피라미드를 서로 다른 축척으로 사용하여 객체를 detection 할 수 있습니다. 그러나 여러 스케일 이미지를 처리하는 데는 시간이 많이 걸리고 메모리 요구량이 너무 높아 종단 간 동시에 훈련할 수 없습니다.

 

따라서 우리는 특히 속도가 문제가 되지 않는 경쟁에서 정확도를 최대한 높이기 위한 추론에만 사용할 수 있습니다.

 

또는 feature의 피라미드를 만들고 객체 탐지에 사용합니다. 그러나 정확한 객체 탐지에 효과적이지 않은 low-level 구조로 구성된 이미지 레이어에 더 가까운 feature가 매핑됩니다.

 

FPN (Feature Pyramid Network )은 정확도와 속도를 염두에 두고 이러한 피라미드 개념을 위해 설계된 feature extractor입니다. 

 

Faster R-CNN과 같은 detector의 feature extractor를 대체하고, 객체 탐지를 위한 일반 feature 피라미드보다 더 나은 품질 정보로 여러 feature map layer(multi-scale feature map)을 생성합니다.

 

오른쪽 그림을 보면 상향식 경로와 하향식 경로로 구성됩니다. 상향식 경로는 특징 추출을 위한 일반적인 컨볼루션 네트워크입니다. 위로 올라갈수록 공간 해상도가 감소합니다. 더 높은 수준의 구조가 감지될수록 각 계층의 의미론적 값이 증가합니다. 재구성된 레이어는 의미론적으로 강하지만 모든 다운샘플링 및 업샘플링 후에 객체의 위치가 정확하지 않습니다. 재구성된 레이어와 해당 feature map 사이에 측면 연결을 추가하여 감지기가 위치를 더 잘 예측할 수 있도록 돕습니다. 또한 훈련을 더 쉽게 하기 위해 건너뛰기 연결 역할을 합니다. ResNet이 수행하는 것과 유사합니다.

 

상향식 경로

상향식 경로는 ResNet을 사용하여 상향식 경로를 구성합니다. 그것은 많은 컨볼루션 모듈( i 에 대한 $conv_i$는 1에서 5와 같음)로 구성되며 각각에는 많은 컨볼루션 레이어가 있습니다. 위로 이동하면 공간 차원이 1/2로 줄어듭니다(즉, 보폭이 두 배). 각 컨볼루션 모듈의 출력은 $C_i$ 로 레이블이 지정 되고 나중에 하향식 경로에서 사용됩니다.

 

하향식 경로

1×1 컨볼루션 필터를 적용하여 채널 깊이를 줄입니다. 이것은 object prediction에 사용되는 첫 번째 feature map layer가 됩니다.

 

하향식 경로로 내려갈 때 가장 가까운 이웃 업샘플링을 사용하여 이전 레이어를 2만큼 업샘플링합니다. 상향식 경로의 해당 feature map에 1 × 1 컨볼루션을 다시 적용합니다. 그런 다음 요소별로 추가합니다.

 

병합된 모든 레이어에 3 × 3 컨볼루션을 적용합니다. 이 필터는 업샘플링된 레이어와 병합될 때 앨리어싱 효과를 줄입니다.

 

FPN 자체는 object detector가 아닙니다. 이것은 feature extractor이기 때문에 FPN으로 feature map을 추출하고 나중에 object detection을 위해 detector로 feed한다고 볼 수 있습니다. RPN은 feature map 위에 슬라이딩 윈도우를 적용하여 객체가 있는지 여부와 각 위치의 object bounding box를 예측합니다.

 

FPN 프레임워크에서 각 스케일 레벨에 대해 3×3 컨볼루션 필터가 feature map에 적용되고 object prediction 및 bounding box regression를 위한 별도의 1×1 컨볼루션이 뒤따릅니다. 이러한 3×3 및 1×1 컨볼루션 레이어를 RPN 헤드 라고 합니다 . 동일한 헤드가 모든 다른 스케일 수준의 feature map에 적용됩니다.

 

따라서 RPN과 Fast R-CNN이 포함된 네트워크를 설계할 수 있습니다. 다시 정리해보면, FPN에서는 feature map의 피라미드를 생성합니다. ROI를 생성하기 위해 RPN을 적용합니다. ROI의 크기에 따라 가장 적절한 스케일의 feature map layer를 선택하여 feature patch를 추출합니다. feature map을 선택하는 공식은 RoI의 너비와 높이를 기반으로 합니다.

 

결론적으로 RPN에 FPN을 배치하여 AR을 향상시켰습니다. 단순히 더 많은 anchor를 추가하는 것은 정확도 향상에 기여하지 못했고, 하향식 구조를 통해 의미론적 정보를 해상도를 복원하였습니다. 그러나 더 정확한 object 공간적 정보를 추가하기 위해 측면 연결이 필요했습니다. 이 feature가 위치를 더 잘 예측하도록 도왔습니다. 하향식 경로와 측면 연결이 정확도를 향상시켰습니다.

 

 

여기까지의 내용을 정리하면 위와 같습니다.

 


RetinaNet

 

이제 Single stage detector입니다.

 

첫 번째로 RetinaNet입니다. 아까 앞에서 보았던 FPN의 구조가 들어가 있습니다. RetinaNet 저자의 목표는 Convnet feature 계층 구조의 피라미드 모양을 자연스럽게 활용하면서 모든 규모에서 강력한 의미를 갖는 feature pyramid를 만드는 것이었습니다. 그리고 Focal Loss를 설계하여 object와 background가 이루는 class imbalance 문제를 해결하려 하였습니다.

 

아키텍처를 살펴보면,

  1. ResNet 은 깊은 feature 추출에 사용됩니다.
  2. FPN은 하나의 단일 해상도 입력 이미지에서 많은 multi-scale feature pyramid를 구성하기 위해 ResNet 위에 사용됩니다.

그리고 두 개의 subnet이 있습니다.

 

Classification subnet

A 앵커 및 K 객체 클래스 각각에 대해 각 공간 위치에서 객체가 존재할 확률을 예측합니다. 피라미드 수준에서 C 채널이 있는 입력 feature map을 가져오고, 서브넷은 4개의 3x3 conv 레이어를 적용합니다. 각 레이어에는 C 필터와 각각 ReLU 활성화가 뒤따릅니다. 마지막으로 시그모이드 활성화가 출력에 연결됩니다. Focal loss는 loss function으로 적용된다.

box regression subnet

사용된 분류망과 유사하지만 매개변수는 공유되지 않습니다. 객체가 존재하는 경우 앵커 박스를 기준으로 객체 위치를 출력합니다.

 

두 식을 살펴보면, 왼쪽이 α-Balanced CE Loss이고, 오른쪽이 Focal Loss (FL)입니다.

 

class imbalance를 해결하기 위한 한 가지 방법으로 balancing factor $\alpha$를 사용합니다. class 빈도의 역수에 의해 설정되는 하이퍼 파라미터입니다.

 

오른쪽식은 저자가 Cross Entropy를 재구성한 것입니다. 손실 함수는 easy example의 가중치를 낮추도록 재구성되어, hard negative에 훈련을 집중합니다. modulating factor $(1- pt )^γ$ 가 실험에서 [0,5]에서 테스트되는 교차 엔트로피 손실에 추가됩니다*.* 감마 계수가 가중치를 낮추는 속도를 조절하는 focusing parameter에 해당됩니다.

 

즉, Focal Loss는 잘 분류된 예에 매우 적은 가중치를 추가하고 잘못 분류되거나 하드 분류된 예에 큰 가중치를 추가합니다.

 


FCOS

 

Faster R-CNN부터 RetinaNet, SSD와 같은 네트워크는 anchor 기반 방법입니다. 이러한 방법은 이미지에 바둑판식으로 배열된 많은 사전에 설정된 anchor에 의존을 하는데요. 객체가 포함되어 있는지 예측하는 각 anchor와 좌표의 fine-tuning이 이뤄집니다.

그 이후 배율, 종횡비 및 앵커 수를 수동으로 조정해야 하는 사전 설정 앵커에 대한 요구 사항을 없애는데 관심을 집중했습니다. 이를 위해 이미지에 타일링된 점을 기반으로 객체를 직접 찾는 효과적인 방법인 FCOS가 제안되었습니다.

 

FCOS의 주요 특징은 다음과 같습니다.

  1. Anchor free:번거로운 IoU 매칭 계산 및 preset anchor가 없습니다.
  2. Proposal free: one stage detection이 이뤄집니다.
  3. FC conv 방식으로 pixel 당 예측을 계선합니다. detection prediction의 수는 공간적으로 feature map의 크기와 같습니다.

 

이 모델은 이미지당 더 적은 예측을 요구하면서 앵커 기반 방법과 성능을 일치시킬 수 있어 주목 받았습니다. FCOS는 백본에서 multi-level feature를 pyramid로 집계하는 FPN 위에 구축됩니다. 예측은 FPN의 5개 feature level에서 얻습니다. 그런 다음 출력은 classification, center-ness 및 regression의 3가지 분기로 구성된 하위 네트워크를 통해 공급됩니다.

 

여기서 Centerness는 객체의 중심과 위치 사이의 편차를 계산합니다. 이는 객체의 중심에서 feature-level 별 졍규화 거리를 출력합니다. 예측이 객체의 중심에 가까울수록 정규화 값이 높아집니다. Centerness 범위는 0에서 1까지이므로 이진 교차 엔트로피 손실로 학습됩니다.

 

이렇게 모델은 pyramid feature의 stride에 따라 정규화된 회귀 타겟에 대해 학습됩니다. 이것은 회귀 이상값이 있는 상태에서 어느 정도 훈련을 안정화했습니다.

 

 


Semantic and Instacne Segmentation

Segmentation은 위와 같이 크게 두 가지로 분류할 수 있습니다.

 

Semantic Segmentation은 픽셀 위주의 예측을 수행합니다. classification를 위해 슬라이딩 윈도우를 수행한다고 생각하면 모든 픽셀을 작은 영역으로 분류해야 합니다. 또한 공간 상에서 공유하는 서로 다른 feature들을 공유해서 사용할 수가 없습니다. 이점과 모든 영역을 forward/backward pass하는 일은 연산에서 상당히 비효율적입니다.

 

더 개선된 방법으로는 위 이미지와 같이 Conv layer로만 구성된 네트워크 형태를 활용하는 것입니다. 제로 패딩을 수행하는 conv layer를 쌓아올리면 이미지의 공간 정보를 손실하지 않고 학습할 수 있습니다. 따라서 class 수만큼을 곱한 $H \times W$ 출력 텐서, classfication score가 계산됩니다.

 

이 네트워크를 학습 시키기 위해선 모든 픽셀의 classification loss를 계산한 다음 평균을 취해야 합니다. 이 방법의 단점은 입력 이미지의 Spatial size를 계속 유지시켜줘야 한다는 점입니다. 만약 더 큰 고해상도 이미지가 들어오게 되면 계산과 메모리가 상당히 커지게 됩니다.

 

따라서 Spatial size를 유지해야하는 구조 대신 feature map을 Downsampling과 Upsampling을 사용하는 것이 대부분입니다. 이 구조는 기본 방식보다 계산 효율이 좋으며, 더 깊은 레이어를 쌓는데도 도움이 됩니다.

 

Downsampling과 Upsampling을 살펴보겠습니다.

  1. Bed of Nails은 Unpooling 영역에만 값을 복사하고 나머지는 0을 채우는 방법입니다.
  2. Nearest Neighbor는 해당하는 값을 receptive field에 그대로 복사하는 방법입니다.
  3. Max pooling은 최대값을 뽑아서 대표값으로 대체하는 방법입니다.
  4. Max unpooling은 downsampling 시에 pooling에 사용했던 요소를 기억하여 이전에 선택된 위치에 값을 넣어주는 방법입니다. 나머지는 0으로 채웁니다.

 

위의 방법은 고정된 값을 사용하는 방법이었고, Transposed Convolution은 feature map을 학습하여 값을 얻습니다.

 

입력이 $2 \times 2$2고 출력이 $4 \times 4$ 입니다. 입력 feature amp에서 값을 $3 \times 3$ filter와 곱합니다. 그리고 출력의 영역에 그 값을 넣어줍니다. 즉, 필터와 입력의 내적이 아닌 입력값이 필터에 곱해지는 가중치의 역할을 하게 됩니다. 따라서 출력값은 필터 * 입력(가중치)입니다.

 

가중치가 곱해진 출력값을 출력값에 넣어주고 이렇게 계산하다보면 Receptive field가 겹치는 부분이 생깁니다. 이런 경우에는 Sum 해줍니다.

 

더 구체적인 예시를 살펴보면, 1차원에서 3x1 Transpose convolution을 수행합니다. 필터에는 $x, y, z$가 있고 $a, b$를 입력 받습니다. output을 보면 입력값이 가중치처럼 쓰이며 필터에 곱해집니다. 그리고 이 값을 출력에 넣고 더해줍니다.

 

convolution 연산을 matrix 연산으로 표현했을 경우입니다.

슬라이드의 왼쪽을 먼저 보겠습니다. $4 \times 6$ 행렬을 보면 $(x, y, z)$ vector가 위치를 이동하면서 채워져 있고, 그 이외의 자리에는 0으로 채웁니다. 이게 vector를 행렬식으로 가중치 행렬을 $X$, 입력 벡터인 a는 원소 4개 $(a,b,c,d)$를 갖고 있습니다.

슬라이드의 오른쪽은 $X^T$를 곱하는 형태를 만들었고, Transpose한 행렬을 곱합니다.

 

둘 다 Stride가 1일 때의 경우였는데요. 만약에 stride가 1보다 큰 경우엔 연산 결과가 많이 달라집니다.

 

transpose convolution에서는 receptive field가 겹치는 부분은 덧셈을 해주기 때문에, checkerboard artifacts 현상이 발생한다고 합니다. 즉, 해당 연산을 통해 체커보드 패턴이 생기는 것을 의미합니다. 이 의미는 불균형한 오버랩이 발생하는 경우로 필터 사이즈가 스트라이드에 나누어 떨어지지 않을 때 발생하곤 합니다.

 

따라서 해결책은 커널 사이즈가 스트라이드에 나누어 떨어지도록 사이즈를 조정하는 방법이 있고, 출력 영상을 키우기 위해 Stride 사이즈 조절이 필수적이기 때문에, 다른 방법으로는 upsampling과 convolution을 분리해서 순차적으로 학습하면 체커보드 패턴이 사라집니다.

 

예를 들어 보간법 등을 사용하여 이미지 크기를 조정한 다음 다음 컨볼루션 레이어를 수행합니다. 이어 보간법에 대해 설명하겠습니다.

 

보간법은 알려진 데이터에서 알려지지 않은 데이터를 추정하는 방법입니다. Nearest Neighbor Interpolation, Bilinear Interpolation 및 Bicubic Interpolation과 같이 이미지 크기를 조정할 때 사용할 수 있는 몇 가지 기술이 있습니다.

 

픽셀을 빼는 것이 아니라 더하는 것이기 때문에 세부 정보가 손실될 수 있습니다. 선명도와 디테일을 유지하려면 가장 가까운 값을 얻기 위해 각 픽셀을 주변 픽셀과 근사화해야 합니다.

 

그리드의 p(x,y)에 있는 점의 값을 가져오고 이를 보간하여 주변 점의 값을 근사화하는 것입니다.


 

Instance Segmentation

위의 설명과 같습니다. 대표적으로 Mask R-CNN이 있습니다.

 

Mask R-CNN

Mask R-CNN은 2단계 프레임워크입니다. 첫 번째 단계는 이미지를 스캔하고 제안(객체를 포함할 가능성이 있는 영역)을 생성합니다. 그리고 두 번째 단계에서는 제안을 분류하고 바운딩 박스와 마스크를 생성합니다. 두 단계 모두 백본 구조에 연결됩니다.

 

첫 번째 단계: RPN(Region Proposal Network)이라는 경량 신경망이 모든 FPN을 위에서 아래로 스캔하고 객체를 포함할 수 있는 영역을 제안합니다. feature map을 스캔하는 것은 효율적인 방법이지만 feature를 raw image 위치에 바인딩하는 방법이 필요합니다. 솔루션은 앵커입니다. (앵커는 앞에서 설명했듯이 이미지에 상대적인 미리 정의된 위치와 배율이 있는 box set입니다.)

Ground-truth 클래스(이 단계에서 분류된 개체 또는 배경 바이너리만) 및 bounding box가 개별 앵커에 할당됩니다. 서로 다른 축척을 가진 앵커가 서로 다른 수준의 feature map에 바인딩되므로 RPN은 이러한 앵커를 사용하여 feature map이 객체를 '받아야 하는' 위치와 해당 bounding box의 크기를 파악합니다.

 

두 번째 단계: 절차는 RPN과 유사해 보입니다. 유일한 차이점은 앵커의 도움 없이 이 단계는 ROIAlign이라는 트릭을 사용하여 feature map의 관련 영역을 찾고 픽셀 수준에서 각 개체에 대한 마스크를 생성하는 분기가 있다는 것입니다.

 

 

ROIAlign은 서로 다른 지점에서 feature map을 샘플링하고 Bilinear interpolation 방법을 적용합니다.

 

첫 번째 상자(왼쪽 상단)를 보면 4개의 서로 다른 그리드 셀이 포함되어 있음을 알 수 있습니다. 풀링 레이어의 값을 추출하려면 풀링 레이어에서 일부 데이터를 샘플링해야 합니다. 데이터를 샘플링하려면 해당 상자 안에 4개의 샘플링 지점 을 만들어야 합니다

 

RoIAlign과 RoIPooling에서 데이터 손실/데이터 획득을 비교하면 RoIAlign이 전체 영역을 사용하여 다음에서 데이터를 풀링한다는 것을 알 수 있습니다.

 

Mask R-CNN에 대해 흥미로운 점은 레이어를 블랙 박스로 취급하는 대신 Anchor 및 ROIAlign과 같이 신경망의 다른 레이어가 다른 스케일로 feature을 학습하도록 실제로 강제할 수 있다는 것입니다.

 

 

 


Panoptic Segmentation

이는 강의에서 자세히 다루진 않습니다.

Semantic Segmentation과 Instance Segmentation를 합친 개념입니다. ‘thing’과 'stuff’ 모두 이미지의 모든 픽셀에 레이블 지정하고 ‘thing’ 카테고리도 인스턴스로 분리합니다.

그리고 metric으로 PQ Computation이 제안됩니다. Prediction과 Ground Truth로 IoU가 0.5보다 크면 둘을 matching하는 방법입니다.

자세한 건 논문을 참고해주세요.


 

Human Keypoints

사람의 포즈와 keypoints의 위치까지 나타내는 방법입니다. Mask R-CNN에 Keypoint prediction  분기를 추가하여 이 task를 다룰 수 있습니다.

키포인트의 위치는 원-핫 마스크로 모델링됩니다. Mask R-CNN 은 $K$개의 키포인트 유형(예: 왼쪽 어깨, 오른쪽 팔꿈치) 각각에 대해 하나씩 K 마스크를 예측합니다.

 

이처럼 Mask R-CNN으로 Instance segmentation과 Pose estimation을 함께 수행할 수 있습니다.

 

이제 아래의 내용은 사진 첨부만 하겠습니다. 3D vision lecture에서 다룰 것 같아 자세히 보진 않았습니다.

 

 

강의 요약으로는 Computer Vision Task로 이러한 것들이 있습니다로 간단 요약해버립니다.

 

 

감사합니다.

728x90
댓글