Spaces:
Sleeping
Sleeping
| """Neuro-inspired scoring for a detected scene. | |
| These scores are a SIMULATION for visualization, not a neuroscience measurement | |
| and not a medical diagnosis. They are simple, transparent heuristics derived from | |
| the object detections. | |
| """ | |
| from statistics import fmean, pvariance | |
| def _box_center(box: dict) -> tuple: | |
| return ( | |
| (box["xmin"] + box["xmax"]) / 2.0, | |
| (box["ymin"] + box["ymax"]) / 2.0, | |
| ) | |
| def compute_scores(detection: dict) -> dict: | |
| """Build 0-100 scores from a detection result (see detection.detect).""" | |
| objects = detection["objects"] | |
| size = detection["image_size"] | |
| width = max(size["width"], 1) | |
| height = max(size["height"], 1) | |
| object_count = len(objects) | |
| # More objects -> more clutter. | |
| visual_clutter = min(object_count * 12, 100) | |
| # Spatial spread: how scattered the object centers are across the frame. | |
| # Normalized variance of centers (0 = all stacked, ~100 = spread to corners). | |
| if object_count >= 2: | |
| cx = [_box_center(o["box"])[0] / width for o in objects] | |
| cy = [_box_center(o["box"])[1] / height for o in objects] | |
| spread = (pvariance(cx) + pvariance(cy)) # each variance in [0, 0.25] | |
| spread_score = min(spread / 0.5 * 100, 100) | |
| else: | |
| spread_score = 0.0 | |
| # Harder to focus when there are many objects AND they are spread out. | |
| focus_difficulty = round(0.6 * visual_clutter + 0.4 * spread_score) | |
| # Confidence of the single most prominent object. | |
| if objects: | |
| top = objects[0] | |
| primary_object = { | |
| "label": top["label"], | |
| "score": round(top["score"] * 100), | |
| } | |
| else: | |
| primary_object = {"label": None, "score": 0} | |
| scene_complexity = round(fmean([visual_clutter, focus_difficulty])) | |
| return { | |
| "object_count": object_count, | |
| "visual_clutter": int(visual_clutter), | |
| "focus_difficulty": int(focus_difficulty), | |
| "primary_object": primary_object, | |
| "scene_complexity": int(scene_complexity), | |
| } | |