TVMC: Time-Varying Mesh Compression
TVMC:基于 Volume-Tracked Reference Meshes 的时变网格压缩
这个仓库包含了论文 “TVMC: Time-Varying Mesh Compression Using Volume-Tracked Reference Meshes” 的官方作者实现代码。
这个仓库包含与论文 "TVMC: Time-Varying Mesh Compression Using Volume-Tracked Reference Meshes" 相关的官方作者实现,论文已被 2025 ACM MMSys 接收,可以从这里找到。
BibTex
@inproceedings{Chen2025TVMC,
author = {Chen, Guodong and H{\'a}cha, Filip and V{\'a}{\v{s}}a, Libor and Dasari, Mallesham},
title = {TVMC: Time-Varying Mesh Compression Using Volume-Tracked Reference Meshes},
booktitle = {ACM Multimedia Systems Conference 2025 (MMSys '25)},
year = {2025},
address = {Stellenbosch, South Africa},
doi = {10.1145/3712676.3714440}
}
系统要求
- 操作系统: Windows 11 或 Ubuntu 20.04
- Python: 3.8
- 依赖:
numpy
open3d==0.18.0
scikit-learn
scipy
trimesh==4.1.0
克隆项目:
git clone https://github.com/SINRG-Lab/TVMC.git
使用 Docker 运行
按照以下步骤构建和运行 Docker 镜像:
步骤 1: 构建 Docker 镜像
首先,从提供的 Dockerfile
构建 Docker 镜像:
docker build -t tvmc-linux .
步骤 2: 运行 Docker 镜像
构建镜像后,使用以下命令运行 Docker 容器:
docker run --rm -it tvmc-linux
步骤 3: 运行 Pipeline 脚本
进入 Docker 容器后,授予 run_pipeline.sh
脚本执行权限并运行它:
conda activate open3d_env
chmod +x run_pipeline.sh
sudo ./run_pipeline.sh
Pipeline 将启动,所需的任务将按顺序执行。
在你自己的机器上运行 TVMC
如果你想在你自己的机器上使用你自己的数据集运行 TVMC,可以按照以下步骤进行设置。 我们已经在 Windows 11 和 Ubuntu 20.04 上测试过。
步骤 0:
安装 .Net 7.0
对于 Linux:
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update && \ sudo apt-get install -y dotnet-sdk-7.0
sudo apt-get update && \ sudo apt-get install -y aspnetcore-runtime-7.0
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
conda create -n open3d_env python==3.8 numpy open3d==0.18.0 scikit-learn scipy trimesh==4.1.0 -c conda-forge
echo 'export PATH="$HOME/miniconda3/bin:$PATH"'
~/.bashrc source ~/.bashrc
conda init
source ~/.bashrc
conda activate open3d_env
对于 Windows,可以使用 Visual Studio 安装 .NET 7.0,使用 Anaconda 创建 Python 环境。
步骤 1: As-Rigid-As-Possible (ARAP) Volume Tracking
ARAP Volume Tracking 是使用 C# 和 .NET 7.0 编写的。
进入根目录:
cd ./arap-volume-tracking
构建项目:
dotnet build -c release
运行跟踪过程:
dotnet ./bin/Client.dll ./config/max/config-basketball-max.xml
Volume Tracking 的结果保存在 <outDir>
文件夹中:
.xyz
文件: Volume 中心的坐标。.txt
文件: 帧之间中心点的变换。
全局优化 (可选)
全局优化通过移除异常的 Volume 中心并调整剩余中心的位置来减少失真,从而优化 Volume 中心。
dotnet ./bin/Client.dll ./config/impr/config-basketball-impr.xml
结果存储在 <outDir>/impr
中。
更多时变网格序列可以在 ./arap-volume-tracking/data
中找到。 配置文件在 ./arap-volume-tracking/config
中。 不同的跟踪模式 (./iir
, ./impr
, ./max
) 使用不同的配置。 更多详细信息请参考 这里。
要在自定义数据集上运行 ARAP Volume Tracking:
dotnet ./bin/Client.dll <config_file.xml>
步骤 2: 使用多维缩放 (MDS) 生成参考中心
进入 TVMC 根目录:
cd ../TVMC
运行 MDS 脚本:
python ./get_reference_center.py --dataset basketball_player --num_frames 10 --num_centers 1995 --centers_dir ../arap-volume-tracking/data/basketball-output-max-2000/impr
中心点的数量 (--num_centers
) 必须与全局优化的结果相匹配。 输出存储在 ./arap-volume-tracking/data/basketball-output-max-2000/impr/reference/reference_centers_aligned.xyz
中。
如果 Volume 中心数量很大,可以尝试使用不同的 random_state
值以获得更好的结果。
步骤 3: 计算变换 Dual Quaternions
然后,我们计算每个中心的变换,将它们的原始位置映射到参考空间,以及它们的反变换。 这些变换然后用于基于 Volume 中心的移动来变形网格表面。
python ./get_transformation.py --dataset basketball_player --num_frames 10 --num_centers 1995 --centers_dir ../arap-volume-tracking/data/basketball-output-max-2000/impr --firstIndex 11 --lastIndex 20
步骤 4: 创建 Volume-Tracked, Self-Contact-Free Reference Mesh
对于 Linux,切换到 .NET 5.0。
sudo apt-get install -y dotnet-sdk-5.0
sudo apt-get install -y aspnetcore-runtime-5.0
进入 tvm-editing
目录并构建:
cd ../tvm-editing
dotnet new globaljson --sdk-version 5.0.408
dotnet build TVMEditor.sln --configuration Release --no-incremental
(对于 Windows,编写者使用了 .NET 8.0,因此无需安装 .NET 5.0 并运行 dotnet new globaljson --sdk-version 5.0.408
。 如果遇到有关 .NET 版本的错误,请尝试在你的机器上安装正确的版本。)
运行网格变形:
对于 Windows:
TVMEditor.Test/bin/Release/net5.0/TVMEditor.Test.exe basketball 1 11 20 "./TVMEditor.Test/bin/Release/net5.0/Data/basketball_player_1995/" "./TVMEditor.Test/bin/Release/net5.0/output/basketball_player_1995/"
对于 Linux:
TVMEditor.Test/bin/Release/net5.0/TVMEditor.Test basketball 1 11 20 "./TVMEditor.Test/bin/Release/net5.0/Data/basketball_player_1995/" "./TVMEditor.Test/bin/Release/net5.0/output/basketball_player_1995/"
再次进入 TVMC 根目录:
cd ../TVMC
提取参考网格:
python ./extract_reference_mesh.py --dataset basketball_player --num_frames 10 --num_centers 1995 --inputDir ../tvm-editing/TVMEditor.Test/bin/Release/net5.0/output/basketball_player_1995/output/ --outputDir ../tvm-editing/TVMEditor.Test/bin/Release/net5.0/Data/basketball_player_1995/reference_mesh/ --firstIndex 11 --lastIndex 20 --key 9
步骤 5: 将参考网格变形到组中的每个网格
进入 tvm-editing
目录,
cd ../tvm-editing
然后运行:
TVMEditor.Test/bin/Release/net5.0/TVMEditor.Test.exe basketball 2 11 20 "./TVMEditor.Test/bin/Release/net5.0/Data/basketball_player_1995" "./TVMEditor.Test/bin/Release/net5.0/output/basketball_player_1995/"
对于 Linux:
TVMEditor.Test/bin/Release/net5.0/TVMEditor.Test basketball 2 11 20 "./TVMEditor.Test/bin/Release/net5.0/Data/basketball_player_1995" "./TVMEditor.Test/bin/Release/net5.0/output/basketball_player_1995/"
步骤 6: 计算位移场
再次进入 ./TVMC 目录:
cd ../TVMC
python ./get_displacements.py --dataset basketball_player --num_frames 10 --num_centers 1995 --target_mesh_path ../arap-volume-tracking/data/basketball_player --firstIndex 11 --lastIndex 20
位移场存储为 .ply
文件。 对于压缩,Draco 用于编码参考网格和位移。
提示: 到目前为止,我们已经拥有了时变网格压缩所需的一切(一个无自接触的参考网格和位移场)。 你可以使用任何其他压缩方法来处理它们。 例如,你可以使用视频编码来压缩位移,以获得更好的压缩性能。
步骤 7: 压缩和评估
进入 TVMC 根目录:
cd ..
克隆并构建 Draco:
git clone https://github.com/google/draco.git
cd ./draco
mkdir build
cd build
在 Windows 上:
cmake ../ -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
在 Linux 上:
cmake ../
make
Draco 路径 (请根据你的项目进行更改):
- 编码器:
./draco/build/Release/draco_encoder.exe
/./draco/build/draco_encoder
- 解码器:
./draco/build/Release/draco_decoder.exe
/./draco/build/draco_decoder
进入 TVMC 目录:
cd ../../TVMC
运行评估:
python ./evaluation.py --dataset basketball_player --num_frames 10 --num_centers 1995 --firstIndex 11 --lastIndex 20 --fileNamePrefix basketball_player_fr0 --encoderPath ../draco/build/Release/draco_encoder.exe --decoderPath ../draco/build/Release/draco_decoder.exe --qp 10 --outputPath ./basketball_player_outputs
对于 Linux:
python ./evaluation.py --dataset basketball_player --num_frames 10 --num_centers 1995 --firstIndex 11 --lastIndex 20 --fileNamePrefix basketball_player_fr0 --encoderPath ../draco/build/draco_encoder --decoderPath ../draco/build/draco_decoder --qp 10 --outputPath ./basketball_player_outputs
生成图表
我们提供了脚本来生成论文中基于收集的结果展示的图表。
- 如果已经完成了上述所有四个数据集的步骤,执行:
python ./objective_results_all.py
此脚本使用新生成的结果来生成码率失真 (RD) 性能和累积分布函数 (CDF) 图。
(在 Docker 镜像中,你可能需要使用 docker cp
在本地存储生成的图表)
- 如果按照上面建议的命令 (只生成 Basketball Player 数据集的结果),
python ./objective_results_basic.py
此版本主要使用论文中的原始数据来复现关键图表。
这提供了一种直接复现结果的方法。
关于
该仓库包含了论文 "TVMC: Time-Varying Mesh Compression Using Volume-Tracked Reference Meshes" 的官方作者实现。