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 接收,可以从这里找到。

alt text

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}
}

系统要求

克隆项目:

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> 文件夹中:

全局优化 (可选)

全局优化通过移除异常的 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 路径 (请根据你的项目进行更改):

进入 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 在本地存储生成的图表)

python ./objective_results_basic.py

此版本主要使用论文中的原始数据来复现关键图表。

这提供了一种直接复现结果的方法。

关于

该仓库包含了论文 "TVMC: Time-Varying Mesh Compression Using Volume-Tracked Reference Meshes" 的官方作者实现。