ScoreVision / miner.py
echoctx's picture
scorevision: push artifact
3483eb1 verified
Raw
History Blame Contribute Delete
2.61 kB
"""Scaffold miner for manak0/Detect-fire (specialized public package).
Required chute contract:
- class named Miner
- method predict_batch(batch_images, offset, n_keypoints) -> list[TVFrameResult]
- this file lives at the root of the HF model repo
This scaffold is intentionally element-specialized (object labels,
element metadata). Weights are placeholder; distill/train fills real
ONNX/PT artifacts under the 30 MB hard cap.
"""
from __future__ import annotations
from pathlib import Path
from typing import Any
from pydantic import BaseModel
class BoundingBox(BaseModel):
x1: int
y1: int
x2: int
y2: int
cls_id: int
conf: float
class Polygon(BaseModel):
cls_id: int
conf: float
points: list[tuple[int, int]]
class TVFrameResult(BaseModel):
frame_id: int
boxes: list[BoundingBox] | None = None
polygons: list[Polygon] | None = None
keypoints: list[tuple[int, int]] | None = None
ELEMENT_ID = 'manak0/Detect-fire'
SHORT_NAME = 'fire'
OBJECT_LABELS = (
'fire',
'smoke',
'flame',
'ember',
'torch',
)
class Miner:
"""Specialist detector package for manak0/Detect-fire."""
def __init__(self, path_hf_repo: Path) -> None:
self.path_hf_repo = Path(path_hf_repo)
self.element_id = ELEMENT_ID
self.object_labels = list(OBJECT_LABELS)
self._weights = self._discover_weights()
def _discover_weights(self) -> Path | None:
for name in ("model.onnx", "weights.onnx", "model.pt", "weights.pt"):
cand = self.path_hf_repo / name
if cand.is_file():
return cand
return None
def __repr__(self) -> str:
wname = self._weights.name if self._weights else None
return (
"Miner(element=%r, labels=%d, weights=%s)"
% (self.element_id, len(self.object_labels), wname)
)
def predict_batch(
self,
batch_images: list[Any],
offset: int,
n_keypoints: int,
) -> list[TVFrameResult]:
"""Return frame results. Scaffold emits empty boxes (schema-valid).
Live distillation replaces this with a tiny specialist detector.
"""
results: list[TVFrameResult] = []
kps = [(0, 0) for _ in range(max(0, int(n_keypoints)))]
for i in range(len(batch_images)):
results.append(
TVFrameResult(
frame_id=offset + i,
boxes=[],
polygons=[],
keypoints=list(kps),
)
)
return results