
人工智能深度学习计算机视觉图形学【免费下载链接】pytorch3dPyTorch3D is FAIRs library of reusable components for deep learning with 3D data项目地址https://gitcode.com/gh_mirrors/py/pytorch3d点击查看免费下载导读render_flyaround是 PyTorch3D Implicitron 中负责场景环绕渲染的核心可视化函数它读取一个训练/测试序列的全部帧数据围绕场景生成一条相机飞行轨迹逐帧调用训练好的模型进行渲染最终合成一个 mp4 视频输出该场景从多视角观测的重建结果RGB 图、掩码、深度图。本文以 render_flyaround.rst 为主线完整讲解该函数的全部 22 个参数、四种相机轨迹类型、从数据加载到视频导出的完整工作流并结合源码、CLI 脚本与测试用例给出可直接运行的实战方案。一、函数定位与文档来源docs/modules/implicitron/models/visualization/render_flyaround.rst本身是一个 Sphinx 文档占位文件通过automodule指令自动抽取源码中的 docstring 生成 API 文档.. automodule:: pytorch3d.implicitron.models.visualization.render_flyaround :members: :undoc-members: :show-inheritance:因此该文档的正体是 render_flyaround.py 中的render_flyaround函数定义于第 49 行及其完整的参数文档。该函数处于 Implicitron 可视化工具链的顶层向下依次依赖eval_video_trajectory.py 中的generate_eval_video_cameras负责生成相机轨迹video_writer.py 中的VideoWriter负责把渲染帧编码为视频vis_utils.py 中的get_visdom_connection、make_depth_image负责 visdom 可视化与深度图伪彩色化。从源码结构看render_flyaround是 Implicitron 模型评估与结果展示的重要出口训练好的 NeRF、NeRFormer、SRN 等通用模型GenericModel 体系都可以直接接入该函数完成环绕视频导出。二、函数签名与全部参数详解def render_flyaround( dataset: DatasetBase, sequence_name: str, model: torch.nn.Module, output_video_path: str, n_flyaround_poses: int 40, fps: int 20, trajectory_type: str circular_lsq_fit, max_angle: float 2 * math.pi, trajectory_scale: float 1.1, scene_center: Tuple[float, float, float] (0.0, 0.0, 0.0), up: Tuple[float, float, float] (0.0, -1.0, 0.0), traj_offset: float 0.0, n_source_views: int 9, visdom_show_preds: bool False, visdom_environment: str render_flyaround, visdom_server: str http://127.0.0.1, visdom_port: int 8097, num_workers: int 10, device: Union[str, torch.device] cuda, seed: Optional[int] None, video_resize: Optional[Tuple[int, int]] None, output_video_frames_dir: Optional[str] None, visualize_preds_keys: Sequence[str] ( images_render, masks_render, depths_render, _all_source_images, ), ) - None:各参数按职责可分为四组1. 输入与输出核心参数参数默认值说明dataset必填包含sequence_name场景全部帧的DatasetBase数据集对象Implicitron 的 dataset_base.py 体系sequence_name必填要可视化的场景在dataset中的名称model必填用于预测的模型torch.nn.Module其输出字典需包含visualize_preds_keys指定的键output_video_path必填输出视频的文件路径实际产出为{output_video_path}_{sequence_name}_{key}.mp4多个文件2. 相机轨迹参数参数默认值说明n_flyaround_poses40环绕轨迹上的相机位姿数量即视频总帧数fps20输出视频帧率trajectory_typecircular_lsq_fit轨迹类型支持四种详见下文四种相机轨迹小节max_angle2π轨迹总长度。所有轨迹都以time 2π为周期例如circular_lsq_fit配合time4π会让相机绕物体旋转 720°trajectory_scale1.1轨迹的尺度半径/幅度缩放因子scene_center(0.0, 0.0, 0.0)场景中心的世界坐标轨迹上所有相机都看向该点up(0.0, -1.0, 0.0)场景的上向量即场景地面的法线对circular_lsq_fit轨迹生效traj_offset0.0加到轨迹每个点上的 3D 偏移向量注源码中作为traj_offset_canonical(0.0, 0.0, traj_offset)传入即作用于轨迹局部坐标系的 z 轴3. 模型输入与批处理参数参数默认值说明n_source_views9从训练序列已知视角中采样、加入每个评估批次的源视角数量。这类源视角是 NeRFormer、NeRF-WCE 等模型的必需输入见 visualize_reconstruction.py 第 59-60 行注释num_workers10加载训练数据的 DataLoader worker 数量devicecuda模型推理设备seedNone源视角可复现采样的随机种子为None时使用hash(sequence_name)源码第 138-139 行4. 可视化与输出格式参数参数默认值说明visdom_show_predsFalse为True时将预测结果同步导出到 visdomvisdom_environmentrender_flyaroundvisdom 环境名visdom_serverhttp://127.0.0.1visdom 服务器地址visdom_port8097visdom 端口video_resizeNone可选定义输出视频尺寸(H, W)output_video_frames_dirNone若指定视频的逐帧图像会永久存储到该目录否则使用临时目录visualize_preds_keys见上要可视化的模型预测键名序列默认包含渲染图、掩码、深度图和源视角拼图三、四种相机轨迹类型trajectory_type支持四种轨迹源码 eval_video_trajectory.py 第 84-163 行circular_lsq_fit默认对训练相机的光心进行 3D 圆拟合相机中心沿拟合出的圆运动所有相机始终看向scene_center。拟合逻辑由 circle_fitting.py 的fit_circle_in_3d实现拟合后轨迹还会以trajectory_scale缩放源码第 154-155 行。figure_eight围绕训练数据集中心相机离所有相机光心均值最近的相机画 8 字轨迹参数方程为源码第 266-269 行x t.cos() y (2 * t).sin() / 2 z t.sin() * z_scaletrefoil_knot三叶结轨迹参数方程为源码第 259-263 行x t.sin() 2 * (2 * t).sin() y t.cos() - 2 * (2 * t).cos() z -(3 * t).sin() * z_scalefigure_eight_knot八字结轨迹参数方程为源码第 252-256 行x (2 (2 * t).cos()) * (3 * t).cos() y (2 (2 * t).cos()) * (3 * t).sin() z (4 * t).sin() * z_scale对于三种结轨迹figure_eight/trefoil_knot/figure_eight_knot其参数曲线先生成于规范坐标系再通过Scale(cam_centers.std(dim0).mean() * trajectory_scale)与中心相机的世界到视图变换逆矩阵转换到场景坐标系源码第 109-124 行并以infer_up_as_plane_normalTrue自动把up向量推断为相机光心拟合平面的法线源码第 126-128 行。最终所有轨迹都会经过look_at_view_transform见 cameras.py统一看向scene_center且若focal_length/principal_point未指定会取训练相机相应参数的平均值构造PerspectiveCameras源码第 177-190 行。trajectory_type还有两个隐藏的净化开关remove_outliers_rate在大于 0 时可移除训练相机中的离群光心按每个维度上下各裁掉指定比例使轨迹拟合更稳健源码第 81-82 行、第 200-214 行。四、完整工作流程解析render_flyaround的执行过程可以拆解为六个阶段对照源码 render_flyaround.py 第 138-222 行阶段 1加载整条序列通过sequence_indices_in_order(sequence_name)拿到序列帧索引用_load_whole_dataset源码第 225-235 行构造一个batch_sizelen(idx)的 DataLoader 一次性加载全部帧并以FrameData.collate整理为FrameData批次。随后用is_train_frame判断该序列属于 train 还是 test 集合源码第 151 行。阶段 2生成环绕相机轨迹time torch.linspace(0, max_angle, n_flyaround_poses 1)[:n_flyaround_poses] test_cameras generate_eval_video_cameras( train_cameras, timetime, n_eval_camsn_flyaround_poses, trajectory_typetrajectory_type, trajectory_scaletrajectory_scale, scene_centerscene_center, upup, focal_lengthNone, principal_pointtorch.zeros(n_flyaround_poses, 2), traj_offset_canonical(0.0, 0.0, traj_offset), )time在[0, max_angle]上均匀取n_flyaround_poses个采样点作为轨迹参数方程的输入源码第 154 行。注意这里principal_point被显式置零而focal_length取None以使用训练相机的平均焦距。阶段 3可复现地采样源视角with torch.random.fork_rng(): torch.manual_seed(seed) source_views_i torch.randperm(len(seq_idx))[:n_source_views]使用fork_rng隔离随机状态保证源视角采样不污染全局随机数生成器随后在批次头部pad一个占位视图该视图会被逐帧替换为目标相机源码第 169-175 行。阶段 4逐帧渲染对n_flyaround_poses中的每一帧把test_cameras[n]的R、T、focal_length、principal_point写入批次首个相机源码第 182-183 行将整个批次搬到device在torch.no_grad()下以EvaluationMode.EVALUATION调用模型源码第 186-188 行将模型预测与网络输入合并为一个大字典调用_images_from_preds按visualize_preds_keys抽取并预处理成可视化图像源码第 191-196 行若开启 visdom每 5% 的迭代n % max(n_flyaround_poses // 20, 1) 0调用_show_predictions推送一次中间结果源码第 199-209 行。_images_from_preds源码第 238-271 行内部做了三类关键处理对depth开头的键用masks_render作掩码插值后调用make_depth_image生成伪彩色深度图对_all_source_images特殊键从preds[image_rgb][1:]取源视角并用_stack_images拼成网格图源码第 274-286 行对单通道图自动repeat(1, 3, 1, 1)扩成 RGB。阶段 5生成视频_generate_prediction_videos源码第 335-393 行为每个预测键创建一个VideoWritervws[k] VideoWriter( fpsfps, out_pathf{video_path}_{sequence_name}_{k}.mp4, cache_dircache_dir, )随后逐帧写入并调用get_video()编码。VideoWritervideo_writer.py 第 34-214 行默认调用系统ffmpeg可用环境变量FFMPEG覆盖_DEFAULT_FFMPEG os.environ.get(FFMPEG, ffmpeg)使用h264编码、crf18、b2000k、pix_fmtyuv420p参数也可设置use_torchvision_video_writerTrue改用torchvision.io.write_video。帧尺寸会被强制调整为偶数resize[i] resize[i] % 2。阶段 6visdom 推送若viz非空把每个生成的视频文件通过viz.video(...)推送到 visdom 指定环境窗口名复用预测键名源码第 387-392 行。五、实战从训练好的模型一键导出环绕视频方式一使用官方 CLI 脚本Implicitron 训练工程提供了封装好的可视化入口 visualize_reconstruction.py其模块 docstring 给出了典型命令行调用pytorch3d_implicitron_visualizer \ exp_dir./exps/checkpoint_dir visdom_show_predsTrue visdom_port8097 \ n_eval_cameras40 render_size[64,64] video_size[256,256]该脚本的核心参数包括参数默认值说明exp_dir存放已训练模型与expconfig.yaml的实验目录restrict_sequence_nameNone若设置仅可视化指定场景序列output_directoryNone自定义输出目录默认输出到{exp_dir}/visrender_size(512, 512)生成渲染的分辨率会覆盖模型配置中的render_image_width/height源码第 98-99 行video_sizeNone输出视频尺寸透传给video_resizesplittrain数据集划分可选train/val/testn_source_views9每个批次附加的源视角数量n_eval_cameras40每条环绕轨迹的相机数量映射为n_flyaround_posesvisdom_*—visdom 开关、服务器、端口与环境名脚本会从实验目录加载expconfig.yaml用force_resumeTrue恢复模型权重遍历数据集中的每个序列在torch.no_grad()下逐序列调用render_flyaround源码第 121-139 行。注意第 85-92 行的关键行为为确保 CO3D 数据集全量加载脚本会强制test_on_trainFalse并支持通过restrict_sequence_name过滤序列。方式二在代码中直接调用测试用例 test_model_visualize.py 第 82-110 行展示了一个完整的直接调用示例render_flyaround( train_dataset, show_sequence_name, model, video_path, n_flyaround_poses10, fps5, max_angle2 * math.pi, trajectory_typecircular_lsq_fit, trajectory_scale1.1, scene_center(0.0, 0.0, 0.0), up(0.0, 1.0, 0.0), traj_offset1.0, n_source_views1, visdom_show_predsvisdom_show_preds, visdom_environmenttest_model_visalize, visdom_serverhttp://127.0.0.1, visdom_port8097, num_workers10, seedNone, video_resizeNone, visualize_preds_keys[ images_render, depths_render, masks_render, _all_source_images, ], output_video_frames_diroutput_video_frames_dir, )该测试还展示了自定义模型的最低要求模型只需在forward中接受camera等 Implicitron 批次字段并返回包含images_render、masks_render、depths_render的字典见_PointcloudRenderingModel第 113-153 行即可被render_flyaround驱动。同时测试验证了output_video_frames_dir为None或指定目录两种模式均可工作。运行前提视频导出依赖系统安装ffmpeg或通过环境变量FFMPEG指定可执行文件路径visdom 功能需要在环境中安装visdom并启动 visdom 服务默认http://127.0.0.1:8097get_visdom_connection在visdom不可导入时会静默返回Nonevis_utils.py 第 58-62 行不影响视频生成默认devicecuda需要可用 GPU纯 CPU 环境需显式传入devicecpu该测试用例本身需要interactive_testing_requested()与 visdom 连接才执行属于交互式/人工验收类测试第 31-32 行、第 64 行。六、可视化内容与输出物约定visualize_preds_keys默认输出四类内容每类对应一个独立 mp4images_render模型渲染的 RGB 重建图masks_render前景掩码depths_render经make_depth_image伪彩色化的深度图渲染前会用masks_render做最近邻插值作为深度掩码源码第 260-266 行_all_source_images当前批次所用源视角的网格拼图用于对照模型看到了哪些输入。输出文件命名规则为{output_video_path}_{sequence_name}_{key}.mp4。若指定了output_video_frames_dir逐帧 PNGframe_%08d.png会持久保存在{output_video_frames_dir}/{sequence_name}_{key}目录下便于逐帧检查或二次剪辑。七、小结render_flyaround是 PyTorch3D Implicitron 面向多视角重建结果展示的标准可视化组件它将数据集加载 → 轨迹生成 → 源视角采样 → 批量推理 → 视频编码封装为一次调用配合四种参数化轨迹圆拟合、8 字、三叶结、八字结与可配置的输出键既能用于训练过程中的实时监控visdom也能用于训练完成后的离线结果交付mp4 帧目录。其完整 API 文档由 render_flyaround.rst 通过automodule自动生成本文给出的参数语义、运行流程与调用示例均与 render_flyaround.py 源码、visualize_reconstruction.py CLI 与 test_model_visualize.py 测试逐行对应可直接作为二次开发与排障的参考。赞分享人工智能深度学习计算机视觉图形学【免费下载链接】pytorch3dPyTorch3D is FAIRs library of reusable components for deep learning with 3D data项目地址https://gitcode.com/gh_mirrors/py/pytorch3d点击查看免费下载相关推荐Netty在HuLa-Server中的应用高性能WebSocket连接管理与消息推送Netty在HuLa Server中的应用高性能WebSocket连接管理与消息推送 HuLa Server是基于Spring AI、SpringCloud人工智能深度学习计算机视觉图形学3D视觉革命DUSt3R点云渲染与相机轨迹可视化全解析3D视觉革命DUSt3R点云渲染与相机轨迹可视化全解析 还在为复杂的3D重建可视化而头疼DUSt3R让几何3D视觉变得简单直观本文带你深入探索DUSt3R人工智能深度学习计算机视觉预训练点云超详细SHARP渲染视频教程CUDA环境配置与相机轨迹生成全流程超详细SHARP渲染视频教程CUDA环境配置与相机轨迹生成全流程 SHARPSharp Monocular View Synthesis是一款强大的单目上一篇5分钟视频修复指南使用untrunc无损拯救损坏的MP4/MOV文件终极教程下一篇AMD GPU的AI计算革命ZLUDA技术如何重塑Stable Diffusion生态创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考