Upload __main__.py
Browse files- __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()
|