HyperAI

PyTorch3D Stereo Implicit Shape Rendering: Lernen Sie, Eine 3D-Szenenstruktur Zu Erstellen

vor 4 Jahren
Große Fabrikangelegenheiten
Information
Yang Bai
特色图像

Inhalt

3D-Deep-Learning war im Bereich der maschinellen Bildverarbeitung schon immer ein schwieriger Punkt. Um ein dreidimensionales Modell der Szene präzise und effizient zu erstellen und relativ realistische Rendering-Ergebnisse zu erzielen, haben einige große Hersteller der Branche ihre Forschungs- und Entwicklungsergebnisse sukzessive als Open Source veröffentlicht.

In der realen Welt existieren Objekte jedoch meist in Form von 3D-Strukturen.Wie die Fähigkeit des KI-Systems, komplexe reale Umgebungen wahrzunehmen und zu verstehen und 3D-Bilder korrekt zu verarbeiten, präzise verbessert werden kann,Es handelt sich um eine zunehmend kritische technische Schwierigkeit.

Im Jahr 2019 veröffentlichte Facebook AI das Mesh R-CNN-Modell zur 3D-Objekterkennung und Formvorhersage

Am 23. Januar 2020 hat Facebook AI PyTorch3D v0.1.0 veröffentlicht. PyTorch3D ist eine optimierte, effiziente und wiederverwendbare Komponentenbibliothek in PyTorch. Es verfügt über drei herausragende Eigenschaften: hohe Effizienz, Modularität und Differenzierbarkeit.Ziel ist es, 3D-Deep-Learning in PyTorch zu vereinfachen.

PyTorch3D bietet zwei Hauptkomponenten: 3D-Operatoren und Rendering.

Bei 3D-OperatorenFit Mesh kann die 3D-Verlustfunktion verwenden,Verformen Sie die ursprüngliche generische Form in die Zielform und machen Sie die Zielform mit Hilfe einiger Regeln glatter.Die Bündelausgleichsmethode in 3D-Operatoren, dann bietet Kameras , Transformationen , so3  Insgesamt gibt es 3 APIs, die basierend auf der Perspektive einer bestimmten Kamera eine Abbildung der Kameraperspektive erstellen und so auf die 3D-Struktur der Szene schließen.

Das Rendering umfasst Texture Mesh Renderer (Render Textured Meshes), DensePose Mesh Renderer (Render DensePose Meshed), Color Point Cloud Renderer (Render Colored Pointclouds) usw.Mit Hilfe dieser Renderer kann die resultierende 3D-Struktur der Szene weiter optimiert werden.

Am 6. Februar 2020 wurden PyTorch3D-bezogene Codes auf GitHub als Open Source veröffentlicht. Nach 5 Iterationsversionen veröffentlichte PyTorch3D am 9. Februar 2021 seine sechste öffentliche Version v0.4.0.Zu den neuen Funktionen gehören implizite Funktionen, Stereo-Rendering und NeRF-Neuimplementierung.Bietet eine schnellere und flexiblere Open-Source-Bibliothek für die 3D-Deep-Learning-Forschung.

  Das Bild zeigt das PyTorch3D-Logo, das vom impliziten Stereo-Renderer von PyTorch3D generiert wurde.

Implizites Shape-Rendering

Implizites Shape-Rendering ist der Prozess der Generierung realistischer Renderings von 3D-Szenen basierend auf neuen Perspektiven der Eingabeszene.Die Kernidee besteht darin, neuronale Netzwerke und differenzierbares Rendering zu verwenden, um die implizite Form der 3D-Szenenoberfläche zu rekonstruieren.Dadurch ist es möglich, die Geometrie von 3D-Szenen nur anhand von 2D-Ansichten zu erlernen.

Für die implizite Formwiedergabe sind mehrere Schlüsselkomponenten erforderlich.Enthält Abstraktionen für Volumendaten und differenzierbare implizite Formrenderer.

Um es Branchenpraktikern zu erleichtern, mit impliziter Formwiedergabe zu experimentieren,PyTorch3D bietet Benutzern bereits eine Reihe häufig verwendeter 3D-Operatoren und Verlustfunktionen sowie eine modulare und differenzierbare Rendering-API.Es weist auf die wiederverwendbaren Kernkomponenten hin und bietet auch bewährte, standardisierte Implementierungsmethoden für diese Komponenten.

In PyTorch3D v0.4.0 gibt es 5 neue Funktionen, die implizites Form-Rendering unterstützen:

1. Datenvolumenstruktur hinzugefügt (Datenstruktur der Volumes), unterstützt die Stapelverarbeitung von 3D-Volumina und die Konvertierung zwischen Koordinatenrahmen;

2. Mehrere Methoden zur Implementierung von Strahlentexturen hinzugefügt: GridRaysampler, MonteCarloRaysampler, NDCGridRaysampler

3. Mehrere Raymarcher-Implementierungsmethoden hinzugefügt: AbsorptionOnlyRaymarcher, EmissionAbsorptionRaymarcher

4. Impliziter Renderer hinzugefügt (ImplicitRenderer) und Volumenrenderer (VolumeRenderer) API, die aus Raysampler und Raymarcher besteht

5. Mehrere Hilfsfunktionen hinzugefügt, wie z. B. die differenzierbare Konvertierung von Punktwolken in Volumen.

Mit PyTorch3D erstelltes Donut-3D-Bild

Zur Verwendung dieser neuen Komponenten steht eine modulare und gut dokumentierte NeRF-Neuimplementierung zur Verfügung.

NeRF ist ein Deep-Learning-Modell.Es wurde vom Google Research-Team entwickelt und zielt darauf ab, Szenen mithilfe von Neural Radiance Fields zur Ansichtssynthese darzustellen.
NeRF ist in der Lage, komplexe 3D-Szenengraphen ausschließlich mithilfe unstrukturierter Bildsammlungen zu synthetisieren.
Die verbesserte Version von NeRF wurde mit stark verbesserter Leistung neu implementiert. Es läuft schneller als die offizielle Version und gewährleistet gleichzeitig die Qualität der Ausgabebilder.

Neuimplementierung mit NeRF von PyTorch3D zur Generierung von Beispielen komplexer 3D-Bilder mit Formen und Beleuchtung

Tutorial (Texturiertes Volumen anpassen)

Basierend auf dem offiziellen PyTorch3D-GitHub-Tutorial „Fit Textured Volume“ haben wir es übersetzt und organisiert, um die Verwendung von PyTorch3D zu demonstrieren.Mithilfe der differenzierbaren Stereowiedergabe sagen wir die Stereostruktur einer Szene anhand einer Reihe von Ansichten der Szene voraus.

Verwenden von Raymarching zum Erstellen einer 3D-Szenenstruktur. Dieses Tutorial stellt Folgendes vor:

  • So erstellen Sie einen differenzierbaren Volumen-Renderer;
  • So erstellen Sie ein Volumenmodell (einschließlich der Verwendung der Volumes-Klasse);
  • Verwenden Sie einen differenzierbaren Stereo-Renderer, um die Stereostruktur aus dem Bild anzupassen.
  • Visualisieren Sie die vorhergesagte dreidimensionale Struktur.

Hinweis: Aus Platzgründen zeigt dieser Artikel nur einen Teil des Codes. Bitte sehen Sie sich den vollständigen Code anklicken Sie hier.

0. Module installieren und importieren

Stellen Sie sicher, dass es installiert ist  Fackel   Und  Fackelblick  .

Wenn nicht installiert  pytorch3d , bitte installieren Sie es.

1. Bilder von Szenen und Masken generieren

Der folgende Code generiert die Trainingsdaten. Es wird vorübergehen  fit_textured_mesh.ipynb   Tutorial, das ein Bild einer Kuh aus mehreren Winkeln rendert und Folgendes zurückgibt:

Eine Reihe von Tensoren von Bildern, die vom Kuh-Mesh-Renderer und seiner Silhouette generiert wurden; ein Renderer für jede Kameraaufnahme.

Notiz:  Kuh-Renderings generieren   Informationen zum Arbeitsprinzip des in der Funktion implementierten Mesh-Renderings finden Sie unter:
 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. Initialisieren Sie den Volume-Renderer

Durch die Initialisierung des Volumenrenderers wird von jedem Pixel des Zielbilds ein Strahl ausgesendet und eine Reihe gleichmäßig verteilter Punkte entlang des Strahls abgetastet. Der zu jedem Strahlpunkt gehörende Dichtewert und Farbwert kann durch Abfrage der entsprechenden Position im Volumenmodell der Szene ermittelt werden.

Der Renderer besteht aus einem Raymarcher  und ein Strahlenabtastgerät  bilden.

Strahlenabtastgerät  Verantwortlich für die Aussendung von Strahlen aus Bildpixeln und die Abtastung von Punkten entlang der Strahlen. Das hier verwendete ist  NDCGridRaysampler , das der Standardspezifikation des Koordinatengitters von PyTorch3D entspricht.

Raymarcher  Ruft die Dichte und Farbe von Strahlenproben ab und rendert alle Strahlen als Farb- und Deckkraftwert des Pixels, aus dem die Strahlen stammen. Das hier verwendete ist  EmissionAbsorptionRaymarcher , das den Standard implementiert  Emissions-Absorptions-Raymarching   Algorithmus.

# 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. Initialisieren Sie das Volumenmodell

Als nächstes instanziieren Sie das Volumenmodell der Szene. Dies führt zu einer Quantisierung des 3D-Raums in Volumenpixel, wobei jeder Voxel durch einen 3D-Vektor der RGB-Farbe des Voxels und einen Dichteskalar dargestellt wird, der die Opazität des Voxels beschreibt (im Bereich [0-1], wobei höhere Zahlen eine stärkere Opazität bedeuten).

Um sicherzustellen, dass Dichte- und Farbwerte im Bereich [0-1] liegen, stellen wir Volumenfarbe und Dichte im logarithmischen Raum dar. Modelllauf  nach vorne   Funktion, Log-Speicherplatz   Der Wert wird übergeben  Sigmoid   Funktionsübergabe, so dass  Log-Speicherplatz   Der Wert liegt im richtigen Bereich.

Auch,  Volumenmodell   Enthält auch das Renderer-Objekt. Dieses Objekt bleibt während des gesamten Optimierungsprozesses unverändert.

Dieser Abschnitt des Codes definiert auch  huber   Die Verlustfunktion berechnet die Differenz zwischen der gerenderten Farbe und der Maske.

4. Volumenanpassung

In diesem Schritt verwenden wir differenzierbares Rendering, um eine Volumenanpassung durchzuführen.

Um das Volumen anzupassen, beginnen wir mit  Zielkamera   Das Rendern erfolgt aus der Perspektive von  Zielbilder   Und  Zielsilhouetten   zum Vergleich.

Dieser Vergleich wird ausgewertet durch  Zielbilder/gerenderte Bilder   Und  Zielsilhouetten/gerenderte Silhouetten   Dies geschieht durch Ermittlung des durchschnittlichen Huber-Fehlers (glatt-L1) zwischen den beiden.

5. Visualisieren Sie das optimierte Szenenvolumen

Schließlich wird das optimierte Volumen visualisiert, indem das Szenenvolumen auf seiner Y-Achse gedreht und aus mehreren Blickwinkeln gerendert wird.

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. Fazit

Dieses Tutorial zeigt, wie die 3D-Volumenkonstruktion einer Szene optimiert wird, sodass die Volumendarstellung für bekannte Blickwinkel mit dem beobachteten Bild für jeden Blickwinkel übereinstimmt.

Das Rendering im Tutorial wurde durchgeführt mit  NDCGridRaysampler   Und   EmissionAbsorptionRaymarcher   Der erstellte PyTorch3D-Stereo-Renderer ist fertig.

Konstruieren Sie strukturierte 3D-Formen aus 2D-Bildern

Sehen Sie sich bitte das vollständige Tutorial anklicken Sie hier.