같은 물체라도 instance에 따라 구분
Semantic segmentation + Digtingushing instances
기존의 Faster R-CNN과 거의 동일한 구조
Mask R-CNN = Faster R-CNN + Mask branch
Mask Branch
: 7x7에서 14x14로 upsampling, 80개의 class에 대해 binary mask(bg, fg)를 predict
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을 생성
Mask를 효율적으로 생성하기 위해 prototype의 갯수를 object(class) 갯수와 상관없이 적당히 작게 설정하지만, coefficient와의 선형결합으로 다양한 mask를 생성하는 것이 핵심
Yolact를 edge device에 올릴 정도로 소형화, light하게 만든 알고리즘
이전 frame에서 key frame의 feature를 다음 frame에 전달해서 feature map의 계산량을 획기적으로 줄임
속도적인 면에서는 개선했지만 video에 독립적으로 processing되기 때문에 mask가 불안정하다는 한계점이 존재
Instance segmentation의 단점이었던 background를 잘 구분하지 못한다는 문제를 개선
Background 뿐만 아니라 관심을 가질만한 물체들의 instance도 구분
Instance head에서는 instance mask(), semantic head에서는 물체와 배경에 대한 mask(, )가 존재
각 instance들을 b-box가 아니라 전체 image 중 해당하는 위치에 넣기 위해 을 mask해서 더한 후 최종출력으로 보냄
Instance와 object 모두에 해당하지 않는 부분은 제외해서 unknown class로 만든 후 1 channel로 최종 결과에 추가
Panoptic segmentation을 video로 확장
두 시간차를 갖는 영상 사이에 라는 motion map을 사용해 각 frame에서 나온 feature map을 motion에 따라 warp
-> Motion map : 모든 pixel에 대해서, 한 image에서의 포인트가 다음 image엔 어디로 가는지에 대한 대응점들을 가지고 있는 motion을 나타낸 map
-> Motion map을 활용해서 에서 뽑힌 feature를 (현재 target frame) 에서는 어떤 위치인지 옮김
그 다음에 원래 각 frame 에서 찍혔던 feature(blue layer)와 warping 된 feature(yellow layer) 두개를 합쳐서 사용한다
이전 프레임에서 빌려온 특징들 덕분에 현재 프레임에서 추출된 feature 만으로 대응하지 못하거나 보이지 않게 가려졌던 부분들도 더 높은 detection 성공률이 얻어진다
VPN을 통해서 RoI 들의 feature 를 추출해서 tracking head를 통해서 기존 RoI들과 현재 RoI들이 어떻게 서로 연관 되어있는지, 이전에 몇번 id를 가졌던 물체였는지를 찾아서 연관성을 만듬
같은 물체는 같은 ID 를 가질 수 있도록, 시간에 따라서 tracking을 하게끔 만들어 준다
landmark localization task
: 얼굴이나 사람의 몸통등 특정 물체에 대해서 중요하다고 생각하는 landmark
를 정의하고 그것들을 추정하고 추적하는 것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)
UNet과 비슷한 구조로, 영상 전체를 작게 만들어서 receptive field를 키워서 landmark를 찾는다
Receptive field를 크게 가져가서 큰 영역을 보면서도 skip connection이 있어 low level feature를 참고해서 정확한 위치를 특정하도록 유도
이 과정을 여러번 거쳐서 점점 더 큰 그림과 디테일을 구체화해 나가면서 결과를 개선해 나간다
UNet처럼 concat하지 않고 여기서는 더해줘서 dimension이 늘어나지 않는다
대신에 skip 할때 또 다른 convolution layer를 통과해서 전달이 되게 된다
Add와 conv를 거치기 때문에 FPN에 좀 더 가까운 구조
UV map
: 표준 3D 모델에 각 V 를 2D 로 펼쳐서 이미지 형태로 만들어 놓은 좌표 표기법Patch: 각 body의 segmentation map
입/출력 구조를 잘 설계해서 2D 구조의 CNN으로 3D 구조를 예측함
가장 마지막의 mask branch 부분이 UV map prediction으로 변환해서 DensePose를 예측
Multi-task: classification, bounding box, 5 point regression(5개 landmark detect), mesh regression(3D face mesh를 출력)
공통된 정보 이외에 task마다 조금씩 다른 정보를 backbone network가 학습하기 때문에 훨씬 강하게 학습
여러군데에서 오는 gradient가 공통되는 정보도 있고 조금 다른 정보들도 있는데 한번에 업데이트 될때 데이터를 더 많이 보는 효과도 있다
--> 사용한 데이터양 대비해서 성능 향상 폭이 큰 경우가 많음
Top-left, Bottom-right 정보만 갖고 B-box를 찾아내는 방식
Heatmap에서는 corner point만 출력하고, embedding에서 같은 object끼리 match
성능보다는 속도를 강조한 구조
Task에 따라 대체로 비슷한 design pattern을 가짐
--> 새로운 model을 만들때도 이전 패턴을 참고하면 좋음
Data, output을 변경하는 것으로 성능, 속도를 크게 향상할 수 있음
(1) Mask R-CNN과 Faster R-CNN은 어떤 차이점이 있을까요? (ex. 풀고자 하는 task, 네트워크 구성 등)
(2) Panoptic segmentation과 instance segmentation은 어떤 차이점이 있을까요?
(3) Landmark localization은 human pose estimation 이외의 어떤 도메인에 적용될 수 있을까요?