HyperAI

PyTorch3D Stereo Implicit Shape Rendering : Apprenez À Construire Une Structure De Scène 3D

il y a 4 ans
Nouvelles des grandes usines
Information
Yang Bai
特色图像

Contenu

L’apprentissage profond 3D a toujours été un point difficile dans le domaine de la vision artificielle. Afin de construire avec précision et efficacité un modèle tridimensionnel de la scène et d'obtenir des résultats de rendu relativement réalistes, certains grands fabricants de l'industrie ont successivement ouvert leurs résultats de recherche et développement.

Cependant, dans le monde réel, les objets existent principalement sous la forme de structures 3D.Comment améliorer avec précision la capacité du système d'IA à percevoir et à comprendre des environnements complexes du monde réel et à traiter correctement les images 3D,Cela devient une difficulté technique de plus en plus critique.

En 2019, Facebook AI a publié le modèle Mesh R-CNN pour la détection d'objets 3D et la prédiction de forme

Le 23 janvier 2020, Facebook AI a publié PyTorch3D v0.1.0. PyTorch3D est une bibliothèque de composants optimisée, efficace et réutilisable dans PyTorch. Il présente trois caractéristiques exceptionnelles : une efficacité élevée, une modularité et une différenciation.Vise à simplifier l'apprentissage profond 3D dans PyTorch.

PyTorch3D fournit deux composants principaux : les opérateurs 3D et le rendu.

Dans les opérateurs 3D,Fit Mesh peut utiliser la fonction de perte 3D,Déformez la forme générique initiale en forme cible et rendez la forme cible plus lisse à l'aide de certaines règles.La méthode d'ajustement de faisceau dans les opérateurs 3D, puis fournit caméras , transforme , so3  Il existe 3 API au total, qui forment une cartographie de la perspective de la caméra en fonction de la perspective d'une caméra donnée, déduisant ainsi la structure 3D de la scène.

Le rendu comprend le rendu de maillage de texture (Render Textured Meshes), le rendu de maillage DensePose (Render DensePose Meshed), le rendu de nuage de points de couleur (Render Colored Pointclouds), etc.Grâce à ces moteurs de rendu, la structure 3D résultante de la scène peut être encore optimisée.

Le 6 février 2020, les codes liés à PyTorch3D ont été rendus open source sur GitHub. Après 5 versions d'itérations, le 9 février 2021, PyTorch3D a publié sa sixième version publique v0.4.0.Les nouvelles fonctionnalités incluent des fonctions implicites, un rendu stéréo et une réimplémentation NeRF.Fournit une bibliothèque open source plus rapide et plus flexible pour la recherche en apprentissage profond 3D.

  L'image montre le logo PyTorch3D généré par le moteur de rendu stéréo implicite de PyTorch3D.

Rendu de forme implicite

Le rendu de forme implicite est le processus de génération de rendus réalistes de scènes 3D basés sur de nouvelles perspectives de la scène d'entrée.L’idée principale est d’utiliser des réseaux neuronaux et un rendu différentiable pour reconstruire la forme implicite de la surface de la scène 3D.Cela permet d'apprendre la géométrie des scènes 3D en utilisant uniquement des vues 2D.

Plusieurs composants clés sont nécessaires pour effectuer un rendu de forme implicite.Inclut des abstractions pour les données de volume et les moteurs de rendu de formes implicites différentiables.

Pour permettre aux professionnels de l'industrie d'expérimenter plus facilement le rendu de formes implicites,PyTorch3D fournit déjà aux utilisateurs une série d'opérateurs 3D et de fonctions de perte couramment utilisés, ainsi qu'une API de rendu modulaire et différentiable.Tout en soulignant les principaux composants réutilisables, il fournit également des méthodes d'implémentation éprouvées et standardisées de ces composants.

Dans PyTorch3D v0.4.0, il existe 5 nouvelles fonctionnalités qui prennent en charge le rendu de forme implicite :

1. Structure du volume de données ajoutée (Structure des données des volumes), prend en charge le traitement par lots de volumes 3D et la conversion entre les cadres de coordonnées ;

2. Ajout de plusieurs méthodes d'implémentation de texture de rayon : GridRaysampler, MonteCarloRaysampler, NDCGridRaysampler

3. Ajout de plusieurs méthodes d'implémentation de Raymarcher : AbsorptionOnlyRaymarcher, EmissionAbsorptionRaymarcher

4. Ajout d'un moteur de rendu implicite (Rendu implicite) et les moteurs de rendu de volume (VolumeRenderer) API, qui se compose de Raysampler et Raymarcher

5. Ajout de plusieurs fonctions utilitaires, telles que la conversion différentiable du nuage de points au volume.

Image 3D de beignet générée à l'aide de PyTorch3D

Pour utiliser ces nouveaux composants, une réimplémentation NeRF modulaire et bien documentée est disponible.

NeRF est un modèle d’apprentissage en profondeur.Développé par l'équipe de recherche de Google, il vise à représenter des scènes à l'aide de champs de rayonnement neuronal pour la synthèse de vues.
NeRF est capable de synthétiser des graphiques de scènes 3D complexes en utilisant uniquement des collections d'images non structurées.
La version améliorée de NeRF a été réimplémentée avec des performances considérablement améliorées. Il fonctionne plus rapidement que la version officielle tout en garantissant la qualité des images de sortie.

Réimplémenté à l'aide de NeRF de PyTorch3D pour générer des exemples d'images 3D complexes avec des formes et un éclairage

Tutoriel (Ajuster le volume texturé)

Sur la base du didacticiel officiel PyTorch3D GitHub Fit Textured Volume, nous l'avons traduit et organisé pour démontrer comment utiliser PyTorch3D.En utilisant le rendu stéréo différentiable, nous prédisons la structure stéréo d'une scène à partir d'un ensemble de vues de la scène.

Utiliser Raymarching pour construire une structure de scène 3D Ce tutoriel présentera :

  • Comment créer un moteur de rendu de volume différentiable ;
  • Comment créer un modèle de volume (y compris comment utiliser la classe Volumes) ;
  • Utilisez un moteur de rendu stéréo différentiable pour adapter la structure stéréo de l'image ;
  • Visualisez la structure tridimensionnelle prédite.

Remarque : en raison de l’espace limité, cet article n’affiche qu’une partie du code. Veuillez consulter le code completCliquez ici.

0. Installer et importer des modules

Assurez-vous qu'il est installé  torche   et  vision torche  .

Si non installé  pytorch3d , veuillez l'installer.

1. Générer des images de scènes et de masques

Le code suivant générera les données de formation. Ça passera  fit_textured_mesh.ipynb   Tutoriel, qui rend une image d'une vache sous plusieurs angles et renvoie ce qui suit :

Une série de tenseurs d'images générés par le moteur de rendu de maillage de vache et sa silhouette ; un moteur de rendu pour chaque prise de vue.

Note:  générer_des_rendus_de_vache   Pour le principe de fonctionnement du rendu de maillage implémenté dans la fonction, veuillez vous référer à :
 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. Initialiser le moteur de rendu de volume

L'initialisation du moteur de rendu de volume envoie un rayon à partir de chaque pixel de l'image cible et échantillonne un ensemble de points régulièrement espacés le long du rayon. La valeur de densité et la valeur de couleur correspondant à chaque point de rayon peuvent être obtenues en interrogeant la position correspondante dans le modèle de volume de la scène.

Le moteur de rendu se compose d'un raymarcher  et un échantillonneur de rayons  constituer.

échantillonneur de rayons  Responsable de l'émission de rayons à partir des pixels de l'image et de l'échantillonnage des points le long des rayons. Celui utilisé ici est  Échantillonneur NDCGridRay , qui est conforme à la spécification de grille de coordonnées standard PyTorch3D.

raymarcher  Obtient la densité et la couleur des échantillons de rayons et rend tous les rayons comme la valeur de couleur et d'opacité du pixel d'où proviennent les rayons. Celui utilisé ici est  ÉmissionAbsorptionRaymarcher , qui implémente la norme  Raymarching d'émission-absorption   algorithme.

# 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. Initialiser le modèle de volume

Ensuite, instanciez le modèle de volume de la scène. Cela entraîne une quantification de l'espace 3D en pixels de volume, où chaque voxel est représenté par un vecteur 3D de la couleur RVB du voxel et un scalaire de densité décrivant l'opacité du voxel (dans la plage [0-1], les nombres plus élevés étant plus opaques).

Pour garantir que les valeurs de densité et de couleur sont comprises dans la plage [0-1], nous représenterons le volume, la couleur et la densité dans l'espace logarithmique. Exécution du modèle  avant   Fonction, espace journal   La valeur sera transmise  sigmoïde   Passage de fonction, de sorte que  espace journal   La valeur est dans la plage correcte.

aussi,  Modèle de volume   Contient également l'objet de rendu. Cet objet reste inchangé tout au long du processus d'optimisation.

Cette section du code définit également  Huber   La fonction de perte calcule la différence entre la couleur rendue et le masque.

4. Ajustement du volume

Dans cette étape, nous utilisons le rendu différentiable pour effectuer l’ajustement du volume.

Pour adapter le volume, nous partons de  caméra_cible   Le rendu est effectué du point de vue de  images_cibles   et  silhouettes_cibles   à titre de comparaison.

Cette comparaison est évaluée par  images_cibles/images_rendues   et  silhouettes_cibles/silhouettes_rendues   Cela se fait en prenant l’erreur moyenne de Huber (lisse-L1) entre les deux.

5. Visualisez le volume de scène optimisé

Enfin, le volume optimisé est visualisé en faisant pivoter le volume de la scène sur son axe y et en le rendant à partir de plusieurs points de vue.

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

Ce tutoriel montre comment optimiser la construction du volume 3D d'une scène afin que le rendu du volume pour les points de vue connus corresponde à l'image observée pour chaque point de vue.

Le rendu dans le tutoriel a été réalisé en utilisant  Échantillonneur NDCGridRay   et   ÉmissionAbsorptionRaymarcher   Le moteur de rendu stéréo PyTorch3D construit est terminé.

Construire des formes 3D texturées à partir d'images 2D

Veuillez consulter le tutoriel complet.Cliquez ici.