bdck commited on
Commit
ecb7b71
·
verified ·
1 Parent(s): 70d6e03

Upload __main__.py

Browse files
Files changed (1) hide show
  1. __main__.py +69 -0
__main__.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ CLI entry point for LightweightMR reconstruction.
3
+ Usage:
4
+ python -m lightweightmr --input path/to/pointcloud.ply --output path/to/mesh.ply
5
+ """
6
+ import argparse
7
+ import os
8
+ import sys
9
+ from .optimize import Runner
10
+
11
+
12
+ def main():
13
+ parser = argparse.ArgumentParser(description="LightweightMR — pure-Python mesh reconstruction")
14
+ parser.add_argument("--input", "-i", required=True, help="Input point cloud (.ply, .pcd, .xyz)")
15
+ parser.add_argument("--output", "-o", required=True, help="Output mesh file (.ply or .obj)")
16
+ parser.add_argument("--device", default="cpu", help="torch device: cpu or cuda")
17
+ parser.add_argument("--out-dir", default="./output", help="Intermediate outputs directory")
18
+ parser.add_argument("--sdf-iters", type=int, default=20_000, help="SDF training iterations")
19
+ parser.add_argument("--vg-iters", type=int, default=8_000, help="Vertex generation iterations")
20
+ parser.add_argument("--sdf-lr", type=float, default=1e-3, help="SDF learning rate")
21
+ parser.add_argument("--vg-lr", type=float, default=1e-3, help="VG learning rate")
22
+ parser.add_argument("--sdf-batch", type=int, default=5_000, help="SDF batch size")
23
+ parser.add_argument("--vertices", type=int, default=3_400, help="Target number of vertices")
24
+ parser.add_argument("--update-size", type=int, default=5, help="Curriculum update steps")
25
+ parser.add_argument("--update-ratio", type=float, default=1.2, help="Curriculum growth ratio")
26
+ parser.add_argument("--k-samples", type=int, default=21, help="Tetrahedron interior samples")
27
+ parser.add_argument("--multires", type=int, default=8, help="Positional encoding frequencies")
28
+ parser.add_argument("--queries-size", type=int, default=1_000_000, help="SDF query sample count")
29
+ parser.add_argument("--surface-queries", type=int, default=200_000, help="Surface query count")
30
+ parser.add_argument("--project-sdf-level", type=float, default=0.0, help="SDD projection level")
31
+ parser.add_argument("--save-freq", type=int, default=2_000, help="Checkpoint save frequency")
32
+ parser.add_argument("--resume-sdf", default=None, help="Resume from SDF checkpoint .pth")
33
+
34
+ args = parser.parse_args()
35
+
36
+ if not os.path.exists(args.input):
37
+ print(f"ERROR: input file not found: {args.input}")
38
+ sys.exit(1)
39
+
40
+ runner = Runner(
41
+ pointcloud_path=args.input,
42
+ out_dir=args.out_dir,
43
+ device=args.device,
44
+ sdf_iters=args.sdf_iters,
45
+ vg_iters=args.vg_iters,
46
+ sdf_lr=args.sdf_lr,
47
+ vg_lr=args.vg_lr,
48
+ sdf_batch=args.sdf_batch,
49
+ vertices_size=args.vertices,
50
+ update_size=args.update_size,
51
+ update_ratio=args.update_ratio,
52
+ k_samples=args.k_samples,
53
+ multires=args.multires,
54
+ queries_size=args.queries_size,
55
+ surface_queries=args.surface_queries,
56
+ project_sdf_level=args.project_sdf_level,
57
+ save_freq=args.save_freq,
58
+ )
59
+
60
+ if args.resume_sdf:
61
+ print(f"Loading SDF checkpoint: {args.resume_sdf}")
62
+ runner.load_sdf_checkpoint(args.resume_sdf)
63
+
64
+ v, f = runner.run(mesh_path=args.output)
65
+ print(f"\nDone! Mesh: {len(v)} vertices, {len(f)} faces")
66
+
67
+
68
+ if __name__ == "__main__":
69
+ main()