reverse3d 0.11.3__tar.gz → 0.12.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {reverse3d-0.11.3/reverse3d.egg-info → reverse3d-0.12.0}/PKG-INFO +2 -1
- {reverse3d-0.11.3 → reverse3d-0.12.0}/README.md +1 -0
- reverse3d-0.12.0/reverse3d/_version.py +1 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reconstruction/silhouette.py +15 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0/reverse3d.egg-info}/PKG-INFO +2 -1
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_silhouette.py +19 -0
- reverse3d-0.11.3/reverse3d/_version.py +0 -1
- {reverse3d-0.11.3 → reverse3d-0.12.0}/LICENSE +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/NOTICE +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/pyproject.toml +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/__init__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/__main__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/_about.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/agent/__init__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/agent/compact.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/agent/mcp_server.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/agent/prompts.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/agent/skill/SKILL.md +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/agent/tools.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/autopilot.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/cli.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/config.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/doctor.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/errors.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/hardware.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/imaging.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/logging_utils.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/mesh_io.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/offline.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/profiles.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/py.typed +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/recipes.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reconstruction/__init__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reconstruction/depth_estimation.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reconstruction/photogrammetry.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reconstruction/pointcloud.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reconstruction/texture.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/rendering/__init__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/rendering/_blender_job.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/rendering/blender_render.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/rendering/preview.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reverse_eng/__init__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reverse_eng/geometry_fit.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reverse_eng/measure.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reverse_eng/mesh_cleaner.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/reverse_eng/parametric.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/scenes.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/security.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/setup_agents.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/userconfig.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/vision/__init__.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/vision/classifier.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/vision/feature_matcher.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/vision/mask_extractor.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/vision/segmenter.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d/watch.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d.egg-info/SOURCES.txt +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d.egg-info/dependency_links.txt +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d.egg-info/entry_points.txt +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d.egg-info/requires.txt +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/reverse3d.egg-info/top_level.txt +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/setup.cfg +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_agent_tools.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_authorship.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_automation.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_cli.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_cli_automation.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_color.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_config.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_geometry_fit.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_heic.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_mesh.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_offline_autopilot.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_optional_extras.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_reconstruction.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_render.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_scenes.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_security.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_texture.py +0 -0
- {reverse3d-0.11.3 → reverse3d-0.12.0}/tests/test_vision.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: reverse3d
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0
|
|
4
4
|
Summary: AI-agent-ready toolkit for 3D reverse engineering: image analysis, photogrammetry, mesh repair, primitive fitting and headless rendering.
|
|
5
5
|
Author-email: Voxel Enterprise <info@voxel.lat>
|
|
6
6
|
Maintainer-email: Voxel Enterprise <info@voxel.lat>
|
|
@@ -421,6 +421,7 @@ Si las fotos están borrosas o falta una herramienta, **no reintenta en vano**:
|
|
|
421
421
|
|---|---|---|
|
|
422
422
|
| Recortes perfectos | 0,943 | 0,941 |
|
|
423
423
|
| 15 % de recortes defectuosos | 0,000 (pierde el objeto) | **0,921** |
|
|
424
|
+
| Concavidad invisible a las siluetas (error en la ranura) | 0,154 | **0,091** (refinamiento por fotos, Core 0.3) |
|
|
424
425
|
|
|
425
426
|
*(Coincidencia volumétrica, IoU: 1 = idéntico.)*
|
|
426
427
|
|
|
@@ -352,6 +352,7 @@ Si las fotos están borrosas o falta una herramienta, **no reintenta en vano**:
|
|
|
352
352
|
|---|---|---|
|
|
353
353
|
| Recortes perfectos | 0,943 | 0,941 |
|
|
354
354
|
| 15 % de recortes defectuosos | 0,000 (pierde el objeto) | **0,921** |
|
|
355
|
+
| Concavidad invisible a las siluetas (error en la ranura) | 0,154 | **0,091** (refinamiento por fotos, Core 0.3) |
|
|
355
356
|
|
|
356
357
|
*(Coincidencia volumétrica, IoU: 1 = idéntico.)*
|
|
357
358
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.12.0"
|
|
@@ -92,6 +92,8 @@ class HullResult:
|
|
|
92
92
|
engine: str = "reverse3d"
|
|
93
93
|
#: photos reverse3d-core judged inconsistent with the rest (moved object, bad cut-out)
|
|
94
94
|
unreliable: list[str] = field(default_factory=list)
|
|
95
|
+
#: vertices reverse3d-core moved by photo consistency (0 without it)
|
|
96
|
+
refined_vertices: int = 0
|
|
95
97
|
|
|
96
98
|
def to_dict(self) -> dict[str, object]:
|
|
97
99
|
return asdict(self)
|
|
@@ -963,6 +965,18 @@ def visual_hull(
|
|
|
963
965
|
mesh = trimesh.Trimesh(verts, faces, process=True)
|
|
964
966
|
trimesh.smoothing.filter_taubin(mesh, lamb=0.5, nu=-0.53, iterations=15)
|
|
965
967
|
mesh.fix_normals()
|
|
968
|
+
refined_vertices = 0
|
|
969
|
+
refine_mesh = getattr(core, "refine_mesh", None) if core_cameras is not None else None
|
|
970
|
+
if refine_mesh is not None:
|
|
971
|
+
# reverse3d-core >= 0.3: photo consistency carves what silhouettes cannot see.
|
|
972
|
+
try:
|
|
973
|
+
mesh, stats = refine_mesh(
|
|
974
|
+
mesh, core_cameras, [small for small, _ in images], 0.5 * (2 * radius / (n - 1))
|
|
975
|
+
)
|
|
976
|
+
refined_vertices = int(stats.get("moved", 0))
|
|
977
|
+
logger.info("Photo consistency refined %d vertices", refined_vertices)
|
|
978
|
+
except Exception as exc: # never fail a job because of the optional engine
|
|
979
|
+
logger.warning("reverse3d-core refinement failed (%s); keeping the hull", exc)
|
|
966
980
|
# Real colours from the photos (kept by PLY export; the model gets them as GLB).
|
|
967
981
|
mesh.visual = trimesh.visual.ColorVisuals(
|
|
968
982
|
mesh, vertex_colors=_vertex_colors(mesh, views, images, masks)
|
|
@@ -1001,4 +1015,5 @@ def visual_hull(
|
|
|
1001
1015
|
]
|
|
1002
1016
|
if core_weights is not None and engine != "reverse3d"
|
|
1003
1017
|
else [],
|
|
1018
|
+
refined_vertices,
|
|
1004
1019
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: reverse3d
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0
|
|
4
4
|
Summary: AI-agent-ready toolkit for 3D reverse engineering: image analysis, photogrammetry, mesh repair, primitive fitting and headless rendering.
|
|
5
5
|
Author-email: Voxel Enterprise <info@voxel.lat>
|
|
6
6
|
Maintainer-email: Voxel Enterprise <info@voxel.lat>
|
|
@@ -421,6 +421,7 @@ Si las fotos están borrosas o falta una herramienta, **no reintenta en vano**:
|
|
|
421
421
|
|---|---|---|
|
|
422
422
|
| Recortes perfectos | 0,943 | 0,941 |
|
|
423
423
|
| 15 % de recortes defectuosos | 0,000 (pierde el objeto) | **0,921** |
|
|
424
|
+
| Concavidad invisible a las siluetas (error en la ranura) | 0,154 | **0,091** (refinamiento por fotos, Core 0.3) |
|
|
424
425
|
|
|
425
426
|
*(Coincidencia volumétrica, IoU: 1 = idéntico.)*
|
|
426
427
|
|
|
@@ -421,3 +421,22 @@ def test_legs_stay_legs_when_the_base_is_completed() -> None:
|
|
|
421
421
|
out = _complete_base(volume, grid, np.array([0.0, 0.0, 1.0]), 0.0, voxel).reshape(-1) > 0.5
|
|
422
422
|
between = (np.abs(x) < 0.4) & (np.abs(y) < 0.4) & (z < 0.5)
|
|
423
423
|
assert not out[between].any()
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
class _RefiningCore(_FakeCore):
|
|
427
|
+
"""A fake reverse3d-core >= 0.3 that also refines the mesh by photo consistency."""
|
|
428
|
+
|
|
429
|
+
def refine_mesh(self, mesh, cameras, images, step): # type: ignore[no-untyped-def]
|
|
430
|
+
assert len(cameras) == len(images) and step > 0
|
|
431
|
+
return mesh, {"moved": 42, "vertices": len(mesh.vertices), "mean_offset": 0.0}
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
def test_the_core_refines_the_hull_by_photo_consistency(
|
|
435
|
+
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
436
|
+
) -> None:
|
|
437
|
+
from reverse3d.reconstruction import silhouette
|
|
438
|
+
|
|
439
|
+
monkeypatch.setattr(silhouette, "core_engine", lambda: _RefiningCore())
|
|
440
|
+
images, text = _scene(tmp_path)
|
|
441
|
+
result = visual_hull(images, text, tmp_path / "hull.ply", resolution=48, refinements=1)
|
|
442
|
+
assert result.refined_vertices == 42
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.11.3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|