- pipeline edge transforms: stages can declare accepted_transforms, edges carry a transform dict, runner injects per-stage and nodes apply (e.g. invert_mask before edge detection); editable from UI via PUT /config/edge-transform - rename mpr-ui-framework -> soleprint-ui (now an external package synced via .spr from /home/mariano/wdir/spr); add @vue-flow/core and uplot to detection-app so linked package resolves them - Tiltfile guards kubectl context, k8s commands pin --context kind-mpr - kind-config: gateway on hostPort 30080 (Caddy fronts mpr.local.ar) - modelgen: pyproject.toml, .spr marker, dict default_factory support
144 lines
3.0 KiB
JSON
144 lines
3.0 KiB
JSON
{
|
|
"name": "soccer_broadcast",
|
|
"pipeline": {
|
|
"name": "soccer_broadcast",
|
|
"profile_name": "soccer_broadcast",
|
|
"stages": [
|
|
{
|
|
"name": "extract_frames",
|
|
"branch": "trunk"
|
|
},
|
|
{
|
|
"name": "filter_scenes",
|
|
"branch": "trunk"
|
|
},
|
|
{
|
|
"name": "field_segmentation",
|
|
"branch": "trunk"
|
|
},
|
|
{
|
|
"name": "detect_edges",
|
|
"branch": "hoarding"
|
|
},
|
|
{
|
|
"name": "detect_objects",
|
|
"branch": "objects"
|
|
},
|
|
{
|
|
"name": "preprocess"
|
|
},
|
|
{
|
|
"name": "run_ocr"
|
|
},
|
|
{
|
|
"name": "match_brands"
|
|
},
|
|
{
|
|
"name": "escalate_vlm"
|
|
},
|
|
{
|
|
"name": "escalate_cloud"
|
|
},
|
|
{
|
|
"name": "compile_report"
|
|
}
|
|
],
|
|
"edges": [
|
|
{
|
|
"source": "extract_frames",
|
|
"target": "filter_scenes"
|
|
},
|
|
{
|
|
"source": "filter_scenes",
|
|
"target": "field_segmentation"
|
|
},
|
|
{
|
|
"source": "field_segmentation",
|
|
"target": "detect_edges",
|
|
"transform": {"invert_mask": true}
|
|
},
|
|
{
|
|
"source": "field_segmentation",
|
|
"target": "detect_objects"
|
|
},
|
|
{
|
|
"source": "detect_edges",
|
|
"target": "preprocess"
|
|
},
|
|
{
|
|
"source": "detect_objects",
|
|
"target": "preprocess"
|
|
},
|
|
{
|
|
"source": "preprocess",
|
|
"target": "run_ocr"
|
|
},
|
|
{
|
|
"source": "run_ocr",
|
|
"target": "match_brands"
|
|
},
|
|
{
|
|
"source": "match_brands",
|
|
"target": "escalate_vlm"
|
|
},
|
|
{
|
|
"source": "escalate_vlm",
|
|
"target": "escalate_cloud"
|
|
},
|
|
{
|
|
"source": "escalate_cloud",
|
|
"target": "compile_report"
|
|
}
|
|
]
|
|
},
|
|
"configs": {
|
|
"extract_frames": {
|
|
"fps": 2.0,
|
|
"max_frames": 500
|
|
},
|
|
"filter_scenes": {
|
|
"hamming_threshold": 8,
|
|
"enabled": true
|
|
},
|
|
"field_segmentation": {
|
|
"enabled": true,
|
|
"hue_low": 30,
|
|
"hue_high": 85,
|
|
"sat_low": 30,
|
|
"sat_high": 255,
|
|
"val_low": 30,
|
|
"val_high": 255,
|
|
"morph_kernel": 15,
|
|
"min_area_ratio": 0.05
|
|
},
|
|
"detect_edges": {
|
|
"enabled": true,
|
|
"edge_canny_low": 50,
|
|
"edge_canny_high": 150,
|
|
"edge_hough_threshold": 80,
|
|
"edge_hough_min_length": 100,
|
|
"edge_hough_max_gap": 10,
|
|
"edge_pair_max_distance": 200,
|
|
"edge_pair_min_distance": 15
|
|
},
|
|
"detect_objects": {
|
|
"model_name": "yolov8n.pt",
|
|
"confidence_threshold": 0.3,
|
|
"target_classes": []
|
|
},
|
|
"run_ocr": {
|
|
"languages": [
|
|
"en",
|
|
"es"
|
|
],
|
|
"min_confidence": 0.5
|
|
},
|
|
"match_brands": {
|
|
"fuzzy_threshold": 75
|
|
},
|
|
"escalate_vlm": {
|
|
"vlm_prompt_template": "Identify the brand or sponsor visible in this cropped region from a soccer broadcast.{hint}{text} Respond with: brand, confidence (0-1), reasoning."
|
|
}
|
|
}
|
|
}
|