完整教程:计算机3D视觉:Pytorch3d的环境配置与初步使用

news/2025/11/25 8:33:30/文章来源:https://www.cnblogs.com/yangykaifa/p/19266585

写在最前面:现在AI的语言表达能力越来越发达了,笔者这里一定要说明的是本人的所有文章的写作都是手敲文字,没有使用AI帮助写作,所以如果觉得文章不错请点关注。

文章目录

    • 一、主题说明
    • 二、环境配置
      • 关于GPU渲染加速的说明
      • requirements.txt依赖库
    • 三、3D渲染基础知识
    • 四、网格+渲染(含渐变)
    • 五、点云+渲染
    • 六、360°旋转GIF动图生成
      • 6.1 从Mesh网格到GIF
      • 6.2 从PointCloud到GIF

一、主题说明

本篇博文实验内容参考自MIT实验课程:16-825 Assignment 1: Rendering Basics with PyTorch3D (Total: 100 Points + 10 Bonus),素材相同,但是结合笔者自己的经验做了详细的讲解,还加入了一些内容的修改和创新。

二、环境配置

原实验的README.md文档针对的是Linux系统,不过Windows系统(10/11)同样支持,把MAX_JOBS=8参数删除进行适配,需要先安装anaconda工具。

# GPU Installation on a CUDA 11.6 Machine
conda create -n learning3d python=3.10
pip install torch --index-url https://download.pytorch.org/whl/cu116 (modify according to your cuda version)
pip install fvcore iopath
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable" (this will take some time to compile)
pip install -r requirements.txt
# CPU Installation
conda create -n learning3d python=3.10
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install fvcore iopath
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable"
pip install -r requirements.txt

如果pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable"命令受到网络因素的影响,可以更换为pip install "git+ssh://git@github.com/facebookresearch/pytorch3d.git@stable"

关于GPU渲染加速的说明

关于cuda版本的问题,需要指出的是,对于GeForce RTX50系列显卡(基于BlackWell架构),cuda版本一般只支持12.8以上,pytorch一般安装的版本需要和CUDA版本适配,而pytorch3d库采用源码下载-本地编译的流程,笔者目前测试到支持的CUDA版本包括12.1和12.4, 11.6和11.8应该也是支持的。所以RTX 50系列的用户就只能选择CPU渲染了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

requirements.txt依赖库

三、3D渲染基础知识

接下来讲解一些关于计算机3D视觉的基础知识,可以问问AI助手加深理解,欢迎评论区交流。

(1)3D数据的存储形式包括点云数据,参数化曲面,网格,隐式曲面和体素等等;RGBD图像并不算真正意义上的3D数据,类似2.5D数据,需要经过计算处理转化为其他形式的3D数据(一般是点云数据);自动驾驶领域汽车雷达采集的是点云数据,摄像头是深度摄像头;

(2)在3D数据可视化的过程中,需要通过渲染转化成RGB图像——渲染需要提供的参数有:物体3D数据、摄像机位置和灯光位置;直接返回BxHxWx4的数据,裁剪之后变为HxWx3的RGB图像;

(3)摄像机的可调节参数有相对世界坐标系原点的平移距离(3维向量)、空间旋转角度(每个相机都有3x3的旋转矩阵进行描述)、FOV视场角;灯光的可调节参数为灯光位置(3维向量);

(4)本实验对原课程进行了删减,主要探讨在pytorch3d框架下,Mesh(网格数据)和PointCloud(点云数据)的渲染可视化——Mesh包括N_v个3维点,N_f个三角曲面(每个曲面朝向由3个端点的序号决定),N_v个(和顶点数一致)三元素texture纹理信息决定;PointCloud由N个维点+N个RGB颜色向量决定,可以直接获取或者从RGBD图像计算。

四、网格+渲染(含渐变)

有了前面的基础知识,只需要熟悉pytorch3d的接口函数就可以慢慢熟悉3D可视化的流程。从obj文件读取小牛的顶点和三角面信息,然后传入顶点、三角面、纹理数据构建mesh对象,最后指定相机和灯光位置完成渲染。

需要注意批量B维度的unsqueeze扩充和最后HxWx3的截取。

def render_setup(filepath="data/cow.obj", image_size=256, color1=None,color2=None,
Camera_R=None,Camera_T=None,device=None,savepath='01setup.jpg',record=True):
# The device tells us whether we are rendering with GPU or CPU. The rendering will
# be *much* faster if you have a CUDA-enabled NVIDIA GPU. However, your code will
# still run fine on a CPU.
# The default is to run on CPU, so if you do not have a GPU, you do not need to
# worry about specifying the device in all of these functions.
if device is None:
device = get_device()
# Get the renderer.
renderer = get_mesh_renderer(image_size=image_size)
# Get the vertices, faces, and textures.
vertices, faces = load_cow_mesh(filepath)
vertices = vertices.unsqueeze(0)  # (N_v, 3) -> (1, N_v, 3)
faces = faces.unsqueeze(0)  # (N_f, 3) -> (1, N_f, 3)
assert(color1 is not None)
if color1 and color2:
color1=varying_color(vertices,color1,color2)
textures = torch.ones_like(vertices)  # (1, N_v, 3)
textures = textures * torch.tensor(color1)  # (1, N_v, 3)
mesh = pytorch3d.structures.Meshes(
verts=vertices,
faces=faces,
textures=pytorch3d.renderer.TexturesVertex(textures),
)
mesh = mesh.to(device)
print(torch.eye(3).unsqueeze(0))
print(Camera_R)
print(Camera_T)
# Prepare the camera:
cameras = pytorch3d.renderer.FoVPerspectiveCameras(
R=torch.eye(3).unsqueeze(0) if Camera_R is None else Camera_R, T=torch.tensor([[0, 0, 3]] if Camera_T is None else Camera_T),
fov=60, device=device)
# Place a point light in front of the cow.
lights = pytorch3d.renderer.PointLights(location=[[0, 0, -3]], device=device)
rend = renderer(mesh, cameras=cameras, lights=lights)
rend = rend.cpu().numpy()[0, ..., :3]  # (B, H, W, 4) -> (H, W, 3)
# The .cpu moves the tensor to GPU (if needed).
if record:
if '/' in savepath:
dir = ''.join(savepath.split('/')[:-1])
os.makedirs(dir, exist_ok=True)
os.chdir(dir)
savepath = savepath.split('/')[-1]
if Camera_R is not None and Camera_T is not None:
plt.imsave(f'{Camera_R[0].flatten().numpy(),Camera_T[0].numpy()}'+savepath,numpy.uint8(rend*255))
else:
plt.imsave(savepath,numpy.uint8(rend*255))
return rend

在这里插入图片描述
在这里插入图片描述

这个时候如果想要颜色更丰富的小牛,我们可以按照牛头到牛身到牛尾(或者说距离上图镜头的远近)做一个渐变色的线性渲染,效果还是不错的,艺术家们此时就可以根据color1前端颜色和color2后端颜色渲染出五颜六色的自己的小牛了:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def varying_color(vertices,color1,color2):
assert(vertices.shape[0]==1)
z = vertices[0, :, 2]
z_min = torch.min(vertices[0, :, 2])
z_max = torch.max(vertices[0, :, 2])
color1 = torch.tensor(color1).view(1, 3)
color2 = torch.tensor(color2).view(1, 3)
alpha = (z - z_min) / (z_max - z_min)
var_color = torch.matmul(alpha.reshape(-1,1), color2) + torch.matmul(1 - alpha.reshape(-1, 1), color1)
var_color=var_color.unsqueeze(0)
assert(var_color.shape==vertices.shape)
return var_color

五、点云+渲染

对应MIT实验1任务5.1,先从RGBD图像数据使用unproject_depth_image转成点云数据,一共用到pcloud,pcloud2和pcloud_cb三组点云,对应第一株植物、第二株植物和两株植物。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def render_setup_from_pointcloud(filepath, image_size=256,
Camera_R=None,Camera_T=None,device=None,savepath='01setup.jpg',record=True):
if device is None:
device = get_device()
# Get the renderer.
renderer = get_points_renderer(image_size=image_size,radius=0.01)
# Get the vertices, faces, and textures.
data = load_rgbd_data(filepath)
print(data.keys())
# Prepare the camera:
camera_fixed = pytorch3d.renderer.FoVPerspectiveCameras(
R=torch.eye(3).unsqueeze(0), T=torch.tensor([[0, 0, 3]]),
fov=60, device=device)
points,rgbs=unproject_depth_image(torch.tensor(data["rgb1"]),torch.tensor(data["mask1"]),
torch.tensor(data["depth1"]),camera_fixed)
points2,rgbs2=unproject_depth_image(torch.tensor(data["rgb2"]),torch.tensor(data["mask2"]),
torch.tensor(data["depth2"]),camera_fixed)
pcloud = pytorch3d.structures.Pointclouds(
points=points.unsqueeze(0),
features=rgbs.unsqueeze(0)
)
pcloud = pcloud.to(device)
pcloud2 = pytorch3d.structures.Pointclouds(
points=points2.unsqueeze(0),
features=rgbs2.unsqueeze(0)
)
pcloud2 = pcloud2.to(device)
pcloud_cb = pytorch3d.structures.Pointclouds(
points=torch.cat([points,points2],dim=0).unsqueeze(0),
features=torch.cat([rgbs,rgbs2],dim=0).unsqueeze(0)
)
pcloud_cb = pcloud_cb.to(device)
pclouds=[pcloud,pcloud2,pcloud_cb]
rends=[]
# Place a point light in front of the cow.
lights = pytorch3d.renderer.PointLights(location=[[0, 0, -3]], device=device)
camera_dynamic=pytorch3d.renderer.FoVPerspectiveCameras(
R=torch.eye(3).unsqueeze(0) if Camera_R is None else Camera_R,
T=torch.tensor([[0, 0, 3]] if Camera_T is None else Camera_T),
fov=60, device=device)
for i,pcloud in enumerate(pclouds):
rend = renderer(pcloud, cameras=camera_dynamic, lights=lights)
rend = rend.cpu().numpy()[0, ..., :3]  # (B, H, W, 4) -> (H, W, 3)
# The .cpu moves the tensor to GPU (if needed).
if record:
if '/' in savepath:
dir=''.join(savepath.split('/')[:-1])
os.makedirs(dir,exist_ok=True)
os.chdir(dir)
savepath=savepath.split('/')[-1]
if Camera_R is not None and Camera_T is not None:
plt.imsave(f'{i+1}'+f'{float(Camera_R[0].numpy().sum()), float(Camera_T[0].numpy().sum())}'+savepath , numpy.uint8(rend * 255))
else:
plt.imsave(f'{i+1}'+savepath, numpy.uint8(rend * 255))
rends.append(rend)
return rends

点云的渲染方式和网格总体相近,需要额外注意的是在从RGBD图像到点云的计算过程需要指定相机的位置和角度、视场角等参数;构建点云数据需要点和颜色信息。

六、360°旋转GIF动图生成

6.1 从Mesh网格到GIF

这里需要变化的就是渲染__call__函数里面的相机,通过renderer脚本camera类的look_at_view_transform方法计算当前相机的R矩阵(3x3旋转)和T向量(3平移)(需要指定距离世界坐标系原点的dist距离和azim的z轴夹角,笔者的猜测),然后创建动态相机,灯光位置保持[[0,0,-3]]不变。

在这里插入图片描述

dist=3,color1=[1,0.3,0.3],color2=None,帧率15,时长4秒

dist=4,color1=[1,0.3,0.3],color2=[0.3,0.3,1],帧率15,时长4秒

def gif_360(n_render,color1,color2,savepath):
current_dir=os.getcwd()
my_images = []
for i in range(0, n_render):
R, T = pytorch3d.renderer.cameras.look_at_view_transform(dist=3, azim=180 + 360 * i / n_render)
image = render_setup(filepath=args.cow_path, image_size=args.image_size,color1=color1,color2=color2,
Camera_R=R, Camera_T=T,record=False)
my_images.append(numpy.uint8(image[:, :, :] * 255))
print(i, "/", n_render)
if '/' in savepath:
os.makedirs(''.join(savepath.split('/')[:-1]),exist_ok=True)
os.chdir(current_dir)
imageio.mimwrite(savepath, my_images, fps=24)

6.2 从PointCloud到GIF

注意这里从RGBD到PointCloud的相机必须固定,如果都使用look_at_view_transform获得的R/T动态相机,得到的是完全不动的静态图片,冠以“gif”之名。

在这里插入图片描述

这张gif帧率为24,时长9秒,但是其实是第4部分3个点云渲染的结合体,所以是鬼畜植物,实际帧率为8。

def gif_360_pcloud(n_render,savepath):
if savepath.split('.')[-1]!='gif':
raise ValueError("Savepath should be only in the format of gif.")
current_dir=os.getcwd()
my_images = []
for i in range(0, n_render):
R, T = pytorch3d.renderer.cameras.look_at_view_transform(dist=4, azim=180 + 360 * i / n_render)
images = render_setup_from_pointcloud(filepath=args.bridge_path, image_size=args.image_size,
Camera_R=R, Camera_T=T,savepath=savepath.replace("gif","jpg"),record=False)
for img in images:
my_images.append(numpy.uint8(img[:, :, :] * 255))
print(i, "/", n_render)
os.chdir(current_dir)
imageio.mimwrite(savepath, my_images, fps=24)
return my_images

写在最后面:本实验主要用到pytorch3d库的structures和renderer脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/975533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET+AI | MEAI | ChatOptions 详解(5)

ChatOptions 详解:精准控制 AI 对话的配置利器 一句话简介 ChatOptions 是 Microsoft.Extensions.AI 中传递给 IChatClient 的统一配置容器,用于在单次请求中精准控制生成策略、工具调用和扩展特性。🎯 核心价值✅…

2025年评价高的高弹硬质棉厂家推荐及选择指南

2025年评价高的高弹硬质棉厂家推荐及选择指南行业背景与市场趋势随着全球纺织材料行业的快速发展,高弹硬质棉作为一种新型环保填充材料,近年来市场需求呈现稳定增长态势。据中国纺织工业联合会最新数据显示,2024年我…

2025年质量好的硬质棉厂家最新推荐排行榜

2025年质量好的硬质棉厂家最新推荐排行榜行业背景与市场趋势硬质棉作为一种新型环保填充材料,近年来在家居、工业及特殊应用领域展现出强劲的增长势头。根据中国纺织工业联合会最新发布的《2024-2025年中国纺织新材料…

25.11.22

QOJ8147 首先可以手算出这个序列满足:\(a_1=1\); \(a_{i+1}=-a_i\vee a_{i+1}=a_i+2\).但是还是不好数啊。接下来这一步纯数学,构造:\(b_i=\frac{|a_i|+1}{2}\),显然还是整数序列。 发现限制变成了:\(b_1=1\); \(…

CVE-2025-12870认证滥用漏洞分析:aEnrich eHRD系统高危安全风险

本文详细分析了CVE-2025-12870认证滥用漏洞,该漏洞影响aEnrich开发的a+HRD系统,允许未经认证的远程攻击者通过特制数据包获取管理员访问令牌,从而以提升的权限访问系统。概述 CVE-2025-12870是一个影响aEnrich开发的…

安装Docker(win11)

1 环境准备 1.1 开启Hyper-V Hyper-V功能仅在Windows专业版、企业版和教育版中可用,家庭版不支持Hyper-V功能。 为了解决这一问题,我们需要通过自行创建cmd指令执行。 操作步骤:创建cmd文件首先需要创建一个cmd文件…

2025年热门的不锈钢自攻螺钉厂家最新推荐权威榜

2025年热门的不锈钢自攻螺钉厂家最新推荐权威榜行业背景与市场趋势不锈钢自攻螺钉作为现代工业制造中不可或缺的基础紧固件,近年来随着全球制造业的复苏和建筑行业的持续发展,市场需求呈现稳定增长态势。根据中国五金…

2025年靠谱的盘头十字自攻螺钉厂家推荐及选择指南

2025年靠谱的盘头十字自攻螺钉厂家推荐及选择指南行业背景与市场趋势随着建筑装饰、工业制造和家电行业的持续发展,盘头十字自攻螺钉作为基础紧固件,市场需求呈现稳定增长态势。据中国五金制品协会2024年统计数据显示…

比 MySQL 轻,比 SQLite 强:终于有人把 AI 数据库做对了

前几天,我看到了一个来自 Turso 创始人 Pekka 的观点:SQLite 被认为是 AI agent 的理想数据库,因为它轻量级且适用于 AI agent 的各种场景,但仍然需要进化。评论区里也有意思,有人会和大家分享自己为了 SQLite 的…

PTA算法每日三题 - 详解

PTA算法每日三题 - 详解2025-11-25 08:16 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

如何解除 iPad 和 iPhone 文本消息的关联? - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年比较好的闸阀门厂家最新推荐权威榜

2025年比较好的闸阀门厂家最新推荐权威榜行业背景与市场趋势随着全球工业化进程的加速和基础设施建设的持续投入,阀门行业作为工业领域的关键配套产业,近年来保持了稳定增长态势。据《2024-2029年中国阀门行业市场调…

Visual Studio 2026 现已正式发布,更快、更智能!

前言 前不久 Visual Studio 官方博客宣布 Visual Studio 2026 正式发布!本次版本凝聚了广大开发者的宝贵反馈,博客中提及在此版本发布之前的一年里,Visual Studio 团队修复了 5000 多个用户报告的缺陷,并实现了 30…

AI元人文与LLM:解构单一性霸权与构建价值共生的未来

AI元人文与LLM:解构单一性霸权与构建价值共生的未来 引言:巨灵神的诞生与囚笼 我们曾以创世者般的热情,迎接大语言模型(LLM)这一“数字巨灵神”的降临,期许它成为人类智慧的集大成者。然而,当最初的惊叹褪去,我…

拒绝AI=拒绝饭碗?硅谷程序员的噩梦已经开始,我们的噩梦就在路上! - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

实用指南:【详细教程】对拍 0 基础学习小课堂 [内附例题演示]

实用指南:【详细教程】对拍 0 基础学习小课堂 [内附例题演示]pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

深度学习模型预测手术风险的验证研究

本研究通过外部验证评估了基于12导联数字心电图的深度学习算法PreOpNet在预测非心脏大手术后30天死亡率及主要不良心脏事件方面的表现,并与传统风险评分和生物标志物进行比较。外部验证使用数字心电图预测非心脏大手术…

2025年知名的专业生产印染配件优质厂家推荐榜单

2025年知名的专业生产印染配件优质厂家推荐榜单行业背景与市场趋势印染行业作为纺织产业链中的重要环节,近年来随着全球纺织业的持续发展而稳步增长。根据中国印染行业协会最新统计数据显示,2024年我国印染机械配件市…

2025年靠谱的拉幅定型机专用印染配件及改造用户口碑最好的厂家榜

2025年靠谱的拉幅定型机专用印染配件及改造用户口碑最好的厂家榜行业背景与市场趋势随着全球纺织印染行业的持续发展,拉幅定型机作为印染后整理的关键设备,其配件市场需求呈现稳定增长态势。据中国纺织机械协会2024年…

1.5纳米气体过滤器有哪些推荐?这些品牌值得关注

1.5纳米气体过滤器是一种高精度的气体净化设备,主要用于去除气体中的微小颗粒、杂质及污染物,确保气体纯度达到特定行业标准。在半导体制造、电子工业、精密仪器等对气体纯度要求极高的领域,这类过滤器发挥着关键作…