1. 3D Vision Topics
![](https://blog.kakaocdn.net/dn/dvsdGt/btsnalHwvNB/PzeJKmX2Pu5eAvh4G9pnW0/img.png)
2. 3D Shape Representations
![](https://blog.kakaocdn.net/dn/3i2Rs/btsm82hrwaj/dxXD2rQlCa8X6Y2kH5his1/img.png)
2.1 3D Shape Representations: Depth Map
![](https://blog.kakaocdn.net/dn/bSiPZp/btsm9fHOszx/uUYiA5BmqZlKZU6KDtU3FK/img.png)
- Depth map은 각 pixel에 대해 카메라와 픽셀 사이의 거리를 구함
- 기존 segmentation 처럼 FC를 통해 pixel 별로 계산할 수 있다
- 이를 통해 Predicted Depth Image와 Ground-Truth image와의 Per-pixel loss를 계산하여 학습할 수 있음
- 하지만 우리 눈에서는 작고 가까이 있는 물체와 크고 멀리 있는 물체의 크기를 구분하지 못함
![](https://blog.kakaocdn.net/dn/bhPzeV/btsm8QuLyXK/px8EPOVouanHQAIofWccrK/img.png)
- 위 문제를 해결하기 위해, Scale invariant loss를 사용한다고 함 (위 논문 참고)
※ Scale invariant loss란: 시스템이나 함수, 통계 정보에 특정 양만큼 scale을 해주어도 그들의 모형이나 성질이 변하지 않는 경우 (불변성의 의미)
※ 멀리서 보나 가까이서 보나 변하지 않는다면, Scale invariance라고 말할 수 있음.
2.2) 3D Shape Representations: Surface Normals
![](https://blog.kakaocdn.net/dn/VkdoZ/btsm7wXRs9L/T0Jd5SLbHpO9rtVQosBZY0/img.png)
- 초록색은 왼쪽 혹은 오른쪽 방향을, 보라색은 윗방향을, 붉은색은 앞쪽을 가리킴
![](https://blog.kakaocdn.net/dn/GuEYQ/btsm2IxzrgU/m92BiQS8MurZbsUTR6GMwk/img.png)
- FC를 걸쳐서 각 픽셀당 3-dim vector을 계산하고, ground-truth와 예측한 값에 대한 벡터의 각도를 비교함
💢 단점: 가려진 부분에 대해서는 측정할 수 없음. 사실상 2.5D 이미지라고 함
2.3) 3D Shape Representations: Voxels
![](https://blog.kakaocdn.net/dn/c2pdhR/btsm9CiqHSp/xRkb7IGPktVW4k8VWG2GF1/img.png)
💢 문제점: 더 구체적이고, 디테일한 표현을 위해서는 촘촘한 3D grid가 필요. 하지만 높은 해상도로 확장하는 것은 어렵다
2.3.1) Processing Voxel Inputs: 3D Convolution
![](https://blog.kakaocdn.net/dn/bcchj2/btsnbPH7PCc/Nav3l6DkkeMMiIxAyFMIzK/img.png)
- 1은 channel이고 30x30x30은 공간 차원
- 1channel은 3d voxel grid가 채워져있는지 아닌지에 대한 것을 나타내는 feature
2.3.2) Generating Voxel Shapes: 3D Convolution
![](https://blog.kakaocdn.net/dn/cbX3nx/btsm9heyYib/Z1oymEZcfFyh6XcQsr8wZk/img.png)
Input (Image) | Output (Voxels) |
3(RGB) x (112 x 112) | 1(Voxel grid ON/OFF) x (V x V x V) |
RGB 2차원 이미지 | voxel grid로 이루어진 3차원 voxel grid |
- output을 만들기 위해서는 새로은 extra spatial dimension이 필요함.(2차원에서 3차원을 생성해야하므로).
- 그리고 voxel grids를 predict하는 쉬운 방법 중 하나는 3d와 4d tensor간의 차이를 fc-layer을 통해서 계산하는 것.
- input이미지에 대해 2D CNN을 통과하고 나면 CxHxW의 3d feature map이 나오고 이를 큰 하나의 vector로 flattening시킴. 그리고 fc-layers를 통해 4d tensors로 reshape시킴. 이후, 3D CNN을 가지고
upsampling
시켜주어 최종 voxel grid를 생성.
💢 단점: 계산이 많이 필요
2.3.3) Generating Voxel Shapes: "Voxel Tubes"
![](https://blog.kakaocdn.net/dn/lVH8Q/btsm8OKyMJO/KPTDIO09NVsY9K5Ck6dk50/img.png)
- output으로는 V*V*V의 형태로 나타냄. x*y*z 형태로
2.3.4) Voxel Problems: Memory Usage
![](https://blog.kakaocdn.net/dn/bOl0f1/btsm83tPAAr/JwckkKoxv2Jj1iLHExRwX0/img.png)
- high resolution voxel grid를 얻기 위해서는 많은 메모리가 필요. 따라서 very high spatial resolutions에서는 naive voxel grids를 사용하기에 적합하지 않음.
💢 하지만, scaling 방법을 통해서 가능하게 하는 방법이 존재
2.4) Scaling Voxels
2.4.1) Oct-Trees
![](https://velog.velcdn.com/images/onground/post/546771a8-a47f-4f73-8dc6-b4a77e74070b/image.png)
- 이를 통해 coarse voxels를 생성하고 세부적인 디테일은 fine voxels(higher resolution)을 사용하여 표현
![](https://velog.velcdn.com/images/onground/post/933b64d5-863c-421e-93c3-4726f167943d/image.png)
2.4.2) Nested Shape Layers
- Full 3d shape를 dense voxel grid로 전부 표현하기 보다 겉의 fine voxel에서 속 안의 보이지 않는 dense voxel을 빼고, 다시 조금 내부의 fine voxel을 더하고, 그 속을 빼고 이런 과정을 반복
![](https://velog.velcdn.com/images/onground/post/38163d79-f15b-43c3-810a-042d5bb3cec9/image.png)
![](https://velog.velcdn.com/images/onground/post/38b27c2e-6ce2-4a4a-88d1-ffff155d7ac6/image.png)
2.5) 3D Shape Representations: Implicit Functions
![](https://velog.velcdn.com/images/onground/post/ed093023-41d4-401b-a6df-b8790cbceabc/image.png)
![](https://velog.velcdn.com/images/onground/post/8741299d-95fe-4075-a83b-49ccd29e9a30/image.png)
- object의 외부 표면(exterior surface)은 {x:o(x)=1/2}를 만족하는 level set(레벨 집합)이다. 즉 값이 0.5가 나오는 모든 좌표들의 집합은 표면을 나타낸다.
![](https://velog.velcdn.com/images/onground/post/3153f9eb-bb21-412a-928c-ae3b71ec6286/image.png)
- 3d voxel grid등으로 implicit function을 학습하고 이를 explicit하게 표현하여 물체의 표면을 확인할 수 있다. ?????
2.6) 3D Shape Representations: Point Cloud
![](https://velog.velcdn.com/images/onground/post/3c4f0434-0d5a-4f3a-8cee-04e16a23003c/image.png)
![](https://velog.velcdn.com/images/onground/post/049903c3-2a72-447d-a956-57ebbe653f16/image.png)
- point cloud는 voxel grid보다 좀 더 쉽게 조정이 가능하다.
- voxel grid에서 fine detail을 위해서는 high resolution이 필요했음
- 하지만 point cloud에서는 우리가 디테일을 살리고 싶은 부분에만 더 많은 points를 할당해주면 됨.
- 그러나 points는 매우 작기 때문에 point cloud를 명시적으로 나타내려면 points를 공크기로 부풀려서 렌더링 해야 함 (post-processing이 필요함)
2.6.1) Processing Pointcloud Inputs: PointNet
![](https://velog.velcdn.com/images/onground/post/1db0c60a-5f5c-4339-8fa4-7a3eede7bd05/image.png)
- point cloud로 된 input을 받는다(P개의 points x 3(x,y,z 좌표)). 그리고 이를 가지고 classification을 한다.
- 여기에서 흥미로운 점은 point cloud input에서 P points set은 순서가 중요하지 않음.
- (x,y,z) 좌표가 있는 각각의 point들을 독립적으로 작은 MLP에 넣는다. 즉 P개의 작은 MLP에 독립적으로 연산시킨다. 그리고 D차원의 point feature을 얻는다.
- 이들을 전부
Max pooling
하여 D차원의 feature vector(pooled vector)을 만든다. 이를fc-layer
에 연결하여 class score을 구한다.
- 위의 방식은 하나의 매우 간단한 연산 층을 나타낸 것이고 보통 실제로는
- pooled vector을 갖고 와서 다시 모든 point features vector과 concatenate하고 다시 작은 MLP에 독립적으로 넣고 또 여러가지 Pooling을 거치는 과정을 반복한다.
2.6.2) Generating Pointcloud Outputs
![](https://blog.kakaocdn.net/dn/wEWn9/btsm9BcPPhX/9O9gZrZ4VoC0uHCV0zJxgk/img.png)
![](https://velog.velcdn.com/images/onground/post/41d8c184-66ea-48b3-8197-8a1648a861e6/image.png)
- RGB이미지를 input으로 넣어서 3d shape를 나타내는 pointcloud를 출력한다.
2.6.3) Predicting Point Clouds: Loss Function
- predicted point cloud와 GT point cloud 사이의 Loss를 계산하는 방식을 소개한다. pointclouds를 sets로 비교하고, 미분가능한 Loss가 필요하다.
- We need a (differentiable) way to compare pointclouds as sets!pointclouds를 비교할 때(S1,S2 를 비교) 보통 Chamfer distance를 사용한다.
![](https://velog.velcdn.com/images/onground/post/479964a1-7155-4bb1-9c1c-c45d4edfe51d/image.png)
- 우선 2 sets of points를 input으로 식에 넣는다(S1,S2). (파란색, 주황색)
- chamfer distance는 이 두개의 sets of points가 얼마나 다른지를 나타내준다.
- 먼저 식에서 첫번째 term은 각 blue points 에 대해 가장 가까운 orange point (nearest neighbor orange point)를 찾아서 둘 사이의 Euclidean distance를 계산.
- 그리고 이들 거리를 모두 더하는 과정이다.
![](https://velog.velcdn.com/images/onground/post/e8c38800-fdbf-4d94-869c-dbb4a9cb74ec/image.png)
- 두번째 term은 각 orange points 에 대해 가장 가까운 blue points 를 찾아 둘 사이의 Euclidean distance를 계산하고 이들을 모두 더한다.
- 그리고 이 두 term을 더해서 최종 Loss값이 나온다.
- 이 식에서 Loss=0이 되려면 두 pointclouds가 정확히 일치해야한다(coincide perfectly).
- 각 orange points가 정확히 각 blue points위에 있어야 한다(그 반대도).
2.7) 3D Shape Representations: Triangle Mesh
![](https://velog.velcdn.com/images/onground/post/00261aab-5ced-4c14-ab83-3722511ca76c/image.png)
![](https://velog.velcdn.com/images/onground/post/b78650da-2d90-4b6e-bf5f-66cb8e00e245/image.png)
![](https://velog.velcdn.com/images/onground/post/d7aa544b-e8b8-4a05-aa3d-e45552de31d4/image.png)
- 평평한 표면을 나타낼 때 효과적이고, 삼각형 Faces 의 크기를 조정하여 여러 detail을 표현할 수 있다.
![](https://velog.velcdn.com/images/onground/post/b5215b75-5a9e-4864-b893-52a8a81f6e74/image.png)
- 또한 각 vertex 에 feature이 포함되어있는 경우
coordinate interpolation
등을 사용하여 Faces (표면 전체)에 이들 정보를 넣어줄 수도 있는 장점이 있다. (위 지구 지도처럼 표면에 그림 정보들이 들었는 경우)
💢 하지만 쉽지 않다!
2.7.1) Predicting Meshes: Pixel2Mesh
![](https://velog.velcdn.com/images/onground/post/68ea9fc1-7efe-4dee-b058-a9fc3fb69ed6/image.png)
- single RGB이미지를 input으로 넣어 full 3d shape triangle mesh를 출력한다.
- 이들은 몇가지의 key ideas를 제시하였다.
1. Predicting Triangle Meshes: Iterative Refinement (반복적으로 mesh를 미세화)
- Predicting Triangle Meshes: Graph Convolution
- Graph Convolution의 Input은 각 vertex에 feature vector이 포함된 Graph이고, Output은 각 vertex에 대해 새로운 feature vector을 계산한다.
- 이때 각 vertex의 새로운 feature vector은 input graph의 local receptive field의 feature vector에 의존하여 계산된다.
- i′=W0fi+j∈N(i)∑W1fj 식에서 vi vertex의 feature fi와, vi의 neighboring vertices N(i)들의 features fj에 대해 weighted sum을 하여 new feature vector fi′를 계산한다.
- 네트워크의 각 block들은 위의 여러 층의 graph convolution layers를 포함하고 있으며 이를 통해 coordinate features를 변형한다.
- 그런데 어떻게 RGB input 이미지와 triangle mesh를 연결지을까?
- Predicting Triangle Meshes: Vertex-Aligned Features
![](https://velog.velcdn.com/images/onground/post/e80a659a-1efb-42ec-ab4c-b0d36106afe0/image.png)
- mesh의 모든 vertex에 대해 이미지로부터 feature vector(vertex의 위치에 있는 이미지가 어떻게 보이는지에 대한visual appearance)을 가져온다.
- 이를 위해 input 이미지를 2d CNN에 넣어 2d feature map을 얻는다.
- 그리고 mesh의 verticies를 image plane에 projection시킨다(3d → 2d projection operator).
- 2d image plane에 projection된 vertices를 각각 bilinear interpolation 을 사용해서 정확한 위치에 대한 image feature vector을 가져온다.
![](https://velog.velcdn.com/images/onground/post/1d7f970a-8804-4d4f-a4e4-e73bcf4e6ada/image.png)
- Predicting Meshes: Loss Function
- predict한 mesh와 Gt mesh를 비교하는데 한가지 문제점이 있다. 바로 같은 shape를 나타낼 수 있는 방법이 여러가지인 것이다.
- 예를 들어 사각형을 predict할 때 아래 그림처럼 여러 방법이 존재한다.
- 그리고 chamfer distance를 사용하여 이 두 point clouds를 비교한다.
- 그러나 문제가 있다.
1. Need to sample online! Must be efficient!
2. Need to backprop through sampling!
- GT mesh는 우리가 학습 이전에 offline에서 point sampling을 해줄 수 있지만 predited mesh의 points는 학습중에 online에서 sampling해야 한다.
- 따라서 이를 효율적으로 빠르게 하는 방법이 필요하고, 이들 points사이의 Loss를 사용하기 때문에 sampling에 따라 backprop이 진행된다.
3. Shape Comparison Metrics
3.1) Shape Comparison Metrics: Intersection over Union
![](https://blog.kakaocdn.net/dn/cxbIwS/btsm9vcCb69/4GKynmachAz0chejnVa7nk/img.png)
- 우리는 2D이미지를 다룰 때 IoU를 사용하여 성능을 측정하는 방법을 다루었었다.
- 그러나 3D에서는 IoU는 그다지 의미있거나 유용한 metric은 아니다.
![](https://blog.kakaocdn.net/dn/yB693/btsm7xJhLKl/IXoOhgHj3erKNcxxwLxOHK/img.png)
3.2) Shape Comparison Metrics: Chamfer Distance
![](https://velog.velcdn.com/images/onground/post/1faeb94d-6070-44d7-b33b-fb5652716fe7/image.png)
- 이전에 봤던 것처럼 서로 다른 3d shape representations에 points를 sampling하여 point clouds를 만들고 이들을 비교한다.
- 그러나 L2 distance를 사용하기 때문에 outliers에 매우 sensitive하다.
3.3) Shape Comparison Metrics: F1 Score (Best)
![](https://blog.kakaocdn.net/dn/vn9wE/btsm7xJhLMC/nBvivs7rZwY2biLg53a2U0/img.png)
- Chamfer distance를 계산하는 것과 비슷하게 우선 prediction과 GT에서 points를 sampling한다.
![](https://blog.kakaocdn.net/dn/8oeos/btsm4BL1dkQ/bckVYbpsaTZp735G4PAc8k/img.png)
- 그리고 predicted points에 일정 크기의 원을 할당하여 만약 여기 안에 GT point가 들어온다면 그 point는 true predicted point로 설정한다.
- 위 그림에서는 4개의 predicted points중에 3개의 predicted points가 true이므로 Precision = 3/4 이다.
![](https://blog.kakaocdn.net/dn/LnAqF/btsnbOCscbC/AjakzgCzb4DDbqMD0VPEu0/img.png)
- Recall은 GT points에 일정 크기의 원을 할당하여 여기 안에 predicted point가 들어오면 true로 한다. 위 그림에서 Recall = 2/3 이다.-
![](https://blog.kakaocdn.net/dn/bDxLh8/btsm7wp46uQ/3A1jdWpDtyEvK191prVjm1/img.png)
- F1 score은 outliers에 robust하기 때문에 가장 좋은 metric이라고 할 수 있다.
4. Cameras
View Coordinates :카메라의 viewpoint를 기준으로 방향이 결정된다.
4.1) Cameras: Canonical vs View Coordinates
![](https://blog.kakaocdn.net/dn/tfNMd/btsm8gUMhoH/w8pGPcHiGQTWlpO524m3a1/img.png)
⇒ 많은 논문에서는 Coordinates 위 방식을 사용한다고 함
- 그러나 canonical coordinates는 카메라의 viewpoint와 predicted 3d shape의 방향이 서로 align되지 않는 문제가 있다.
- 대신에 view coordinates는 input과 prediction사이에 view coordinates가 유지된다는 장점 존재
![](https://blog.kakaocdn.net/dn/TfBNM/btsm92OKkH4/spBi9IfiUi3vW0q8pcJvW1/img.png)
- 실제로 view coordinates를 사용하여 학습시킨 결과가 더 좋은 부분이 있는 것을 확인할 수 있다. 새로운 shape이나 categories에 대해 일반화가 더욱 잘된다.
- 따라서 view coordinate system을 선호하여 사용하라고 한다.
4.2) View-Centric Voxel Predictions
![](https://blog.kakaocdn.net/dn/1wYfB/btsnaSLSurF/O8IJQdCpdXw7qzwhnsSIJk/img.png)
5. 3D Datasets
5.1) 3D Datasets: Object-Centric
![](https://blog.kakaocdn.net/dn/ekdKeE/btsnaRMXSJu/dz7KAkquNH5nQNcjkY1Quk/img.png)
6. 3D Shape Prediction: Mesh R-CNN
※ Mask R-CNN은 객체 검출(Object Detection)과 객체 분할(Object Segmentation)을 동시에 수행하는 딥러닝 기반의 모델로, 객체의 경계 상자를 찾고 객체 내부의 픽셀 수준에서의 분할 마스크를 생성하는 기술
![](https://blog.kakaocdn.net/dn/m9dLC/btsm8IwX0w7/mtHELzwonwhxhKfKKVAGvk/img.png)
- Mask R-CNN을 기반으로 하여 Mesh head를 추가함. 여기에서 3D triangle mesh를 output으로 출력
6.1) Mesh R-CNN: Hybrid 3D shape representation
![](https://blog.kakaocdn.net/dn/eE0MjU/btsm8Kn0ZKk/8fqmUlnoldqnMkHS089Kck/img.png)
- Mesh R-CNN에서는 Hybrid 3D shape representation을 사용한다.
- 앞서 다루었던 triangle mesh의 Mesh deformation은 initial mesh의 topology(위상)에 고정되어있다는 문제가 존재함. ⇒ 변형이 어렵다는 단점 . 고정되어 있기에
- 따라서 Mesh R-CNN에서는 coarse voxel prediction을 먼저 만들고, 이를 mesh(점)로 convert시켜준다. 그리고 이를 initial mesh로 사용한다.
6.2) Mesh R-CNN Pipeline
![](https://blog.kakaocdn.net/dn/kI3QB/btsm9fgIFUo/pwvP8hjl7raYBkE65t155K/img.png)
- 2D object recognition까지는 기존 mask R-CNN과 동일하다 (RPN을 사용한다던지 등..)
- 그런데 이제 여기에서 voxel tube network 를 사용하여 coarse voxel prediction을 진행한다.
- 그리고 이를 blocky mesh representation으로 convert시키고 initial mesh로 사용한다.
- 최종적으로 3d object meshes를 출력한다.
![](https://blog.kakaocdn.net/dn/bzqNUO/btsnaMrnZFI/7FNGp7KcydPTskR0nvwfXK/img.png)
- 그리고 Chamfer Loss만 사용하지 않고 mesh regularizer을 추가로 사용하여 더 좋은 prediction결과를 얻음
6.3) Mesh R-CNN Results
![](https://velog.velcdn.com/images/onground/post/7e37d7ab-c521-4e3f-832b-59f8761b5808/image.png)
- sphere로 initial mesh를 주는 Pixel2Mesh와 비교해보면 이미지의 물체에 있는 구멍을 잘 표현하는 것을 볼 수 있다. sphere로 initialize된 mesh는 위상적으로 구멍을 만들어낼 수 없다.
![](https://velog.velcdn.com/images/onground/post/240f9288-c904-40ef-adf5-d0b521df706b/image.png)
- 물체의 보이지 않는 뒷부분까지 mesh로 출력할 수 있다.
![](https://velog.velcdn.com/images/onground/post/ca6076c4-89f6-478d-8d02-118ebe580dc1/image.png)
- object detection으로 많은 objects를 predict할 수 있지만 완벽하지는 않다.
![](https://velog.velcdn.com/images/onground/post/ddfed5ce-1159-4419-b731-e396d3a3addf/image.png)
- Amodal completion 이라는 특징을 갖는다. 위 그림처럼 개에게 가려진 소파이지만 가려진 부분도 predict가 가능하다.
![](https://velog.velcdn.com/images/onground/post/1f2691ee-a394-4719-be15-3da702c40295/image.png)
- 그러나 위 그림에서 segmentation fail이 mesh prediction fail로 이어지는 것처럼 2D recognition fails가 3d recognition fail를 불러옴
정리
![](https://blog.kakaocdn.net/dn/NvxzP/btsm8Jo6DS3/rQ5yEbbZIXgpJJF2K9M1lk/img.png)
https://velog.io/@onground/EECS-498-007-598-005-강의정리-17강-3D-Vision#5-3d-datasets
이 분 정리된거 한줄 한줄 가져오면서 이해하였음. 정말 감사합니다.
영어 자막은 .. 못보겠음
'Deep Learning > [D&A] 2023 Conference' 카테고리의 다른 글
[4주차] <주제 변경> 체형별 옷입히기 사전 조사 (0) | 2023.08.10 |
---|---|
[3주차] 건물 3D화 모델 찾기 (1) | 2023.07.28 |
[2주차] 3D Generation Model Github 탐색 (1) | 2023.07.17 |
[1주차] NeRF: Representing Scenes asNeural Radiance Fields for View Synthesis (0) | 2023.07.13 |