Pytorch3D_上手学习3D的AI模型

This article was original written by XRBLS, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

本文主要介绍pytorch3d的入门使用。最近Facebook开源了一个专门用于3D模型学习的库pytorch3d,说白了就是将3d中一些常用的操作封装起来了。那这个玩意到底有啥用呢?使用这个库又能完成什么事情呢?个人觉得这个库还是蛮有用的,它将一些常用的3D概念整理在一起,并且通过使用这个库可以完成一些基于3D的创作,对于学习入门3D的视觉生成、渲染、甚至是3d的目标检测、3维的姿态评估都大有裨益。今天的教程不难,但是可以教给大家一些很实在的干货:

  • 3D中点线面的概念和编程表达方式;
  • 如何绘制点云(pointcloud);
  • 如何可视化我们的模型拟合结果;
  • 使用pytorch3d来从任意球面拟合我们给定的模型。

闲话不多说开始上手吧~

依赖安装

开始之前请先安装必要依赖,pytorch3d不支持pypi,请从conda或者github clonez安装:

sudo pip3 install alfred-py
sudo pip3 install open3d

开始读取一个obj文件

这里有一个包含了很多3d模型的网站:https://free3d.com/3d-model/-dolphin-v1–12175.html。打开看看里面有很多3D的模型:

这些obj的模型文件都可以通过pytorch3d来读取的。我们假设你已经下载好了上面的海豚3D文件,我们来read一下看看:

"""
using pytorch3d deform a source mesh to target mesh using 3D loss functions"""
import os
from pytorch3d.io import load_obj, save_obj
from pytorch3d.structures import Meshes
from pytorch3d.utils import ico_sphere
from pytorch3d.ops import sample_points_from_meshes
from pytorch3d.loss import (chamfer_distance,mesh_edge_loss,mesh_normal_consistency,mesh_laplacian_smoothing
)
import numpy as np
import torchimport matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
from alfred.dl.torch.common import device
import open3d as o3dtrg_obj = os.path.join('./data', '10014_dolphin_v2_max2011_it2.obj')verts, faces, aux = load_obj(trg_obj)
print('verts: ', verts)
print('faces: ', faces)
print('aux: ', aux)

这里就需要阐述一下,研究一个3D对象,我们需要关注哪些量呢?换句话说,那些值可以用来确定一个3d物体呢?

  • verts: 其实就是3d点,我们可以将一个3d物体离散化,那么本质上它就是由一系列的3d点构成的,最常见比如雷达的3d点云;
  • faces: 但只有3d的坐标其实还不够,我们还需要一些链接这些点的面,这就是我们所说的faces。在pytorch3d里面,构成一个面最少的点事多少呢?应该是3,而faces的数据结构也恰好是由3个verts的idx构成的一个面;
  • aux: 这个指标应该就是一些渲染用的东西,我们其实只要前两个指标即可。

## 尝试用open3d来绘制点云

open3d是一个非常好的库。个人认为应该是python下面最好用的3d可视化库吧。intel出品。

face_idx = faces.verts_idx.to(device)
verts = verts.to(device)center = verts.mean(0)
verts = verts - center
scale = max(verts.abs().max(0)[0])
verts = verts / scaletrg_mesh = Meshes(verts=[verts], faces=[face_idx])
src_mesh = ico_sphere(4, device)# we can print verts as well, using open3d
verts_points = verts.clone().detach().cpu().numpy()
print(verts_points)
pcobj = o3d.geometry.PointCloud()
pcobj.points = o3d.utility.Vector3dVector(verts_points)
o3d.visualization.draw_geometries([pcobj])

我们接着上面的代码继续,使用open3d就可以得到上图的结果:

最后给大家安利一下alfred-py, 这个库也拥有一些3d的可视化操作,比如在3d点云上画3d的boundingbox:

github地址:https://github.com/jinfagang/alfred

使用pytorch3d拟合海豚

我们将使用pytorch3d来拟合海豚的可视化结果:

def plot_pointcloud(mesh, title=""):verts = mesh.verts_packed()faces = mesh.faces_packed()x, y, z = verts.clone().detach().cpu().unbind(1)    fig = plt.figure(figsize=(5, 5))ax = Axes3D(fig)ax.scatter3D(x, z, -y)ax.set_xlabel('x')ax.set_ylabel('z')ax.set_zlabel('y')ax.set_title(title)plt.show()# start optimization loop
deform_verts = torch.full(src_mesh.verts_packed().shape, 0, device=device, requires_grad=True)
optimizer = torch.optim.SGD([deform_verts], lr=1.0, momentum=0.9)Niter = 2000
# Weight for the chamfer loss
w_chamfer = 1.0
# Weight for mesh edge loss
w_edge = 1.0
# Weight for mesh normal consistency
w_normal = 0.01
# Weight for mesh laplacian smoothing
w_laplacian = 0.1
# Plot period for the losses
plot_period = 250chamfer_losses = []
laplacian_losses = []
edge_losses = []
normal_losses = []for i in range(Niter):# Initialize optimizeroptimizer.zero_grad()# Deform the meshnew_src_mesh = src_mesh.offset_verts(deform_verts)# We sample 5k points from the surface of each mesh sample_trg = sample_points_from_meshes(trg_mesh, 5000)sample_src = sample_points_from_meshes(new_src_mesh, 5000)# We compare the two sets of pointclouds by computing (a) the chamfer lossloss_chamfer, _ = chamfer_distance(sample_trg, sample_src)# and (b) the edge length of the predicted meshloss_edge = mesh_edge_loss(new_src_mesh)# mesh normal consistencyloss_normal = mesh_normal_consistency(new_src_mesh)# mesh laplacian smoothingloss_laplacian = mesh_laplacian_smoothing(new_src_mesh, method="uniform")# Weighted sum of the lossesloss = loss_chamfer * w_chamfer + loss_edge * w_edge + loss_normal * w_normal + loss_laplacian * w_laplacian# Print the lossesprint('i: {}, loss: {}'.format(i, loss))# Save the losses for plottingchamfer_losses.append(loss_chamfer)edge_losses.append(loss_edge)normal_losses.append(loss_normal)laplacian_losses.append(loss_laplacian)# Plot meshif i % plot_period == 0:plot_pointcloud(new_src_mesh, title="iter: %d" % i)# Optimization steploss.backward()optimizer.step()

经过几千次迭代,我们就可以从一个任意的曲面,重构出海豚的3d空间结构。

总结

本文只是带大家入门pytorch3d库,更多关于3d目标检测,3d姿态估计的干货教程文章,欢迎大家订阅本专栏,你将在第一时间获取我们的教程。

欢迎大家加入神力人工智能学习社区:http://manaai.cn

Pytorch3D_上手学习3D的AI模型相关推荐

  1. 从零开始学习3D可视化之模型动画

    获取模型动画 播放模型动画 停止播放模型动画 在搭建3D可视化场景的过程中,我发现很多模型都有内置动画,很多模型在制作阶段就内置了动画,如果模型有内置动画,可以在 ThingJS 中利用 API 调用 ...

  2. 入门学习3D建模的必备知识,基础打的好,7天就能上手做模型!

    今年4月的全球数字游戏销售额达到了破纪录的105亿美元(约合人民币750亿),利润超过今年三月并比去年4月上涨了17%.疫情过后,游戏市场迎来了一次高潮,如果你喜欢3D游戏建模或看好这个行业坚持下去, ...

  3. 卡内基梅隆大学提出基于学习的动作捕捉模型,用自监督学习实现人类3D动作追踪

    原文来源:Cornell University Library 作者:Hsiao-Yu Fish Tung.Hsiao-Wei Tung.Ersin Yumer. Katerina Fragkiada ...

  4. 零基础如何快速上手高精度AI模型开发?

    常听技术大佬侃侃而谈AI模型开发,小白不知从何开始? 自动驾驶车辆分割.智慧农业小麦计数.智能硬件垃圾分拣.智慧城市交通流量.结构化文字识别模型定制,这些在视觉.机器学习.OCR等领域具备广泛应用前景 ...

  5. 什么是3D模型?学习3D游戏建模都需要掌握什么工具?

    什么是3D模型 3D模型是物体的多边形表示,通常用计算机或者其它视频设备进行显示.显示的物体可以是现实世界的实体,也可以是虚构的物体.任何物理自然界存在的东西都可以用三维模型表示. 二.什么是游戏3D ...

  6. 活动报名丨英伟达AI Lab科学家、GET3D一作高俊:从图像中学习3D对象的生成建模...

    12月12日(周一)上午9:00「青源Live第57期丨英伟达AI Lab科学家.GET3D一作高俊:从图像中学习3D对象的生成建模」将在线举办,多伦多大学博士生.英伟达AI Lab研究科学家高俊做报 ...

  7. 这个AI模型用最少的训练数据学习对象之间的关系

    https://www.toutiao.com/a6675553528800346628/ 上图:研究人员训练了一个混合AI模型来回答诸如"绿色立方体左边的红色物体与紫色哑光物具有相同形状吗 ...

  8. 谷歌机器智能大牛:AI模型要真正理解人类语言,关键是「序列学习」

    来源:新智元 编辑:David 如果计算机给了你所有正确的答案,是否意味着它和你一样了解世界? 这是人工智能科学家几十年来一直争论不休的谜题.随着深度神经网络在与语言相关的任务中取得了令人瞩目的进步, ...

  9. 各种AI模型拿来就能用!五大深度学习模型库大盘点

    乾明 编辑整理  量子位 出品 | 公众号 QbitAI 你知道PyTorch Hub吗? 这个Facebook的深度学习模型库,一问世就引发了巨大关注. 因为它太强了: ResNet.BERT.GP ...

最新文章

  1. 揭秘大型网站架构进化之路
  2. 重温强化学习之函数近似
  3. 为什么阿里巴巴开发手册中强制要求 POJO 类使用包装类型?NPE问题防范
  4. wxWidgets:wxStreamToTextRedirector类用法
  5. HTML中transform菜鸟,HTML canvas
  6. prometheus python client
  7. 阿里-2019算法岗笔试编程题-kmp匹配
  8. 如何让大数据从发现价值到创造价值
  9. python爬虫金融数据_python爬虫项目-爬取雪球网金融数据(关注、持续更新)
  10. 转载:eclipse 搭建SSH项目(第二篇,有具体的项目例子)
  11. html图片的title,图片标签IMG内alt和title属性
  12. Chapter Two:无限debugger的原理与绕过与断点调试
  13. git入门-----初始化命令(init、clone),Basic Snapshotting(add、status、commit、diff、reset、stash)
  14. 【Auto.js脚本】淘宝618集喵币列车活动 自动浏览任务
  15. mysql假死_win7系统假死的5种情况和处理方法
  16. s:checkbox
  17. Ucinet三天写论文!北核科研网络精写
  18. 使用Rails和回形针上传
  19. 教程:Ubuntu 14.04 和 Windows 8.1 双系统安装步骤
  20. Keyshot7安装与Creo的联合调试

热门文章

  1. 如何将每日新闻添加到自己博客中,发送到微信群中
  2. 计算机桌面摆桃心,怎样把桌面的图标摆成爱心形状的?(要图片)?
  3. 前端在线预览PDF文件
  4. 百度地图滑动后获取屏幕的中心点百度坐标
  5. 打开 Excel 提示 “文件格式和扩展名不匹配,文件可能已损坏或不安全” 的解决办法
  6. 大恒相机开发实践(3)——参数设置
  7. MongoDB被黑记录
  8. c#窗体程序未响应问题
  9. CryptoJS 下载地址
  10. 【学习笔记】使用魔数快速求平方根