Panoptic segmentation
기존의 instance segmentation은 배경에는 관심이 없었고 그저 움직이는 작은 물체들에 대해서만 관심을 가졌다. 배경 등에 관심이 있을 때는 semantic segmentation이 유리하긴 했지만 객체(instance)를 구별할 수 없다는 한계가 존재하였다. 그래서 이런 두 가지 문제 특성을 합친 새로운 문제로 Panoptic segmentation이 제시되었다.
- UPSNet
Backbone에서는 FPN을 사용하여 고해상도의 feature map을 뽑고 head branch를 여러개로 나눈다. 첫 번째는 Semantic head인데 fc 구조로 되어서 semantic map을 prediction 하게 되고 그 다음 branch로 instance head로 class의 detection과 box의 regression, mask를 추출하는 task를 담당한다. 그리고 이 모든 결과를 융합해주는 Panoptic Head가 들어가서 최종적으로 하나의 segmentation map으로 합쳐주게 된다.
각 head에서 나온 결과는 instance에 해당하는 mask, 각 물체들과 배경을 예측하는 mask들이 있다. 여기서 배경을 예측하는 mask는 최종 출력으로 바로 들어간다. 그리고 각 instance들을 bounding box가 아닌 전체 영상에 해당하는 위치에 다시 넣으면서 보강하기 위해 semantic head의 물체 부분을 masking을 하여 그 response를 instance response와 더해주어 최종 출력에 삽입을 한다. 아래 그림의 Y_i에서 box의 크기가 물체의 크기와 일치한다고 하면 전체 영역에서 어디에 위치해있는지를 조정해서 넣어주는 것이다.
물체와 배경에 소속되지 않는 unknown class를 고려하기위해 semantic mask map의 instance로 사용된 부분들을 제외하여 나머지 배타적인 부분들을 모두 unknown class로 합쳐 하나의 층으로 추가가 된다.
- VPSNet
VPSNet은 두 시간차를 가지는 두 영상사이의 phi라는 모션 맵을 사용해서 각 frame에서 나온 feature map을 모션에 따라서 warping을 해준다. 일단 모션 맵이라는 것은 두 개의 영상이 있으면 한 영상에서 다음 영상으로 어떤 포인트가 어디로 가는지의 대응점들을 모든 픽셀에대해서 가지고 있는 것을 말한다. 이를 활용하여 t-𝜏에서 뽑힌 feature를 마치 현재 target frame인 t에서 찍은 것과 마찬가지로 feature를 하나씩 옮겨준다. 그 다음 t에서 찍힌 feature와 warping된 feature를 합친다. 이렇게 함으로서 현재 frame에서 추출된 feature만으로도 대응하지 못하거나 보지이지 않게 가려져 있던 부분들도 이전 frame에서 빌려온 특징들 덕분에 더욱 높은 detection 성공률이 얻어지는 것이다. 그리고 여러 frame의 feature를 합쳐서 사용으로서 시간 연속적으로도 smooth한 segmentation이 될 확률도 높아진다.
FPN을 통해서 RoI feature를 추출해서 기존 RoI들과 tracking head를 통해 현재 RoI들이 어떻게 서로 연관이 되어있는지, 그 이전의 몇 번의 id를 가졌던 물체였는지를 찾아 연관성을 만들어주는 것이다. 새로 추출된 RoI가 기존의 추출된 RoI와 match시켜 tracking하는 것이다. 그리고 나머지는 UPSNet과 같이 BBox head, Mask head, Semantic head가 있고 각 head에서 나온 결과는 하나의 panoptic map으로 합쳐주게 된다.
Landmark localization
Landmark localization은 주로 얼굴이나 사람의 포즈를 추정하고 트래킹하는데 사용한다. 즉, 얼굴이나 사람의 몸통 등 측정 물체에 대해서 중요하다고 생각하는 특징 부분(keypoint=landmark)을 정의하고 추정, 추적하는 것을 말한다. 이때 ladmark는 이미 정의해놓은 것이다.
이런 keypoint를 찾기 위해서 box regression처럼 각 포인트의 x, y위치를 regression하는 Coordinate regression 방법이 있지만 부정확하고 일반화에 문제가 있다.
대안으로 heatmap classification이라는 방법으로 마치 semantic segmentation처럼 하나의 채널들이 하나의 keypoint를 갖게되고 각 keypoint들마다 하나의 class로 생각해서 그 keypoint가 발생할 확률 맵을 각 픽셀별로 classification하는 방법으로 대신 해결하는 것이 제시되었다. 하지만 이 방법도 성능은 좋지만 높은 계산량을 가진다는 단점이 있다.
heatmap 표현은 각 위치마다 confidence가 나오는 형태의 표현인데 x,y가 label로 주어졌을 때 다음과 같은 heatmap으로 변환을 해야할 것이다. 그럴려면 location으로부터 heatmap으로 어떻게 변환할 것인가에 대해서 알아야한다.
# Generate gaussian
size = 6 * sigma + 1 #영상 크기(출력 해상도의 크기)
# x, y 좌표를 미리 정의
x = np.arange(0, size, 1, float)
y = x[:, np.newaxis]
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)
반대로 heatmap을 location으로 변환할 수 있어야할텐데 어떤 방법이 있을까...
Hourglass network
landmark detection에 맞춘 network가 제안되었는데 unet 구조와 비슷하며 여러 개로 쌓은 것과 같은 구조를 가지고 있다. 그리고 unet의 구조가 모래시계처럼 생겼다고 해서 Stacked Hourglass라고 부른다. 이렇게 설계한 이유는 첫 번째로 영상을 전반적으로 작게만들고 receptive field를 크게 만들어 landmark를 찾는 것이 좋겠다라고 생각한 것이고 receptive field를 크게 가져가서 큰 영역을 보면서도 skip connection이 있어 low level feature를 참고하여 정확한 위치를 특정하게끔 유도를 했다. 이것을 여러번 거쳐 점점 더 큰 그림과 디테일을 더욱 구체화하면서 결과를 개선해나아간다.
Hourglass network와 unet은 비슷한 구조이지만 다른 점은 다음과 같이 skip할 때 또 다른 convolution layer를 거치게 하였고 concatenation이 아닌 addition이 되도록 하였다. 이렇게 +를 함으로서 dimension이 늘어나지 않는다.
DensePose
신체 전체에대한 dense한 lanmark를 찾게되면 3d를 알게되는 것과 마찬가지이다. 이런 방법으로 DensePose하는 것이 제안되었다.
3d model의 각 부위를 2d로 펼쳐서 이미지 형태로 만들어 놓은 것을 좌표 표기법을 UV map이라고 한다. UV map에서의 한 점은 3D Mesh의 한 점과 일대일 매치가 된다. 3D Mesh는 triangle로 이루어져있는데 해당 triangle에 있는 점을 matching이 되고 각 triangle이나 점들에 고유한 id를 갖기 때문에 3D Mesh가 움직여도 tracking이 되면서 보존이 된다. 따라서 UV map의 좌표를 바로 출력하는 DensePose는 3D Mesh를 바로 출력하는 것과 같다.
그렇다면 texture는 어떻게 적용시킬까? texture는 이미지로 저장하는 것이 편하기 때문에 UV map이라는 표현이 그래픽스에서 3D Model에 texture를 입히기위해 고안된 것이다. 거기서의 좌표 특성을 DensePose에 응용한 것이다.
DensePose의 구조는 Mask R-CNN과 거의 동일하다. DensePose는 Faster R-CNN과 3D surface regression branch을 도입하여 확장한 형태의 모델이다.
아래 그림에서 Patch라고 되어있는 것은 각 바디 파트의 segmentation map이며 이와 같은 구조는 동일하더라도 입력 데이터와 출력 데이터와의 관계를 잘 설계함으로서 2D 구조의 CNN으로 3D를 잘 예측하는 스마트한 방법을 잘 설계했다고 말할 수 있다.
RetinaFace
RetinaFace에서는 classification(얼굴 판별), Box regression, 기본적인 5개의 landmark를 regression, 3d face mesh를 출력하는 다양한 task를 한 번에 풀도록 만들었다. 이러한 것은 Multi-task라고 부른다. 이렇게 Multi-task로 학습시키면 장점이 있는데 각 task마다 공통적으로 얼굴에대해 조금씩 다르다는 것을 알 수 있다. 이를 통해서 backbone network가 더 강하게 학습된다. 왜냐하면 gradient가 여러 곳에서 오면 공통적인 정보도 있을 것이고 조금 더 다른 정보도 있을 것이기 때문에 한 번에 update될 때 이런 모든 상황을 고려해서 잘 맞게 학습되어야한다. 다시 말해 데이터를 많이 본 것과 같은 효과를 내고 적은 데이터로도 강인한 학습 효과를 낼 수 있는 것이다.
'Deep Learning' 카테고리의 다른 글
[Paper] Separable Self-attention for Mobile VisionTransformers (0) | 2022.12.26 |
---|---|
[Paper] Swin Transformer: Hierarchical Vision Transformer using Shifted Windows (0) | 2022.11.16 |
Instance Segmentation (Mask R-CNN, YOLACT, YolactEdge) (0) | 2022.11.14 |
Semantic Segmentation (U-Net, DeepLab) (0) | 2022.11.14 |
LSTM (Long Short Term Memory)과 GRU(Gated Recurrent Unit) (0) | 2022.11.14 |