Files
xiaden 315666c7b6 refactor: restructure into subpackages, add _shared layer, remove AI slop
- Split flat node modules into categorized subpackages (tagging, detect,
  edge, pose, segment, restore, compare, judge, transform, utility)
- Extract shared internals into _shared/ (bases, tensor, formatting)
- Centralize node registration via register_nodes() helper
- Clean up: remove dead is_scored return, unnecessary hasattr guard,
  inline imports
2026-07-05 08:59:48 +00:00

41 lines
1.4 KiB
Python

"""
String formatting and serialization helpers for node outputs.
"""
import json
from typing import Any
def keypoints_to_json(keypoints_list: list[Any]) -> str:
"""Serialize OP18KeyPointSet objects to JSON keypoints."""
result = []
for kp in keypoints_list:
person = {}
for attr_name in ("body", "face", "left_hand", "right_hand", "left_foot", "right_foot"):
arr = getattr(kp, attr_name, None)
if arr is not None and len(arr) > 0:
# Each row is (y, x, confidence) — convert to [x, y, confidence] for readability
points = []
for row in arr:
if len(row) >= 3:
points.append([float(row[1]), float(row[0]), float(row[2])])
elif len(row) >= 2:
points.append([float(row[1]), float(row[0]), 0.0])
person[attr_name] = points
result.append(person)
return json.dumps(result, indent=2)
def join_tag_names(*sections: dict) -> str:
"""Join tag names from multiple dicts into a comma-separated string, sorted by confidence descending."""
parts = []
for d in sections:
parts.extend(k for k, _v in sorted(d.items(), key=lambda x: x[1], reverse=True))
return ", ".join(parts)
def label_display(raw: str) -> str:
"""Convert snake_case labels to Title Case for display."""
return raw.replace("_", " ").title()