CV 7강) Instance/Panoptic Segmentation and Lankmark Localization

한량·2021년 9월 14일
0

[U-stage] Computer Vision

목록 보기
8/13

Instance Segmentation

  • 같은 물체라도 instance에 따라 구분

  • Semantic segmentation + Digtingushing instances

Instance segmenters

Mask R-CNN

기존의 Faster R-CNN과 거의 동일한 구조

  • RoIAlign이라는 새로운 pooling layer를 제안, interpolation을 통해 정교한 소수점 단위의 pixel 계산을 지원

  • Mask R-CNN = Faster R-CNN + Mask branch

  • Mask Branch: 7x7에서 14x14로 upsampling, 80개의 class에 대해 binary mask(bg, fg)를 predict

    • 하나의 bounding box에 대해서 일괄적으로 모든 클래스에 대한 mask를 일단 생성
    • 그 다음에 classification head에서 클래스를 예측하는 결과를 이용해 어떤 mask를 선택을할지 참조

YOLACT

You Only Look at Coefficients의 약자

  • Single-stage network

  • Backbone은 FPN(feature pyramid network)를 사용해 고해상도 feature map을 사용 가능

  • Mask의 prototype을 추출해서 사용하는 것이 특징
    Mask는 아니지만 나중에 mask로 합성될 수 있는 기본적인 여러 물체들의 soft segmentation component를 생성

  • Projection head: 각 detection에 대해 prototype을 잘 합성하기 위한 coefficient를 출력

  • Coefficient와 prototype을 선형결합해 각 detection에 적합한 mask response map을 생성

    • 위 예시에서는 detection 1은 사람이 dominant, 2는 라켓이 dominant
  • Mask를 효율적으로 생성하기 위해 prototype의 갯수를 object(class) 갯수와 상관없이 적당히 작게 설정하지만, coefficient와의 선형결합으로 다양한 mask를 생성하는 것이 핵심

YolactEdge

  • Yolact를 edge device에 올릴 정도로 소형화, light하게 만든 알고리즘

  • 이전 frame에서 key frame의 feature를 다음 frame에 전달해서 feature map의 계산량을 획기적으로 줄임

  • 속도적인 면에서는 개선했지만 video에 독립적으로 processing되기 때문에 mask가 불안정하다는 한계점이 존재


Panoptic Segmentation

  • Instance segmentation의 단점이었던 background를 잘 구분하지 못한다는 문제를 개선

  • Background 뿐만 아니라 관심을 가질만한 물체들의 instance도 구분

UPSNet

  • Backbone은 FPN을 이용
  • Head branches
    • Semantic head: Fully convolution 구조로 semantic map을 예측
    • Instance head: Object detection과 box regression, mask의 logit을 예측
    • Panoptic head: 앞선 head의 결과를 조합해 최종적으로 하나의 segmentation map을 만듬

  • Instance head에서는 instance mask(YiY_i), semantic head에서는 물체와 배경에 대한 mask(XthingX_{thing}, XstuffX_{stuff})가 존재

  • 각 instance들을 b-box가 아니라 전체 image 중 해당하는 위치에 넣기 위해 XthingX_{thing}을 mask해서 더한 후 최종출력으로 보냄

  • Instance와 object 모두에 해당하지 않는 부분은 제외해서 unknown class로 만든 후 1 channel로 최종 결과에 추가

VPSNet

Panoptic segmentation을 video로 확장

  1. 두 시간차를 갖는 영상 사이에 ϕ\phi라는 motion map을 사용해 각 frame에서 나온 feature map을 motion에 따라 warp
    -> Motion map : 모든 pixel에 대해서, 한 image에서의 포인트가 다음 image엔 어디로 가는지에 대한 대응점들을 가지고 있는 motion을 나타낸 map
    -> Motion map을 활용해서 tτt−τ 에서 뽑힌 feature를 tt (현재 target frame) 에서는 어떤 위치인지 옮김

  2. 그 다음에 원래 각 frame tt 에서 찍혔던 feature(blue layer)와 warping 된 feature(yellow layer) 두개를 합쳐서 사용한다

  3. 이전 프레임에서 빌려온 특징들 덕분에 현재 프레임에서 추출된 feature 만으로 대응하지 못하거나 보이지 않게 가려졌던 부분들도 더 높은 detection 성공률이 얻어진다

  • 여러 프레임의 feature를 합쳐서 사용함으로써 시간 연속적으로 smooth 한 segmentation이 될 확률도 높아진다

  • VPN을 통해서 RoI 들의 feature 를 추출해서 tracking head를 통해서 기존 RoI들과 현재 RoI들이 어떻게 서로 연관 되어있는지, 이전에 몇번 id를 가졌던 물체였는지를 찾아서 연관성을 만듬

  • 같은 물체는 같은 ID 를 가질 수 있도록, 시간에 따라서 tracking을 하게끔 만들어 준다

  • 이후는 UPSNet과 동일하게 B-box, mask, semantic head에서 나온 결과를 하나의 panoptic segmentation map으로 붙여줌

Landmark localization

  • landmark localization task: 얼굴이나 사람의 몸통등 특정 물체에 대해서 중요하다고 생각하는 landmark를 정의하고 그것들을 추정하고 추적하는 것

Coordinate regression vs heatmap classification

  • Coordinate regression
    • Box regression처럼 FC layer의 각 node를 landmark의 x,y 위치를 예측하게 하는 방식
    • 부정확하고 일반화하기 어려움
  • Heatmap classification
    • Semantic segmentation처럼 각 채널이 각각의 key point를 담당
    • 각 key point 마다 하나의 클래스로 생각해서 그 key point가 발생할 확률 map을 각 pixel별로 classification
    • 성능이 훨씬 좋아지긴 하나 모든 픽셀에 대해서 판별을 해야하기 때문에 계산량이 많다

Landmark location to Gaussian heatmap

  • x,y 위치가 label로 주어졌을때(= landmark가 (x,y)에 있을 경우), 각 위치의 confidence(landmark가 있을 가능성)를 heatmap으로 변환

  • Label 로 주어진 x,y가 gaussian의 평균을 나타내고 그 위치 근처에 gaussian 분포를 만듬

# 임의로 영상크기 사이즈를 만든다 (보통 출력 해상도의 크기를 사용)
size = 6 * sigma + 1 

# 출력 영상의 모든 픽셀의 좌표 (모든 점들의 좌표) 값들을 나열 하기 위해서 x,y 를 미리 생성
x = np.arange(0, size, 1, float)  
y = x[:, np.newaxis]

# 임의로 x0, y0 를 센터 포인트에 대응하게 만듬
# 지금은 정사각형 이기 때문에 거기서 중앙을 평균값으로 사용
# landmark 에 location으로 가정하기 위해서 간단하게 예제를 만든다
x0 = y0 = size // 2 
# the gaussian is not normalized, we want the center value to equal 1
if type == 'Gaussian':
    g = np.exp(- ((x - x0) ** 2 + ((y - y0)) ** 2) / (2 * sigma ** 2))
elif type == 'Cauchy':
    g = sigma / (((x - x0) ** 2 + (y - y0) ** 2 + sigma ** 2) ** 1.5)

Hourglass network

  • UNet과 비슷한 구조로, 영상 전체를 작게 만들어서 receptive field를 키워서 landmark를 찾는다

  • Receptive field를 크게 가져가서 큰 영역을 보면서도 skip connection이 있어 low level feature를 참고해서 정확한 위치를 특정하도록 유도

  • 이 과정을 여러번 거쳐서 점점 더 큰 그림과 디테일을 구체화해 나가면서 결과를 개선해 나간다

  • UNet처럼 concat하지 않고 여기서는 더해줘서 dimension이 늘어나지 않는다

  • 대신에 skip 할때 또 다른 convolution layer를 통과해서 전달이 되게 된다

  • Add와 conv를 거치기 때문에 FPN에 좀 더 가까운 구조

Extensions

DensePose

  • 신체의 모든 부위의 landmark 위치를 알게되면 3D 를 알게 되는것과 마찬가지

  • UV map: 표준 3D 모델에 각 V 를 2D 로 펼쳐서 이미지 형태로 만들어 놓은 좌표 표기법
    • UV map에서의 한 점은 3D mesh 모델상의 한점과 1:1로 대응
    • 3D mesh가 움직여도 이 id는 보존(tracking) 된다
      즉, UV map 과 3D mesh 관계가 변하지 않는다
    • UV map 은 고정된 형태의 지도라서 특정 점의 위치를 알고 있으면 3D 상에서 어디에 위치하는지 계속알 수 있다

  • Patch: 각 body의 segmentation map

  • 입/출력 구조를 잘 설계해서 2D 구조의 CNN으로 3D 구조를 예측함

  • 가장 마지막의 mask branch 부분이 UV map prediction으로 변환해서 DensePose를 예측

RetinaFace

  • Multi-task: classification, bounding box, 5 point regression(5개 landmark detect), mesh regression(3D face mesh를 출력)

  • 공통된 정보 이외에 task마다 조금씩 다른 정보를 backbone network가 학습하기 때문에 훨씬 강하게 학습

  • 여러군데에서 오는 gradient가 공통되는 정보도 있고 조금 다른 정보들도 있는데 한번에 업데이트 될때 데이터를 더 많이 보는 효과도 있다
    --> 사용한 데이터양 대비해서 성능 향상 폭이 큰 경우가 많음


Detecting objects as keypoints

CornerNet

  • Top-left, Bottom-right 정보만 갖고 B-box를 찾아내는 방식

  • Heatmap에서는 corner point만 출력하고, embedding에서 같은 object끼리 match

  • 성능보다는 속도를 강조한 구조

CenterNet

  • Center point를 추가해서 성능을 개선

  • Width, height를 대신 쓰기도 함

  • 최신 연구는 속도뿐만 아니라 성능도 좋음

Refence

  1. Task에 따라 대체로 비슷한 design pattern을 가짐
    --> 새로운 model을 만들때도 이전 패턴을 참고하면 좋음

  2. Data, output을 변경하는 것으로 성능, 속도를 크게 향상할 수 있음


Further Question

(1) Mask R-CNN과 Faster R-CNN은 어떤 차이점이 있을까요? (ex. 풀고자 하는 task, 네트워크 구성 등)
(2) Panoptic segmentation과 instance segmentation은 어떤 차이점이 있을까요?
(3) Landmark localization은 human pose estimation 이외의 어떤 도메인에 적용될 수 있을까요?

profile
놀고 먹으면서 개발하기

0개의 댓글