Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add fast high resolution marching cubes up to 1024^3. #68

Open
wants to merge 8 commits into
base: main
Choose a base branch
from

Conversation

thatname
Copy link

@thatname thatname commented Mar 20, 2024

Changes:

  • Do triplane sampling in a block based manner, reduced VRAM usage.
    This version can generate 1024^3 on 3090 in 33 seconds, use only 13GB VRAM.
    Actually this version is block based, only a 128^3 block is processed at each step.
    So 2048^3 is doable but unnecessary.

这个分支修改了算法,每次处理 128^3 的小块,还优化了显存占用。1024 的 mesh 在 3090 上半分钟跑完,256^3低分辩率也比之前快。

@thatname
Copy link
Author

2048^3 takes 15GB VRAM, 3.5 minutes. just change 1024 to 2048. But the mesh is to big for web GUI to display, you can still download the OBJ.
2048^3 用 15GB VRAM, 用时3.5 minutes, 直接把 1024 改成 2048就可以了,不过webGUI显示不了这个模型了,你可以直接点击那个下载OBJ

@yuedajiong
Copy link

只是Resolution数字更大了,还是mesh效果也明显更好了?

@CBQ-1223
Copy link

Changes:

  • Do triplane sampling in a block based manner, reduced VRAM usage.
    This version can generate 1024^3 on 3090 in 33 seconds, use only 13GB VRAM.
    Actually this version is block based, only a 128^3 block is processed at each step.
    So 2048^3 is doable but unnecessary.

这个分支修改了算法,每次处理 128^3 的小块,还优化了显存占用。1024 的 mesh 在 3090 上半分钟跑完,256^3低分辩率也比之前快。

大佬,可以放一下这样修改分辨率的结果嘛,修改之后有明显提升嘛mesh效果

@thatname
Copy link
Author

thatname commented Mar 22, 2024

只是Resolution数字更大了,还是mesh效果也明显更好了?

分辨率大了肯定效果更好,面很锐。但是,这个本质还是插值,原本的 Triplanar分辨率较低的 @yuedajiong

@thatname
Copy link
Author

thatname commented Mar 22, 2024

image
左边是 2048 右边是256 @yuedajiong @CBQ-1223 这个锐度可以了吧

@yuedajiong
Copy link

@thatname 谢谢大神

按照我有限理解,所以要提高质量:

  1. 直接利用输入,更充分的利用,输入那张图片 (第一优先,如果是面向copy-like还原立体的需求的话)
    个人感觉,往大里弄模型和数据,后面优化提升还有很大空间。 现在大家都没有足够大。
  2. 对输入做扩展,本质利用先验,现在各种做法,按照有效性排序:
    2.1 直接产生其他对应相机角度的。 (这个好处是相机位置是按照固定的产生,后面渲染的时候相机已知)
    2.2 产生360环绕的视频。 (这个相机路径有强约束,但并不是每帧很精确)
    2.3 产生强相关视频。 (这个主要利用视频生成中强大的先验,但相机位姿没啥控制)
    --- 这一堆做法,挑战两个: 1)相机位姿要不要,如何得到。 2)就是一致性够不够
  3. 搞后处理HR
    3.1 用模型来,一般都会提高一点
    3.2 用硬算法来优化mesh,但效果不好说
  4. ...

@thatname
Copy link
Author

@thatname 谢谢大神

按照我有限理解,所以要提高质量:

  1. 直接利用输入,更充分的利用,输入那张图片 (第一优先,如果是面向copy-like还原立体的需求的话)
    个人感觉,往大里弄模型和数据,后面优化提升还有很大空间。 现在大家都没有足够大。
  2. 对输入做扩展,本质利用先验,现在各种做法,按照有效性排序:
    2.1 直接产生其他对应相机角度的。 (这个好处是相机位置是按照固定的产生,后面渲染的时候相机已知)
    2.2 产生360环绕的视频。 (这个相机路径有强约束,但并不是每帧很精确)
    2.3 产生强相关视频。 (这个主要利用视频生成中强大的先验,但相机位姿没啥控制)
    --- 这一堆做法,挑战两个: 1)相机位姿要不要,如何得到。 2)就是一致性够不够
  3. 搞后处理HR
    3.1 用模型来,一般都会提高一点
    3.2 用硬算法来优化mesh,但效果不好说
  4. ...

哈哈,我不算大神啦。
基本认同,补充几点
质量
3D数据还是太少了,视频图片则是海量的。目前的1 比如TripoSR这种先验知识还是太有限了,分辨率也低,规模不够,冷门一些的物体它根本找不着北,不知道是不是只用了objaverse。而2的好处是基于2D模型训出来的,典型的2 比如刚出的SV3D,先验明显多得多。目前阶段2那几个方案都能到更高质量,感觉过一阵子sora这类出了以后,基于它们的新SV3D那就会达到生产质量了。

速度
但是从2D图像成3D资产要高清,目前靠谱的还是需要逐个走 SDS 训练,超级慢。所以理想的方式还是1,个人感觉工业界的落地应该先有2,然后通过2全网积累了海量的3D数据,数据足够以后直接训大模型,到达1的立即生成的效果。

@thatname
Copy link
Author

感觉我说的还是不对,不一定说从2D模型来生成3D就一定要逐个走优化,应该是能直接建立2D->3D映射的,这个过程是确定的,训练出来就行。

@CBQ-1223
Copy link

image 左边是 2048 右边是256 @yuedajiong @CBQ-1223 这个锐度可以了吧

厉害的 谢谢大神

@CBQ-1223
Copy link

@thatname 谢谢大神
按照我有限理解,所以要提高质量:

  1. 直接利用输入,更充分的利用,输入那张图片 (第一优先,如果是面向copy-like还原立体的需求的话)
    个人感觉,往大里弄模型和数据,后面优化提升还有很大空间。 现在大家都没有足够大。
  2. 对输入做扩展,本质利用先验,现在各种做法,按照有效性排序:
    2.1 直接产生其他对应相机角度的。 (这个好处是相机位置是按照固定的产生,后面渲染的时候相机已知)
    2.2 产生360环绕的视频。 (这个相机路径有强约束,但并不是每帧很精确)
    2.3 产生强相关视频。 (这个主要利用视频生成中强大的先验,但相机位姿没啥控制)
    --- 这一堆做法,挑战两个: 1)相机位姿要不要,如何得到。 2)就是一致性够不够
  3. 搞后处理HR
    3.1 用模型来,一般都会提高一点
    3.2 用硬算法来优化mesh,但效果不好说
  4. ...

哈哈,我不算大神啦。 基本认同,补充几点 质量 3D数据还是太少了,视频图片则是海量的。目前的1 比如TripoSR这种先验知识还是太有限了,分辨率也低,规模不够,冷门一些的物体它根本找不着北,不知道是不是只用了objaverse。而2的好处是基于2D模型训出来的,典型的2 比如刚出的SV3D,先验明显多得多。目前阶段2那几个方案都能到更高质量,感觉过一阵子sora这类出了以后,基于它们的新SV3D那就会达到生产质量了。

速度 但是从2D图像成3D资产要高清,目前靠谱的还是需要逐个走 SDS 训练,超级慢。所以理想的方式还是1,个人感觉工业界的落地应该先有2,然后通过2全网积累了海量的3D数据,数据足够以后直接训大模型,到达1的立即生成的效果。

大神,意思是目前生成质量效果最好的还是SDS训练的方法嘛,SV3D这种其次,然后才是triposr这种直接出3D模型的方法嘛,可我测下来为啥觉得triposr的生成质量效果是最好呢,如果有比它好的,大神可以说一下对应的开源项目的名字嘛?万分感谢!!!

@CBQ-1223
Copy link

Changes:

  • Do triplane sampling in a block based manner, reduced VRAM usage.
    This version can generate 1024^3 on 3090 in 33 seconds, use only 13GB VRAM.
    Actually this version is block based, only a 128^3 block is processed at each step.
    So 2048^3 is doable but unnecessary.

这个分支修改了算法,每次处理 128^3 的小块,还优化了显存占用。1024 的 mesh 在 3090 上半分钟跑完,256^3低分辩率也比之前快。

大佬,这个生成的.obj的mesh确实分辨率可以很大,但是生成的mesh好像有的是non-manifold mesh,在用该mesh作别的任务时就会报该错误,大佬有啥解决方法嘛

@thatname
Copy link
Author

Changes:

  • Do triplane sampling in a block based manner, reduced VRAM usage.
    This version can generate 1024^3 on 3090 in 33 seconds, use only 13GB VRAM.
    Actually this version is block based, only a 128^3 block is processed at each step.
    So 2048^3 is doable but unnecessary.

这个分支修改了算法,每次处理 128^3 的小块,还优化了显存占用。1024 的 mesh 在 3090 上半分钟跑完,256^3低分辩率也比之前快。

大佬,这个生成的.obj的mesh确实分辨率可以很大,但是生成的mesh好像有的是non-manifold mesh,在用该mesh作别的任务时就会报该错误,大佬有啥解决方法嘛

我估计主要是因为这个分块生成,导致mesh是非连续的。直接合并坐标相同的顶点处理一下就好了。

@thatname
Copy link
Author

@thatname 谢谢大神
按照我有限理解,所以要提高质量:

  1. 直接利用输入,更充分的利用,输入那张图片 (第一优先,如果是面向copy-like还原立体的需求的话)
    个人感觉,往大里弄模型和数据,后面优化提升还有很大空间。 现在大家都没有足够大。
  2. 对输入做扩展,本质利用先验,现在各种做法,按照有效性排序:
    2.1 直接产生其他对应相机角度的。 (这个好处是相机位置是按照固定的产生,后面渲染的时候相机已知)
    2.2 产生360环绕的视频。 (这个相机路径有强约束,但并不是每帧很精确)
    2.3 产生强相关视频。 (这个主要利用视频生成中强大的先验,但相机位姿没啥控制)
    --- 这一堆做法,挑战两个: 1)相机位姿要不要,如何得到。 2)就是一致性够不够
  3. 搞后处理HR
    3.1 用模型来,一般都会提高一点
    3.2 用硬算法来优化mesh,但效果不好说
  4. ...

哈哈,我不算大神啦。 基本认同,补充几点 质量 3D数据还是太少了,视频图片则是海量的。目前的1 比如TripoSR这种先验知识还是太有限了,分辨率也低,规模不够,冷门一些的物体它根本找不着北,不知道是不是只用了objaverse。而2的好处是基于2D模型训出来的,典型的2 比如刚出的SV3D,先验明显多得多。目前阶段2那几个方案都能到更高质量,感觉过一阵子sora这类出了以后,基于它们的新SV3D那就会达到生产质量了。
速度 但是从2D图像成3D资产要高清,目前靠谱的还是需要逐个走 SDS 训练,超级慢。所以理想的方式还是1,个人感觉工业界的落地应该先有2,然后通过2全网积累了海量的3D数据,数据足够以后直接训大模型,到达1的立即生成的效果。

大神,意思是目前生成质量效果最好的还是SDS训练的方法嘛,SV3D这种其次,然后才是triposr这种直接出3D模型的方法嘛,可我测下来为啥觉得triposr的生成质量效果是最好呢,如果有比它好的,大神可以说一下对应的开源项目的名字嘛?万分感谢!!!

可能TripoSR 训练还是不足,见过的物体还是太少,很多没见过的就脑补。不如图片生成 和视频生成模型见多识广。当然了,很多它见过的物体生成很不错。但这个问题是无解的,网上视频和图片是海量的,3D dataset 太有限

@oswardlx
Copy link

meshes = model.extract_mesh(scene_codes, not args.bake_texture, resolution=args.mc_resolution)

TypeError: extract_mesh() got multiple values for argument 'resolution'

@hypervoxel
Copy link

Is marching cubes now possible above 320? I just tried with TripoSR and got his error
"numel needs to be smaller than int32_t max; otherwise, please use packed_accessor64"

@tomyu168
Copy link

tomyu168 commented Jul 1, 2024

用不了啊?TypeError: extract_mesh() got multiple values for argument 'resolution'

@Duodecimus
Copy link

用不了啊?TypeError: extract_mesh() got multiple values for argument 'resolution'

This is caused by a mismatch between function def and function calls
Defined as def extract_mesh(self, scene_codes, resolution: int = 256, threshold: float = 25.0)
but in run.py:173 it is called with meshes = model.extract_mesh(scene_codes, not args.bake_texture, resolution=args.mc_resolution)
and in gradio_app.py:63 with mesh = model.extract_mesh(scene_codes, True, resolution=mc_resolution)[0]

Both these instances have scenecodes, some boolean variable, and then resolution.
The def has resolution in slot 2, the calls have it in slot 3

Fix is to remove the boolan in the calls.
run.py:173
meshes = model.extract_mesh(scene_codes, resolution=args.mc_resolution)
gradio_app.py:63
mesh = model.extract_mesh(scene_codes, resolution=mc_resolution)[0]

@Duodecimus
Copy link

I've noticed a problem with meshes made above 256.
the higher the cubes resolution, the more of these free points get created with the mesh.
left is 256, right is 1024
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants