Manar55's picture
Deploy a5180b1
82d7501 verified
Raw History Blame Contribute Delete
2.64 kB
from .config import Config
from .types import AnalysisResult, Verdict
from .ingest import ingest_video
from .face import analyze_faces
from .roi import extract_rois
from .stabilization import stabilize_rois
from .rppg import extract_rppg
from .quality import compute_sqi
from .features import compute_features
from .scoring import score_and_decide
def analyze_video(input_path: str, config: Config) -> AnalysisResult:
"""
Public entrypoint for the bioverify engine.
Run the full analysis pipeline (ingest, face, ROI, stabilization, rPPG,
SQI, features, scoring) and return an AnalysisResult.
"""
try:
ingest_result = ingest_video(input_path, config)
face_result = analyze_faces(input_path, ingest_result, config)
roi_result = extract_rois(
input_path, face_result["metrics"], ingest_result, config
)
stabilization_result = stabilize_rois(
ingest_result, face_result["metrics"], roi_result["metrics"], config
)
rppg_result = extract_rppg(
input_path,
ingest_result,
roi_result["metrics"],
config,
)
sqi = compute_sqi(rppg_result["metrics"], stabilization_result["metrics"], config)
feats = compute_features(rppg_result["metrics"])
scoring = score_and_decide(sqi, feats, config)
metrics = {
"config_version": config.config_version,
"ingest": ingest_result.metrics,
"face": face_result["metrics"],
"roi": roi_result["metrics"],
"stabilization": stabilization_result["metrics"],
"rppg": rppg_result["metrics"],
"sqi": sqi,
"features": feats,
"scoring": scoring["breakdown"],
}
return AnalysisResult(
verdict=scoring["verdict"],
score=scoring["score"],
confidence=scoring["confidence"],
reasons=ingest_result.reasons + face_result["reasons"] + scoring["reasons"],
metrics=metrics,
evidence_paths={},
error=None,
config_version=config.config_version,
)
except Exception as exc: # noqa: BLE001
return AnalysisResult(
verdict=Verdict.INCONCLUSIVE,
score=0.0,
confidence=0.0,
reasons=["internal_error"],
metrics={},
evidence_paths={},
error={"message": str(exc), "type": exc.__class__.__name__},
config_version=config.config_version,
)
__all__ = ["analyze_video", "Config", "AnalysisResult", "Verdict"]