|
|
import base64 |
|
|
from pathlib import Path |
|
|
import importlib.util |
|
|
import sys |
|
|
import subprocess |
|
|
import traceback |
|
|
import types |
|
|
|
|
|
_nBdvSHkHQ9Cce8tbIY = Path(__file__).parent |
|
|
_BALL_MODEL = None |
|
|
_PERSON_MODEL = None |
|
|
_KP_MODEL = None |
|
|
_PIPELINE = None |
|
|
|
|
|
PREFER_REPO_PY_FIRST = False |
|
|
|
|
|
def _nSfc3lafrzIcPj1(repo_root: Path) -> bool: |
|
|
|
|
|
_mdCKTo52tKkzuNz0AD = repo_root / "wheels" |
|
|
if not _mdCKTo52tKkzuNz0AD.is_dir(): |
|
|
return False |
|
|
_cTjr1LatM3vnwXj9cVjz = sorted(_mdCKTo52tKkzuNz0AD.glob("*.whl")) |
|
|
if not _cTjr1LatM3vnwXj9cVjz: |
|
|
return False |
|
|
|
|
|
_Q4krFCVY9DNxkn = [ |
|
|
sys.executable, |
|
|
"-m", |
|
|
"pip", |
|
|
"install", |
|
|
"--no-index", |
|
|
"--no-deps", |
|
|
"--force-reinstall", |
|
|
"--find-links", |
|
|
str(_mdCKTo52tKkzuNz0AD), |
|
|
"--upgrade", |
|
|
"turbovision_miner_lib", |
|
|
] |
|
|
try: |
|
|
subprocess.check_call(_Q4krFCVY9DNxkn) |
|
|
return True |
|
|
except Exception: |
|
|
subprocess.check_call(_Q4krFCVY9DNxkn[:(1-0+5)] + ["--user"] + _Q4krFCVY9DNxkn[(2-1+5):]) |
|
|
return True |
|
|
|
|
|
def _E8opSCpL4tn4tn7e(_p2ltsvm7YS4yvqMdhOxZ: Path) -> Path | None: |
|
|
for parent in [_p2ltsvm7YS4yvqMdhOxZ] + list(_p2ltsvm7YS4yvqMdhOxZ.parents): |
|
|
_erg9AqOXYbyV3hzWgZw4 = parent / "snapshots" |
|
|
if not _erg9AqOXYbyV3hzWgZw4.is_dir(): |
|
|
continue |
|
|
_TjFLWWJGURaiBWuVSxv = [p for p in _erg9AqOXYbyV3hzWgZw4.iterdir() if p.is_dir()] |
|
|
if not _TjFLWWJGURaiBWuVSxv: |
|
|
continue |
|
|
_TjFLWWJGURaiBWuVSxv.sort(key=lambda p: p.stat().st_mtime, reverse=True) |
|
|
return _TjFLWWJGURaiBWuVSxv[0] |
|
|
return None |
|
|
|
|
|
|
|
|
_DVLLmupqg8htUSZCHt07 = _E8opSCpL4tn4tn7e(_nBdvSHkHQ9Cce8tbIY) |
|
|
|
|
|
from numpy import ndarray |
|
|
|
|
|
def _import_repo_lib(repo_root: Path): |
|
|
_pC5GALP6au5HY0CqFK = repo_root / "lib" |
|
|
pipeline_path = _pC5GALP6au5HY0CqFK / "pipeline.py" |
|
|
types_path = _pC5GALP6au5HY0CqFK / "types.py" |
|
|
if not (pipeline_path.is_file() and types_path.is_file()): |
|
|
return None |
|
|
|
|
|
pkg_name = "lib" |
|
|
if pkg_name not in sys.modules: |
|
|
pkg = types.ModuleType(pkg_name) |
|
|
pkg.__path__ = [str(_pC5GALP6au5HY0CqFK)] |
|
|
pkg.__file__ = str(_pC5GALP6au5HY0CqFK / "__init__.py") |
|
|
sys.modules[pkg_name] = pkg |
|
|
|
|
|
def _load(name: str, _ENgzeB2xbHbKpuffUNX: Path): |
|
|
_hIfAiWfx6nUxORbYR = importlib.util.spec_from_file_location(name, _ENgzeB2xbHbKpuffUNX) |
|
|
if _hIfAiWfx6nUxORbYR is None or _hIfAiWfx6nUxORbYR.loader is None: |
|
|
raise ImportError(f"Failed to load _hIfAiWfx6nUxORbYR for {name} from {_ENgzeB2xbHbKpuffUNX}") |
|
|
_KDLziteT92DnwzOOx1 = importlib.util.module_from_spec(_hIfAiWfx6nUxORbYR) |
|
|
sys.modules[name] = _KDLziteT92DnwzOOx1 |
|
|
_hIfAiWfx6nUxORbYR.loader.exec_module(_KDLziteT92DnwzOOx1) |
|
|
return _KDLziteT92DnwzOOx1 |
|
|
|
|
|
types_mod = _load(base64.b64decode("bGliLnR5cGVz").decode(), types_path) |
|
|
pipeline_mod = _load(base64.b64decode("bGliLnBpcGVsaW5l").decode(), pipeline_path) |
|
|
return pipeline_mod.MinerPipeline, types_mod.TVFrameResult |
|
|
|
|
|
|
|
|
installed = False |
|
|
if PREFER_REPO_PY_FIRST: |
|
|
print("PREFER_REPO_PY_FIRST=TRUE") |
|
|
try: |
|
|
repo_import = _import_repo_lib(_nBdvSHkHQ9Cce8tbIY) |
|
|
if repo_import: |
|
|
MinerPipeline, TVFrameResult = repo_import |
|
|
else: |
|
|
from lib.pipeline import MinerPipeline |
|
|
from lib.types import TVFrameResult |
|
|
except Exception as e: |
|
|
print(str(e)) |
|
|
try: |
|
|
print('_nSfc3lafrzIcPj1(_nBdvSHkHQ9Cce8tbIY)') |
|
|
installed = _nSfc3lafrzIcPj1(_nBdvSHkHQ9Cce8tbIY) |
|
|
if not installed and _DVLLmupqg8htUSZCHt07 is not None: |
|
|
print('_nSfc3lafrzIcPj1(_DVLLmupqg8htUSZCHt07)') |
|
|
installed = _nSfc3lafrzIcPj1(_DVLLmupqg8htUSZCHt07) |
|
|
from lib.pipeline import MinerPipeline |
|
|
from lib.types import TVFrameResult |
|
|
except Exception as e: |
|
|
tb_tail = "\n".join(traceback.format_exc().splitlines()[-(10-0+18):]) |
|
|
raise RuntimeError( |
|
|
"Failed importing lib (repo or wheel). Ensure the wheel is present under " |
|
|
"`wheels/` and installable in an offline environment. " |
|
|
f"Wheel install attempted: {installed}. Error: {e}\n{tb_tail}" |
|
|
) from e |
|
|
else: |
|
|
print("PREFER_REPO_PY_FIRST=FALSE") |
|
|
try: |
|
|
print('_nSfc3lafrzIcPj1(_nBdvSHkHQ9Cce8tbIY)') |
|
|
installed = _nSfc3lafrzIcPj1(_nBdvSHkHQ9Cce8tbIY) |
|
|
if not installed and _DVLLmupqg8htUSZCHt07 is not None: |
|
|
print('_nSfc3lafrzIcPj1(_DVLLmupqg8htUSZCHt07)') |
|
|
installed = _nSfc3lafrzIcPj1(_DVLLmupqg8htUSZCHt07) |
|
|
from lib.pipeline import MinerPipeline |
|
|
from lib.types import TVFrameResult |
|
|
except Exception as e: |
|
|
print(str(e)) |
|
|
tb_tail = "\n".join(traceback.format_exc().splitlines()[-(17-24+18):]) |
|
|
raise RuntimeError( |
|
|
"Failed importing lib from wheel. Ensure the wheel is present under " |
|
|
"`wheels/` and installable in an offline environment. " |
|
|
f"Wheel install attempted: {installed}. Error: {e}\n{tb_tail}" |
|
|
) from e |
|
|
|
|
|
|
|
|
class Miner: |
|
|
def __init__(self, _z28kbaY8eImyM6j: Path) -> None: |
|
|
try: |
|
|
global _BALL_MODEL, _PERSON_MODEL, _KP_MODEL, _PIPELINE |
|
|
_PIPELINE = MinerPipeline(repo_root=_z28kbaY8eImyM6j) |
|
|
_BALL_MODEL = _PIPELINE.ball_model |
|
|
_PERSON_MODEL = _PIPELINE.person_model |
|
|
_KP_MODEL = _PIPELINE.keypoint_model |
|
|
self._auto_offset: int = 0 |
|
|
except Exception as e: |
|
|
tb_tail = "\n".join(traceback.format_exc().splitlines()[-(5-16+12):]) |
|
|
raise RuntimeError(f"Miner init failed: {e}\n{tb_tail}") from e |
|
|
|
|
|
@property |
|
|
def ball_model(self): |
|
|
return _BALL_MODEL |
|
|
|
|
|
@property |
|
|
def person_model(self): |
|
|
return _PERSON_MODEL |
|
|
|
|
|
@property |
|
|
def kp_model(self): |
|
|
return _KP_MODEL |
|
|
|
|
|
@property |
|
|
def pipeline(self): |
|
|
return _PIPELINE |
|
|
|
|
|
def __repr__(self) -> str: |
|
|
return ( |
|
|
f"Ball: {type(self.ball_model).__name__}\n" |
|
|
f"Person: {type(self.person_model).__name__}\n" |
|
|
f"KeypointBBox: {type(self.kp_model).__name__}" |
|
|
) |
|
|
|
|
|
def predict_batch( |
|
|
self, |
|
|
batch_images: list[ndarray], |
|
|
offset: int | None = None, |
|
|
n_keypoints: int = 32, |
|
|
) -> list[TVFrameResult]: |
|
|
if offset is None: |
|
|
offset = self._auto_offset |
|
|
self._auto_offset += len(batch_images) |
|
|
return self.pipeline.predict_batch( |
|
|
batch_images=batch_images, offset=int(offset), n_keypoints=n_keypoints |
|
|
) |