YihangChen-ee / HAC

:house: [ECCV 2024] Pytorch implementation of 'HAC: Hash-grid Assisted Context for 3D Gaussian Splatting Compression'
Other
197 stars 11 forks source link

关于存储大小的问题 #1

Open whwh747 opened 5 months ago

whwh747 commented 5 months ago

您好,感谢您出色的工作。我在A6000上初步运行了您的代码,发现truck bitstream=0.004 30000次迭代之后point_cloud.ply的大小是153.36MB,和论文Table D中的9.26MB相差较大,请问是我弄错什么了吗?希望您不吝赐教!

YihangChen-ee commented 5 months ago

模型参数需要进行编码后再存储,编码后的文件在./bitstreams文件夹中。(也就是那些.b文件) point_cloud.ply是原始的模型参数,并不是编码后的文件。 训练完后,你可以删去point_cloud.ply,因为模型参数都已经被编码存储在./bitstreams文件夹中了。 你应该查看./bitstreams文件夹的大小。

yang1hu commented 5 months ago

模型参数需要进行编码后再存储,编码后的文件在./bitstreams文件夹中。(也就是那些.b文件) point_cloud.ply是原始的模型参数,并不是编码后的文件。 训练完后,你可以删去point_cloud.ply,因为模型参数都已经被编码存储在./bitstreams文件夹中了。 你应该查看./bitstreams文件夹的大小。

你好,我也有这个疑问,你的意思是说我们的项目是在根据得到的ply文件,然后压缩获取算法变成一个./bitstreams文件夹中的文件吗,这个文件夹的信息,是压缩点的信息,并不是把点的信息变少,对吗

YihangChen-ee commented 5 months ago

你好,点的位数没变,但是其信息熵通过我们的hash feature的预测降低了。信息熵降低后才可以利用算术编码实现编码压缩。

yang1hu commented 5 months ago

你好,点的位数没变,但是其信息熵通过我们的hash feature的预测降低了。信息熵降低后才可以利用算术编码实现编码压缩。

好的,谢谢

Ataraxiaecho commented 3 months ago

为什么out.log里的anchor大小比bitstream里的anchor.pkl小了一倍

image

image

Ataraxiaecho commented 3 months ago

你好,点的位数没变,但是其信息熵通过我们的hash feature的预测降低了。信息熵降低后才可以利用算术编码实现编码压缩。

你好。方便解答一下我上面提的关于anchor文件大小的问题吗?谢谢

YihangChen-ee commented 3 months ago

你好,我们的工作对anchor采用16位的量化方式,那么在计算anchor的size的时候每个参数的size是16bit。在实际存储时为了方便,是16位量化后直接用torch保存的,这时候默认的保存格式是float32,但是实际上已经16位量化过了。因此出现了两倍的情况。你可以修改保存相关的代码,让pytorch保存为float16,这时候应该就是大小一致的。

祝好

Ataraxiaecho commented 3 months ago

你好,我们的工作对anchor采用16位的量化方式,那么在计算anchor的size的时候每个参数的size是16bit。在实际存储时为了方便,是16位量化后直接用torch保存的,这时候默认的保存格式是float32,但是实际上已经16位量化过了。因此出现了两倍的情况。你可以修改保存相关的代码,让pytorch保存为float16,这时候应该就是大小一致的。

祝好

好的。谢谢哥们。

TSlus commented 3 months ago

模型参数需要进行编码后再存储,编码后的文件在./bitstreams文件夹中。(也就是那些.b文件) point_cloud.ply是原始的模型参数,并不是编码后的文件。 训练完后,你可以删去point_cloud.ply,因为模型参数都已经被编码存储在./bitstreams文件夹中了。 你应该查看./bitstreams文件夹的大小。

你好,直接删去point_cloud.ply后,在测试的时候,会报错找不到point_cloud.ply文件,请问该怎么解决这个错误呢?

YihangChen-ee commented 3 months ago

你好,目前的代码逻辑是从bitstream中解码得到point_cloud.ply,然后模型权重仍然读取此point_cloud.ply来测试(相当于point_cloud.ply是一个桥梁)。因此如果你删去了point_cloud.ply,你需要重新跑解码函数从bitstream中重新解码得到point_cloud.ply后再进行测试。

或者你可以修改代码,让模型直接从bitstream的解码结果里读取权重,这样就不需要point_cloud.ply这个中间文件了。

BTW,你应该把删去point_cloud.ply的操作放在编码后且解码前的位置,而不是放在解码后的位置,因为point_cloud.ply是解码结果。

祝好

TSlus commented 3 months ago

你好,目前的代码逻辑是从bitstream中解码得到point_cloud.ply,然后模型权重仍然读取此point_cloud.ply来测试(相当于point_cloud.ply是一个桥梁)。因此如果你删去了point_cloud.ply,你需要重新跑解码函数从bitstream中重新解码得到point_cloud.ply后再进行测试。

或者你可以修改代码,让模型直接从bitstream的解码结果里读取权重,这样就不需要point_cloud.ply这个中间文件了。

BTW,你应该把删去point_cloud.ply的操作放在编码后且解码前的位置,而不是放在解码后的位置,因为point_cloud.ply是解码结果。

祝好

谢谢你的解答,按照你上面的逻辑应该可以。但是我发现在保存point_cloud.ply文件的时候(gaussian_model.py line 634 save_ply函数),好像是直接从优化变量中读取,并没有涉及从bitstream解码得到,这是为什么呢?

YihangChen-ee commented 3 months ago

你好,编码和解码函数分别在gaussian_model.py的第1074和1228行,他们在train.py里在最后一个训练iteration的时候被调用了(train.py的第299-308行)。此时你所提到的save_ply函数里所save的point_cloud.ply其实已经是解码过后的了。

在conduct_decoding函数中有将原始的变量替换为解码后的变量的过程(1339行 -1366行)。

TSlus commented 3 months ago

你好,编码和解码函数分别在gaussian_model.py的第1074和1228行,他们在train.py里在最后一个训练iteration的时候被调用了(train.py的第299-308行)。此时你所提到的save_ply函数里所save的point_cloud.ply其实已经是解码过后的了。

在conduct_decoding函数中有将原始的变量替换为解码后的变量的过程(1339行 -1366行)。

明白了,谢谢你。