Skip to content

Commit 6daa310

Browse files
authored
refactor: introduce PipelineStep to decouple CameraConfig from model/… (#130)
* refactor: introduce PipelineStep to decouple CameraConfig from model/rule concerns Remove model_forwarder_config and camera_rule_config from CameraConfig (pure hardware identity). Introduce PipelineStep (camera_id + model_forwarder_config + camera_rule_config) owned by StationConfig.pipeline_steps: Dict[str, PipelineStep]. Predictions and camera_decisions are now keyed by step_id, enabling multiple models per camera without collision. * refactor: migrate production configs to PipelineStep format Move model_forwarder_config and camera_rule_config out of camera_configs into pipeline_steps for all configs in edge_orchestrator/config/.
1 parent e522c02 commit 6daa310

23 files changed

Lines changed: 254 additions & 199 deletions

edge_orchestrator/config/marker_classif_with_1_raspberry_cam.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
"camera_1": {
55
"camera_id": "camera_1",
66
"camera_type": "raspberry",
7-
"position": "front",
7+
"position": "front"
8+
}
9+
},
10+
"pipeline_steps": {
11+
"step_1": {
12+
"camera_id": "camera_1",
813
"model_forwarder_config": {
914
"model_name": "marker_quality_control",
1015
"model_serving_url": "http://edge_model_serving:8501/",

edge_orchestrator/config/marker_classif_with_1_usb_cam.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
"camera_id": "camera_1",
66
"camera_type": "usb",
77
"source_directory": "/dev/video0",
8-
"position": "front",
8+
"position": "front"
9+
}
10+
},
11+
"pipeline_steps": {
12+
"step_1": {
13+
"camera_id": "camera_1",
914
"model_forwarder_config": {
1015
"model_name": "marker_quality_control",
1116
"model_serving_url": "http://edge_model_serving:8501/",

edge_orchestrator/config/marker_classif_with_2_fake_cam.json

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@
55
"camera_id": "camera_1",
66
"camera_type": "fake",
77
"source_directory": "fake_images/marker_images",
8-
"position": "front",
8+
"position": "front"
9+
},
10+
"camera_2": {
11+
"camera_id": "camera_2",
12+
"camera_type": "fake",
13+
"source_directory": "fake_images/marker_images",
14+
"position": "back"
15+
}
16+
},
17+
"pipeline_steps": {
18+
"step_1": {
19+
"camera_id": "camera_1",
920
"model_forwarder_config": {
1021
"model_name": "marker_quality_control",
1122
"model_serving_url": "http://edge_model_serving:8501/",
@@ -16,11 +27,8 @@
1627
"expected_class": "OK"
1728
}
1829
},
19-
"camera_2": {
30+
"step_2": {
2031
"camera_id": "camera_2",
21-
"camera_type": "fake",
22-
"source_directory": "fake_images/marker_images",
23-
"position": "back",
2432
"model_forwarder_config": {
2533
"model_name": "marker_quality_control",
2634
"model_serving_url": "http://edge_model_serving:8501/",

edge_orchestrator/config/mobilenet_ssd_v2_coco_with_2_usb_cam.json

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@
55
"camera_id": "camera_1",
66
"camera_type": "usb",
77
"source_directory": "/dev/video0",
8-
"position": "front",
8+
"position": "front"
9+
},
10+
"camera_2": {
11+
"camera_id": "camera_2",
12+
"camera_type": "usb",
13+
"source_directory": "/dev/video4",
14+
"position": "back"
15+
}
16+
},
17+
"pipeline_steps": {
18+
"step_1": {
19+
"camera_id": "camera_1",
920
"model_forwarder_config": {
1021
"model_name": "yolo_coco_nano",
1122
"model_serving_url": "http://edge_model_serving:8501/",
@@ -17,11 +28,8 @@
1728
"threshold": 1
1829
}
1930
},
20-
"camera_2": {
31+
"step_2": {
2132
"camera_id": "camera_2",
22-
"camera_type": "usb",
23-
"source_directory": "/dev/video4",
24-
"position": "back",
2533
"model_forwarder_config": {
2634
"model_name": "yolo_coco_nano",
2735
"model_serving_url": "http://edge_model_serving:8501/",

edge_orchestrator/config/pin_detection_with_1_usb_cam.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@
55
"camera_id": "camera_1",
66
"camera_type": "usb",
77
"source_directory": "/dev/video0",
8-
"position": "front",
8+
"position": "front"
9+
}
10+
},
11+
"pipeline_steps": {
12+
"step_1": {
13+
"camera_id": "camera_1",
914
"model_forwarder_config": {
1015
"model_name": "pin_detection",
1116
"model_serving_url": "http://edge_model_serving:8501/",

edge_orchestrator/config/pin_detection_with_2_usb_cam.json

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,18 @@
55
"camera_id": "camera_1",
66
"camera_type": "usb",
77
"source_directory": "/dev/video0",
8-
"position": "front",
8+
"position": "front"
9+
},
10+
"camera_2": {
11+
"camera_id": "camera_2",
12+
"camera_type": "usb",
13+
"source_directory": "/dev/video4",
14+
"position": "back"
15+
}
16+
},
17+
"pipeline_steps": {
18+
"step_1": {
19+
"camera_id": "camera_1",
920
"model_forwarder_config": {
1021
"model_name": "pin_detection",
1122
"model_serving_url": "http://edge_model_serving:8501/",
@@ -16,11 +27,8 @@
1627
"expected_class": "OK"
1728
}
1829
},
19-
"camera_2": {
30+
"step_2": {
2031
"camera_id": "camera_2",
21-
"camera_type": "usb",
22-
"source_directory": "/dev/video4",
23-
"position": "back",
2432
"model_forwarder_config": {
2533
"model_name": "pin_detection",
2634
"model_serving_url": "http://edge_model_serving:8501/",

edge_orchestrator/src/edge_orchestrator/application/use_cases/supervisor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ async def inspect(self, item: Item, station_config: StationConfig):
4444

4545
self._binary_storage_manager.get_binary_storage(station_config).save_item_binaries(item)
4646

47-
await self._model_forwarder_manager.predict_on_binaries(item)
47+
await self._model_forwarder_manager.predict_on_binaries(item, station_config.pipeline_steps)
4848

49-
self._camera_rule_manager.apply_camera_rules(item)
49+
self._camera_rule_manager.apply_camera_rules(item, station_config.pipeline_steps)
5050

5151
self._item_rule_manager.get_item_rule(station_config.item_rule_config).apply_item_rules(item)
5252

edge_orchestrator/src/edge_orchestrator/domain/models/camera/camera_config.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,9 @@
44
from pydantic import BaseModel, model_validator
55

66
from edge_orchestrator.domain.models.camera.camera_type import CameraType
7-
from edge_orchestrator.domain.models.camera_rule.camera_rule_config import (
8-
CameraRuleConfig,
9-
)
107
from edge_orchestrator.domain.models.model_forwarder.image_resolution import (
118
ImageResolution,
129
)
13-
from edge_orchestrator.domain.models.model_forwarder.model_forwarder_config import (
14-
ModelForwarderConfig,
15-
)
1610

1711

1812
class CameraConfig(BaseModel):
@@ -21,8 +15,6 @@ class CameraConfig(BaseModel):
2115
source_directory: Optional[Path] = None
2216
position: Optional[str] = "front"
2317
camera_resolution: Optional[ImageResolution] = None
24-
model_forwarder_config: Optional[ModelForwarderConfig] = None
25-
camera_rule_config: Optional[CameraRuleConfig] = None
2618

2719
@model_validator(mode="after")
2820
def check_params(self):
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from typing import Optional
2+
3+
from pydantic import BaseModel
4+
5+
from edge_orchestrator.domain.models.camera_rule.camera_rule_config import (
6+
CameraRuleConfig,
7+
)
8+
from edge_orchestrator.domain.models.model_forwarder.model_forwarder_config import (
9+
ModelForwarderConfig,
10+
)
11+
12+
13+
class PipelineStep(BaseModel):
14+
camera_id: str
15+
model_forwarder_config: ModelForwarderConfig
16+
camera_rule_config: Optional[CameraRuleConfig] = None

edge_orchestrator/src/edge_orchestrator/domain/models/station_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from edge_orchestrator.domain.models.camera.camera_config import CameraConfig
66
from edge_orchestrator.domain.models.item_rule.item_rule_config import ItemRuleConfig
7+
from edge_orchestrator.domain.models.pipeline_step import PipelineStep
78
from edge_orchestrator.domain.models.storage.storage_config import StorageConfig
89

910

@@ -12,6 +13,7 @@ class StationConfig(BaseModel):
1213

1314
station_name: str
1415
camera_configs: Dict[str, CameraConfig]
16+
pipeline_steps: Dict[str, PipelineStep] = {}
1517
binary_storage_config: StorageConfig
1618
metadata_storage_config: StorageConfig
1719
item_rule_config: Optional[ItemRuleConfig] = None

0 commit comments

Comments
 (0)