[AITech][CV] 20220316 - Part 8) 3D Understanding

5 minute read


**본 포스팅은 POSTECH ‘오태현’ 강사 님의 강의를 바탕으로 작성되었습니다. **

3D Understanding

이번 포스팅의 내용은 3D Understanding입니다.

우리가 살고 있는 세계는 3D 좌표계에 있습니다. 따라서, 자율주행 자동차나 3D 프린터 등 우리가 실생활의 편의를 위해 개발하는 인공지능 역시 3D 환경에서 잘 동작할 수 있어야 하며, 그러기 위해서는 3D 환경을 잘 이해하고 다룰 수 있는 컴퓨터 비전 모델이 필요합니다.

이번 강의에서는 컴퓨터에서 3D data의 표현 방법, 다양한 3D dataset들 및 대표적인 3D task (3D object detection, 3D segmentation…)들과 해당하는 모델들을 소개합니다.

먼저 포스팅하기 앞서, 본 강의에서 추천해주신 Multiple View Geometry라는 책을 소개하겠습니다. 난이도가 쉽지는 않지만, computer vision 분야의 3D understanding에서의 바이블 같은 책이자 쉽게 pdf를 구할 수 있다고 하니 관심 있으신 분들은 아래 책을 보시는 것을 추천드립니다.

image-20220317114217897

Seeing the world in 3D perspective

3D data representation

우리가 살고 있는 세상은 3D 세상이기 때문에 공간을 인식하는 것은 매우 중요한 일입니다. 이런 3D application에는 AR/VR, 3D printing, Medical applications, image projection 등 다양한 분야들이 있습니다.

그렇다면 이러한 3D data를 표현하는 방법에는 무엇이 있을까요? 대표적으로 다음의 6가지 방법을 들 수 있습니다.

  • Multi-view images: 물체를 다각도에서 바라본 여러 장의 2D 이미지로 표현
  • Volumetric(voxel): 3차원 공간을 격자로 나누어 물체가 있는 격자는 1, 없는 격자는 0으로 표현
  • Part assembly: 물체의 여러 개의 도형의 조합으로 표현
  • Point cloud: 물체 표면을 여러 개의 좌표 (x, y, z) 로 표현
  • Mesh(Graph CNN): 물체 표면을 여러 개의 좌표 (x, y, z)로 표현한 점을 node, 그 node들은 이은 선분을 edge로 graph 구조로 표현. 많은 경우에 3개의 node를 연결해 삼각형으로 면을 표현.
  • Implicit shape: 물체 표면을 어떤 함수와 0 축과의 교점(평면)으로 표현

image-20220316233953119

3D datasets

3D 형태의 데이터셋에는 무엇이 있는지 알아보겠습니다.

우선 물체를 3D 형태로 나타낸 데이터셋으로는 ShapeNet(51,300 3D models with 55 categories), PartNet(573,585 part instances in 26,671 3D models)이 있습니다. 그 중 PartNet은 3D 물체를 instance segmentation처럼 각 부분으로 나누어 표현해서, segmentation task에 유용하게 사용됩니다.

image-20220316234312077

실내 공간을 3D 형태로 나타낸 데이터셋에는 SceneNet(5M RGB-Depth synthetic indoor images), ScanNet(RGB-Depth dataset with 2.5M view obtained from more than 1500 scans)이 있습니다.

image-20220316234636243

마지막으로 실외 공간을 3D 형태로 나타낸 데이터셋에는 KITTI, Semantic KITTI, Waymo Open Dataset 등이 있습니다.

image-20220316234722827


3D tasks

2D image를 가지고 했던 task들을 3D data를 가지고도 할 수 있습니다.

3D recognition

3D data에 Volumetric CNN 모델을 사용하여 Classification task를 수행할 수 있습니다.

image-20220316235459502

3D object detection

3D object detection도 가능합니다. 주로 자율 주행 분야에 유용하게 사용됩니다.

image-20220316235551680

3D sementic segmentation

마찬가지로 3D semantic segmentation도 가능합니다.

image-20220316235623696

Conditional 3D generation

3D 생성 모델도 만들 수 있습니다.

먼저 소개할 모델은 Mesh R-CNN으로, 2D image를 input으로 넣어주면 3D Mesh를 output으로 출력하는 모델입니다.

image-20220316235820072

R-CNN 계열의 모델인 만큼, Mask R-CNN에 3D branch를 추가하는 것 만으로 간단히 구현할 수 있습니다.

image-20220316235959226

또 다른 접근 방식을 사용하는 모델들도 있습니다.

대표적으로 2D Image를 Multi-task head로 물리적으로 의미있는(physically meaningful) 여러 개의 특징(Surface normal, depth, silhouette, …)으로 나누어서 구한 뒤에, 그 결과들을 취합하여 더욱 정교화된 결과를 구할 수도 있습니다.

또는 Spherical Map이라는 것을 중간 단계에 구해서 이를 이용하는 모델도 있습니다. 공통적인 것은 중간 단계에서 physically meaningful한 feature들을 추출(sub-task)하여 이로부터 3D reconstruction을 수행(goal)하는 것입니다.

image-20220317000628196

Photo refocusing

마지막으로 살펴 볼 것은 photo refocusing입니다. Photo refocusing은 아래와 같이 우리가 설정한 거리 범위 내에 있는 물체에만 focusing하고 나머지 물체는 defocusing하는 것입니다.

image-20220317001853217

Photo refocusing은 depth map을 사용하여 수행 할 수 있습니다. 그 과정을 순서에 따라 보도록 하겠습니다.

1. Set a depth threshold range [Dmin, Dmax] you want to focus

첫번째 단계에서는 focusing하고 싶은 거리 범위를 설정합니다. 우리가 사용할 depth map의 depth 값은 보통 0~255 사이의 정수값으로 nomalize하여 사용합니다.

헷갈릴 수 있는데, depth map의 값은 0에 가까울수록 어둡고(멀고) 255에 가까울수록 밝습니다(가깝습니다).

image-20220317002254787

2. Compute a mask of “focusing area” and “defocusing area” by depth map thresholding

두번째 단계에서는 앞서 설정한 거리 범위를 이용해 depth map으로부터 “focusing area mask”와 “defocusing area mask”를 구합니다.

image-20220317002407983

# 여기서는 D_max 값만 사용
focus_mask = depth_map[..., :] > threshold_value
defocus_mask = depth_map[..., :] <= threshold_value

3. Generate a blurred version of the input image

세번째 단계에서는 4단계에서 사용할 image의 blurred version을 생성합니다. kernel size는 하이퍼파라미터입니다.

image-20220317002647654

blurred_image = cv2.blur(original_image, (20,20))

4. Compute “Masked focused image” and “Masked defocused image”

Masked focus image는 focusing area mask에 original image를 곱해서 구합니다.

Masked defocused image는 defocusing area mask에 blurred image를 곱해서 구합니다.

image-20220317002910313

focused_with_mask = focus_mask * original_image
defocused_with_mask = defocus_mask * blurred_image

5. Blend masked images to generate a refocused image

마지막 5단계에서는 4단계에서 구한 두 이미지를 더해서 최종 refocused image를 생성합니다.

image-20220317003133249

defocused_image = focused_with_mask + defocused_with_mask


실습) Re-focusing Using Depth Map

앞에서 살펴 본 photo refocusing에 대한 실습을 진행합니다.

이미지 가져오기

Photo refucusing을 위해서는 original image와 그에 대응하는 depth map이 있어야 합니다.

image-20220317153138793

Depth map histogram

물체들의 거리 분포를 알고 싶을 때는 depth map을 histogram으로 표현하여 시각화하면 많은 도움이 됩니다.

plt.hist(depth_map.reshape(-1), bins=100)
plt.ylabel('Frequency')
plt.xlabel('Pixel intensity')
plt.show()

image-20220317153246627

크게 [0, 50], [50, 150], [150, 255]의 세 구간으로 나눌 수 있습니다. 다시 한 번 말하지만, 값이 클수록 가까이에 있는 것입니다.

Focusing the object in the middle of the image

이번 실습에서는 가운데 있는 물체에 focusing 해보겠습니다. 아래와 같은 코드로 [50, 150] 구간에 있는 물체를 나타내는 object_mask와 그 밖에 있는 물체를 나타내는 background_mask를 구합니다.

object_mask = np.where((50 < depth_map) & (depth_map < 150), 1, 0).astype("uint8")
background_mask = (np.invert(object_mask) + 2).astype("uint8")
# object_mask = (50 < depth_map) & (depth_map < 150)
# background_mask = np.invert(object_mask)

그리고 아래와 같은 코드로 refocused_image를 얻을 수 있습니다.

refocused_image = (original_image*object_mask) + (blurred_image*background_mask)

image-20220317153831383

Alpha-blending

앞서 만든 focusing 이미지는 단순히 각 영역에 대해 원본 이미지의 값을 사용할 지 혹은 blur 처리된 값을 사용할 지 양자택일한 결과이기 때문에 focusing 정도를 조절할 수 없습니다.

따라서 0~1 사이의 alpha 값을 이용하여 focusing 정도를 조절하고자 합니다 (1에 가까울수록 강하게 focusing).

가장 앞에 있는 동상에 focusing 정도를 조절하도록 간단하게 아래와 같은 코드로 구현할 수 있습니다.

for alpha in [0.2, 0.4, 0.6, 0.8, 1]:
  object_mask_w_alpha = alpha * (depth_map > 150).astype(np.float32)
  background_mask_w_alpha = (1-object_mask_w_alpha)

  defocused_image_w_alpha = (object_mask_w_alpha * original_image) + (background_mask_w_alpha * blurred_image)
  defocused_image_w_alpha = defocused_image_w_alpha.astype(np.uint8)

  show_image(defocused_image_w_alpha, 'Refocused Image with Alpha Blending (alpha=%s)' % alpha)

image-20220317154330808

image-20220317154341444

image-20220317154353244



참고 자료

  • 3D understanding

    • Chang et al., ShapeNet: An Information-Rich 3D Model Repository, ArXiv 2015

    • Mo et al., PartNet: A Large-Scale Benchmark for Fine-Grained and Hierarchical Part-Level 3D Object Understanding, CVPR 2019
    • McCormac et al., SceneNet RGB-D: Can 5M Synthetic Images Beat Generic ImageNet Pre-Training on Indoor Segmentation?, ICCV 2017

    • Dai et al., ScanNet: Richly-Annotated 3D Reconstructions of Indoor Scenes, CVPR 2017
  • 3D tasks

    • Gkioxari et al., Mesh R-CNN, ICCV 2019

    • Wu et al., MarrNet: 3D Shape Reconstruction via 2.5D Sketches, NeurIPS 2017

    • Zhang et al., Learning to Reconstruct Shapes from Unseen Classes, NeurIPS 2018


Categories: ,

Updated:

Leave a comment