👩‍💻LEARN : ML&Data/Lecture

[CS231n] Lecture11. Detection and Segmentation

쟈니유 2023. 5. 19. 00:32
728x90

오늘 강의에서 다룰 내용들

 

 

Semantic Segmentation

[개요] 

  • image를 입력해서 pixel별로 카테고리를 얻는 것 
  • 이미지 안에 있는 instance를 구분하지 않는다 (cow1,cow2가 있을 경우 그냥 묶어서 cow로 도출)

 

[구현방법]

1. Sliding Window

  • Full image에서 작은 이미지들을 추출한다
  • 해당 작은 이미지를 CNN 네트워크에 입력시킨 후 픽셀의 카테고리를 산출한다
  • 문제점 : 모든 이미지에 대한 작은 이미지를 추출하고 돌려야하기 때문에 비효율적 

2. Fully Convolutional 

  • 모든 픽셀에 대한 분류를 진행하기 위해 왕큰 CNN을 만드는 것 
  • 방법
    • 초반에는 activation map의 크기를 줄이는 형태로 downsampling을 진행한다. 이로 인해 연산이 효율적으로 되고 네트워크를 깊게 만드는 것도 가능해진다.
    • 이후 upsampling을 통해 원본 이미지 수준으로 다시 복귀시킨다 
    • 모든 픽셀에 대해 cross entropy loss를 계산하고 평균 loss를 구한다 

 

  • Upsampling
    1. Unpooling 
      1. NN : 작은 레이어의 값들을 큰 레이어로 확장시킬때 주변에 있는 픽셀 값으로 채워주는 것 
      2. Bed of Nails : 작은 레이어의 값들은 각 구역 별 좌상단 값으로 배치, 나머지는 0으로 채우는 것
    2. Max Unpooling 
      • Max Pooling 시, 구역마다 Max 값이었던 요소들의 위치를 기억하고 Unpooling 시 그 위치에 해당 요소를 넣고 나머지는 0으로 채우는 것  
    3. Transpose Convolution 
      • 학습 가능한 Upsampling 방법 
      • 입력 레이어의 요소(값 하나! 스칼라!)를 필터와 곱하고, 해당 값을 위치에 맞추어 출력 레이어에 배정하는 것 
      • 이 경우 stride에 따라 겹칠 수 있는데 겹칠 경우 두 값을 합친다 

  • 이 과정을 포함한 Convolution은 결국 행렬곱으로 나타낼 수 있음! 
    • Convolution의 경우 input layer에 filter를 행렬곱하는 것 
    • Unpooling의 예시는 input layer를 전치시킨 후 필터를 행렬곱 하는 것
    • 이 때 stride가 2 이상일 경우 transpose 일 땐 normal convolution이 아니다  

 

 

Classification + Localization

[방법]

  • 이미지를 입력 시킨다
  • CNN을 통과시킨다 (pre trained 네트워크를 써서 전이 학습을 시키는 경우도 있음)
  • 결과 값으로 벡터를 산출한다
  • 해당 벡터를 2 방향으로 FC를 연결한다
  • Classification을 위한 FC
    • 카테고리를 분류해서 class score를 구한 다음 softmax로 Class Loss를 구한다 
  • Localization을 위한 FC (Regression 문제처럼 구하기) 
    • 클래스 별로 박스 위치(x,y,z,h)를 구한 다음 정답 박스와의 차이 통해 L2 Loss를 구한다
    • 완전완전 Fully Supervised learning이다 
  • Multitask Loss를 구한다
    • 두 Loss를 합칠 때 가중합을 사용하기 때문에 가중치를 조정하는 파라미터가 있다
    • 두 Loss의 가중합에 대한 gradient를 구할때 이 가중치가 사용되는데, 문제는 이 가중치를 결정하기가 어렵다. 원래대로라면 Loss의 변화양상을 보면서 하이퍼파라미터를 구할텐데, 가중합이기 때문에 가중치가 Loss function 그 자체에 관여해서 값 간 비교하는 것이 ..안된다!
    • 그래서 이 가중치 파라미터를 구할 땐 Loss변화로 관찰하기보다 다른 성능 지표를 사용해서 파라미터를 결정한다( 무슨 지표인진 안알려줌) 
  • 만약 Pose estimation도 곁들이고 싶다면 14개의 관절 위치를 output으로 예측하도록 설계할 수 있다. 각 관절 마다의 좌표값을 구하고 이 좌표값의 오차를 모두 구한 후 합해서 전체 오차를 구할 수 있다 

Object Detection 

[Sliding Window]

  • 이미지의 일부를 crop한 이미지를 여러개 만들고 이 이미지마다 CNN을 적용해서 이미지를 해당 클래스인지(cat, dog, background..)분류하는 방법
  • 너무 계산 효율이 떨어진다 

 

[Region Proposal을 이용한 방법들] 

기본 개념 : Region Proposal

  • Object가 있을만한 뭉텅이 이미지 영역을 BoundingBox로 여러개 찾는다. 이 때는 머신러닝이 아닌 고전신호처리 방법인 Selective Search를 사용한다 
  • 찾은 Region을 CNN에 넣어서 해당 Region의 클래스를 예측한다 

방법1. R-CNN

  • 앞서 사용되었던 Region Proposal을 얻기 위해 Selective Search를 사용해 Region들(앞으로는 RoI)을 여러개 얻어낸다
  • CNN 사용을 위해 모든 RoI의 사이즈를 통일시킨다 
  • CNN을 통과시킨다
  • RoI의 클래스를 분류한다 (SVM사용) 
  • 또한 BBox 위치를 보정하기 위해 Linear Regression을 사용한다
  • 두 작업으로 부터 나온 Loss를 합쳐 Multitask Loss를 구한다 
  • 문제점 : 너무 느리다...  

방법1. Fast R-CNN

  • 먼저 이미지를 바로 CNN에 넣어 Feature map을 얻는다
  • Selective Search를 사용하여 Feature map에 Roi를 투영시킨다 
  • Feature map에서 가져온 RoI를 FC에 넣어주기 위해 RoI 풀링을 통해 사이즈를 맞춰준다
  • FC에 연결해서 분류를 위해 Softmax Classifier와 연결하고 (softmax loss와 Linear Loss를 같이 사용), BBox 위치를 위해 Linear 함수를 사용한다 
  • Multi task Loss를 위해 두 Loss를 합치는데 이 때 Log Loss + Smooth L1 Loss이다 

 

방법1. Faster R-CNN

  • 이미지를 CNN에 넣어준다. (3x640x480이라 하자!) 
  • RoI 생성을 위해 Region Proposal Network를 중간에 삽입한다 
    • RPN 에서는 ground truth가 없음메.. 일정 threshold이상 겹치는 것을 true, 이하인 것을 false로 할 것 
    • RPN에서도 오차가 생성되며 classification loss(object 존재 여부), BBox regression loss로 구성된다 
  • Feature map을 만든다 (512x20x15)
  • Feature map에 RoI를 투영시킨다 (하나의 프로포절마다 !)(512x18x8, 프로포절마다 다를수있음)
  • 투영시킨 Feature map을 7x7 매트릭스 크기로 나눠주고, 한 셀 마다 Max Pool 한다 (512x7x7 per region)
  • FC에 이를 연결한다 
  • Final classification loss와 Final Box loss 를 구한다
  • RPN과 Final의 오차 모두 Jointly train시킨다 

 

[Single Shoot Detection : without Proposal] 

각 task를 따로 계산하지 말고 한번에! 하면 안되나? 

 

  • input image를 7x7 그리드로 나눈다 
  • 각 그리드 마다 base box 를 여러개 만든다 (길쭉한넘 ..뚱뚱한넘..등등)
  • Regrssion을 이용해서 만든 Base box가 진짜 위치가 되려면 얼마나 움직여야 하는지 위치에 대해 회귀분석한다 
  • Class score도 함께 계산한다 

 

Instance Segmentation

최종보스임. object 위치도 알아야하고 segmentaiton mask도 알아야함; 

 

[Mask R-CNN]

  • 먼저 CNN, RPN을 함께 돌려서 Feature map에 RoI를 투영한다 
  • 해당 부분에 대해 먼저 카테고리와 BBox를 예측한다 (as Faster RCNN)
  • 해당 부분이 object인지 아닌지 알기 위해 Selective Search미니 네트워크를 사용한다! 이 결과가 mask로 산출된다