HyperAI초신경

PyTorch3D 스테레오 암묵적 모양 렌더링: 장면 3D 구조를 구축하는 방법을 알려드립니다.

4년 전
대형 공장 뉴스
정보
Yang Bai
特色图像

내용물

3D 딥러닝은 머신 비전 분야에서 항상 어려운 문제였습니다. 장면의 3차원 모델을 정확하고 효율적으로 구축하고 비교적 사실적인 렌더링 결과를 얻기 위해 업계의 일부 주요 제조업체는 연구 개발 결과를 잇따라 오픈 소스로 공개했습니다.

하지만 현실 세계에서는 물체가 대부분 3차원 구조의 형태로 존재합니다.AI 시스템이 복잡한 실제 환경을 인식하고 이해하고 3D 이미지를 올바르게 처리하는 능력을 정확하게 개선하는 방법,이는 점점 더 심각한 기술적 어려움이 되어가고 있습니다.

2019년 Facebook AI는 3D 객체 감지 및 모양 예측을 위한 Mesh R-CNN 모델을 출시했습니다.

2020년 1월 23일, Facebook AI는 PyTorch3D v0.1.0을 출시했습니다. PyTorch3D는 PyTorch의 최적화되고 효율적이며 재사용 가능한 구성 요소 라이브러리입니다. 이 시스템은 높은 효율성, 모듈성, 차별화 가능성이라는 세 가지 뛰어난 특징을 가지고 있습니다.PyTorch에서 3D 딥러닝을 단순화하는 것을 목표로 합니다.

PyTorch3D는 3D 연산자와 렌더링이라는 두 가지 주요 구성 요소를 제공합니다.

3D 연산자에서는Fit Mesh는 3D 손실 함수를 사용할 수 있습니다.몇 가지 규칙을 사용하여 원래 모양을 대상 모양으로 변형한 다음 대상 모양을 더 매끄럽게 만듭니다.3D 연산자에서의 번들 조정 방법, 그런 다음 제공합니다 카메라 , 변형하다 , 소3  총 3개의 API가 있는데, 이는 주어진 카메라의 관점을 기반으로 카메라의 관점 매핑을 형성하여 장면의 3D 구조를 추론합니다.

렌더링에는 텍스처 메시 렌더러(Render Textured Meshes), DensePose 메시 렌더러(Render DensePose Meshed), 컬러 포인트 클라우드 렌더러(Render Colored Pointclouds) 등이 포함됩니다.이러한 렌더러의 도움으로 장면의 3D 구조를 더욱 최적화할 수 있습니다.

2020년 2월 6일, PyTorch3D 관련 코드가 GitHub에 오픈 소스로 공개되었습니다. 5차례의 반복을 거쳐, 2021년 2월 9일 PyTorch3D는 여섯 번째 공개 버전 v0.4.0을 출시했습니다.새로운 기능으로는 암시적 함수, 스테레오 렌더링, NeRF 재구현이 있습니다.3D 딥러닝 연구를 위한 더 빠르고 유연한 오픈소스 라이브러리를 제공합니다.

  이 이미지는 PyTorch3D의 암묵적 스테레오 렌더러에서 생성된 PyTorch3D 로고를 보여줍니다.

암시적 모양 렌더링

암묵적 모양 렌더링은 입력 장면의 새로운 관점을 기반으로 3D 장면의 사실적인 렌더링을 생성하는 프로세스입니다.핵심 아이디어는 신경망과 미분 가능한 렌더링을 사용하여 3D 장면 표면의 암묵적 형태를 재구성하는 것입니다.이를 통해 2D 뷰만을 사용하여 3D 장면의 기하학을 학습하는 것이 가능해졌습니다.

암묵적 모양 렌더링을 수행하려면 몇 가지 핵심 구성 요소가 필요합니다.볼륨 데이터와 미분 가능한 암묵적 모양 렌더러에 대한 추상화가 포함되어 있습니다.

업계 실무자들이 암묵적 모양 렌더링을 실험하기 쉽도록 하기 위해PyTorch3D는 이미 사용자에게 일반적으로 사용되는 일련의 3D 연산자와 손실 함수, 그리고 모듈식이고 미분 가능한 렌더링 API를 제공합니다.이 책은 핵심적인 재사용 가능 구성요소를 지적하는 동시에 이러한 구성요소의 검증되고 표준화된 구현 방법도 제공합니다.

PyTorch3D v0.4.0에는 암묵적 모양 렌더링을 지원하는 5가지 새로운 기능이 추가되었습니다.

1. 데이터 볼륨 구조 추가 (볼륨 데이터 구조), 3D 볼륨의 일괄 처리와 좌표 프레임 간 변환을 지원합니다.

2. 다중 레이 텍스처 구현 방법 추가: GridRaysampler, MonteCarloRaysampler, NDCGridRaysampler

3. 여러 Raymarcher 구현 메서드 추가: AbsorptionOnlyRaymarcher, EmissionAbsorptionRaymarcher

4. 암시적 렌더러 추가(암시적 렌더러) 및 볼륨 렌더러(볼륨렌더러) Raysampler와 Raymarcher로 구성된 API

5. 점군에서 체적으로의 미분 가능한 변환 등 다양한 유틸리티 기능이 추가되었습니다.

PyTorch3D를 사용하여 생성된 도넛 3D 이미지

이러한 새로운 구성 요소를 사용하려면 모듈식으로 잘 문서화된 NeRF 재구현이 필요합니다.

NeRF는 딥러닝 모델이다.Google 연구팀이 개발한 이 기술은 뷰 합성을 위해 신경 복사장을 사용하여 장면을 표현하는 것을 목표로 합니다.
NeRF는 구조화되지 않은 이미지 컬렉션만을 사용하여 복잡한 3D 장면 그래프를 합성할 수 있습니다.
개선된 버전의 NeRF는 성능이 크게 향상되어 다시 구현되었습니다. 출력 이미지의 품질을 보장하는 동시에 공식 버전보다 빠르게 실행됩니다.

PyTorch3D의 NeRF를 사용하여 모양과 조명이 있는 복잡한 3D 이미지의 예를 생성하도록 다시 구현했습니다.

튜토리얼(텍스처 볼륨 맞춤)

PyTorch3D GitHub 공식 튜토리얼인 Fit Textured Volume을 기반으로 PyTorch3D의 사용법을 보여주기 위해 번역하고 구성했습니다.미분 가능한 스테레오 렌더링을 사용하여 장면의 뷰 집합이 주어졌을 때 장면의 스테레오 구조를 예측합니다.

Raymarching을 사용하여 3D 장면 구조 구축 이 튜토리얼에서는 다음 사항을 소개합니다.

  • 차별화 가능한 볼륨 렌더러를 만드는 방법
  • 볼륨 모델을 만드는 방법(Volumes 클래스를 사용하는 방법 포함)
  • 미분 가능한 스테레오 렌더러를 사용하여 이미지에서 스테레오 구조를 맞춥니다.
  • 예측된 3차원 구조를 시각화합니다.

참고: 공간이 제한되어 있으므로 이 문서에서는 코드의 일부만 보여드립니다. 전체 코드를 확인하세요여기를 클릭하세요.

0. 모듈 설치 및 가져오기

설치되어 있는지 확인하세요  토치   그리고  토치비전  .

설치되지 않은 경우  파이토치3d , 설치해 주세요.

1. 장면과 마스크 이미지 생성

다음 코드는 훈련 데이터를 생성합니다. 그것은 지나갈 것이다  fit_textured_mesh.ipynb   여러 각도에서 소의 이미지를 렌더링하고 다음을 반환하는 튜토리얼:

소 메시 렌더러에서 생성된 이미지 텐서 시리즈와 실루엣. 모든 카메라 샷에 대한 일대일 대응.

메모:  생성_소_렌더링   함수에 구현된 메시 렌더링의 작동 원리에 대해서는 다음을 참조하세요.
 fit_textured_mesh.ipynb 

target_cameras, target_images, target_silhouettes = generate_cow_renders(num_views=40)
print(f'Generated {len(target_images)} images/silhouettes/cameras.')

2. 볼륨 렌더러 초기화

볼륨 렌더러를 초기화하면 대상 이미지의 각 픽셀에서 광선이 내보내지고 광선을 따라 균일하게 간격이 떨어진 점 집합이 샘플링됩니다. 각 광선 지점에 해당하는 밀도 값과 색상 값은 장면의 볼륨 모델에서 해당 위치를 쿼리하여 얻을 수 있습니다.

렌더러는 다음으로 구성됩니다. 레이마처  그리고 레이샘플러  구성하다.

레이샘플러  이미지 픽셀에서 광선을 방출하고 광선을 따라 포인트를 샘플링하는 역할을 담당합니다. 여기서 사용된 것은  NDCGridRaysampler 이는 표준 PyTorch3D 좌표 격자 사양을 준수합니다.

레이마처  광선 샘플의 밀도와 색상을 가져와서 모든 광선을 광선이 나온 픽셀의 색상과 불투명도 값으로 렌더링합니다. 여기서 사용되는 것은  방출흡수레이마처 표준을 구현하는  방출-흡수 레이마칭   연산.

# render_size 表示渲染图像各个边的像素大小,将其设置为与目标图像尺寸一致
# 也就是说将其渲染成与基准图像一样的尺寸
render_size = target_images.shape[1]

# 渲染场景以(0,0,0)为中心,被限定在一个边长约等于 3.0 (国际单位) 的边框内。
volume_extent_world = 3.0

# 1) 实例化 raysampler
# 此处 NDCGridRaysampler 会生成一矩形图像网格的射线,其坐标遵循 pytorch3d 坐标规定
# 由于此处设定的体积是 128^3,因此取样 n_pts_per_ray=150
# 大致相当于每个体素都有一个射线点
# 进一步设置 min_depth=0.1,因为相机平面内的所有表面都超过了 0.1 单位
raysampler = NDCGridRaysampler(
    image_width=render_size,
    image_height=render_size,
    n_pts_per_ray=150,
    min_depth=0.1,
    max_depth=volume_extent_world,
)


# 2) 实例化 raymarcher.
# 此处用的是标准 EmissionAbsorptionRaymarcher 
# 它会沿着每条射线前进
# 将每条射线都渲染成一个单一的 3D 颜色向量和一个不透明度标量
raymarcher = EmissionAbsorptionRaymarcher()

# 最后,用 raysampler 和 raymarcher 实例化体积渲染器
renderer = VolumeRenderer(
    raysampler=raysampler, raymarcher=raymarcher,
)

3. 볼륨 모델 초기화

다음으로, 장면의 볼륨 모델을 인스턴스화합니다. 이를 통해 3D 공간이 볼륨 픽셀로 양자화되고, 각 폭셀은 폭셀의 RGB 색상의 3D 벡터와 폭셀의 불투명도를 설명하는 밀도 스칼라(범위 [0-1], 숫자가 높을수록 불투명도가 높음)로 표현됩니다.

밀도와 색상 값이 [0-1] 범위에 있도록 하기 위해 볼륨 색상과 밀도를 대수 공간으로 표현합니다. 모델 실행  앞으로   기능, 로그 공간   값이 전달됩니다  시그모이드   함수 전달이므로  로그 공간   값이 올바른 범위 내에 있습니다.

또한,  볼륨모델   또한 렌더러 객체를 포함합니다. 이 객체는 최적화 과정 전체에서 변경되지 않습니다.

이 코드 섹션에서는 다음도 정의합니다.  후버   손실 함수는 렌더링된 색상과 마스크의 차이를 계산합니다.

4. 볼륨 피팅

이 단계에서는 미분 가능한 렌더링을 사용하여 볼륨 피팅을 수행합니다.

볼륨에 맞추려면 다음부터 시작합니다.  타겟 카메라   렌더링은 다음의 관점에서 수행됩니다.  대상 이미지   그리고  타겟 실루엣   비교를 위해.

이 비교는 다음에 의해 평가됩니다.  대상 이미지/렌더링된 이미지   그리고  타겟 실루엣/렌더링된 실루엣   이는 두 가지 사이의 평균 Huber(smooth-L1) 오차를 구하여 수행됩니다.

5. 최적화된 장면 볼륨을 시각화합니다.

마지막으로, 최적화된 볼륨은 장면 볼륨을 y축을 기준으로 회전하고 여러 관점에서 렌더링하여 시각화됩니다.

def generate_rotating_volume(volume_model, n_frames = 50):
    logRs = torch.zeros(n_frames, 3, device=device)
    logRs[:, 1] = torch.linspace(0.0, 2.0 * 3.14, n_frames, device=device)
    Rs = so3_exponential_map(logRs)
    Ts = torch.zeros(n_frames, 3, device=device)
    Ts[:, 2] = 2.7
    frames = []
    print('Generating rotating volume ...')
    for R, T in zip(tqdm(Rs), Ts):
        camera = FoVPerspectiveCameras(
            R=R[None], 
            T=T[None], 
            znear = target_cameras.znear[0],
            zfar = target_cameras.zfar[0],
            aspect_ratio = target_cameras.aspect_ratio[0],
            fov = target_cameras.fov[0],
            device=device,
        )
        frames.append(volume_model(camera)[..., :3].clamp(0.0, 1.0))
    return torch.cat(frames)
    
with torch.no_grad():
    rotating_volume_frames = generate_rotating_volume(volume_model, n_frames=7*4)

image_grid(rotating_volume_frames.clamp(0., 1.).cpu().numpy(), rows=4, cols=7, rgb=True, fill=True)
plt.show()

6. 결론

이 튜토리얼에서는 알려진 관점에 대한 볼륨 렌더링이 각 관점에 대한 관찰된 이미지와 일치하도록 장면의 3D 볼륨 구성을 최적화하는 방법을 보여줍니다.

튜토리얼의 렌더링은 다음을 사용하여 수행되었습니다.  NDCGridRaysampler   그리고   방출흡수레이마처   구성된 PyTorch3D 스테레오 렌더러가 완성되었습니다.

2D 이미지에서 질감이 있는 3D 모양 구성

전체 튜토리얼을 보세요여기를 클릭하세요.