Skip to content

Commit 80ff6f0

Browse files
authored
Logger in all nodes. (#217)
* Logging added to the parsers and host nodes. * E2E logger. * Update docker image. * Logger in tests. * Log fixes. * Snap producer logs. * Fix MapOutputParser log.
1 parent 3bd86d6 commit 80ff6f0

37 files changed

+579
-45
lines changed

depthai_nodes/logging.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ def setup_logging(level: Optional[str] = None, file: Optional[str] = None):
3939
if not used_level:
4040
used_level = LogLevel.WARN
4141

42-
format = file_format = "%(asctime)s [depthai-nodes] [%(levelname)s] %(message)s"
42+
format = (
43+
file_format
44+
) = "%(asctime)s [depthai-nodes] [%(levelname)s] [%(name)s] %(message)s"
4345
datefmt = "[%Y-%m-%d %H:%M:%S]"
4446

4547
console_handler = logging.StreamHandler()

depthai_nodes/node/apply_colormap.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ def __init__(
3939
self.setMaxValue(max_value)
4040
self.setInstanceToSemanticMask(instance_to_semantic_mask)
4141

42+
self._logger.debug(
43+
f"ApplyColormap initialized with colormap_value={colormap_value}, max_value={max_value}, instance_to_semantic_mask={instance_to_semantic_mask}",
44+
)
45+
4246
def setColormap(self, colormap_value: int) -> None:
4347
"""Sets the applied color mapping.
4448
@@ -50,6 +54,7 @@ def setColormap(self, colormap_value: int) -> None:
5054
colormap = cv2.applyColorMap(np.arange(256, dtype=np.uint8), colormap_value)
5155
colormap[0] = [0, 0, 0] # Set zero values to black
5256
self._colormap = colormap
57+
self._logger.debug(f"Colormap set to {self._colormap}")
5358

5459
def setMaxValue(self, max_value: int) -> None:
5560
"""Sets the maximum frame value for normalization.
@@ -60,6 +65,7 @@ def setMaxValue(self, max_value: int) -> None:
6065
if not isinstance(max_value, int):
6166
raise ValueError("max_value must be an integer.")
6267
self._max_value = max_value
68+
self._logger.debug(f"Max value set to {self._max_value}")
6369

6470
def setInstanceToSemanticMask(self, instance_to_semantic_mask: bool) -> None:
6571
"""Sets the instance to semantic mask flag.
@@ -71,6 +77,9 @@ def setInstanceToSemanticMask(self, instance_to_semantic_mask: bool) -> None:
7177
if not isinstance(instance_to_semantic_mask, bool):
7278
raise ValueError("instance_to_semantic_mask must be a boolean.")
7379
self._instance_to_semantic_mask = instance_to_semantic_mask
80+
self._logger.debug(
81+
f"Instance to semantic mask set to {self._instance_to_semantic_mask}"
82+
)
7483

7584
def build(self, arr: dai.Node.Output) -> "ApplyColormap":
7685
"""Configures the node connections.
@@ -81,6 +90,7 @@ def build(self, arr: dai.Node.Output) -> "ApplyColormap":
8190
@rtype: ApplyColormap
8291
"""
8392
self.link_args(arr)
93+
self._logger.debug("ApplyColormap built")
8494
return self
8595

8696
def process(self, msg: dai.Buffer) -> None:
@@ -92,7 +102,7 @@ def process(self, msg: dai.Buffer) -> None:
92102
segmentation masks to semantic segmentation masks.
93103
@type instance_to_semantic_segmentation: bool
94104
"""
95-
105+
self._logger.debug("Processing new input")
96106
msg_copy = copy_message(msg)
97107

98108
if isinstance(msg, SegmentationMask):
@@ -140,4 +150,8 @@ def process(self, msg: dai.Buffer) -> None:
140150
frame.setTimestamp(msg.getTimestamp())
141151
frame.setSequenceNum(msg.getSequenceNum())
142152

153+
self._logger.debug("ImgFrame message created")
154+
143155
self.out.send(frame)
156+
157+
self._logger.debug("Message sent successfully")

depthai_nodes/node/base_host_node.py

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

33
import depthai as dai
44

5+
from depthai_nodes.logging import get_logger
6+
57
HostNodeMeta = type(dai.node.HostNode) # metaclass of dai.node.HostNode
68

79

@@ -33,5 +35,7 @@ def __init__(self) -> None:
3335
f"No dai.ImgFrame.Type defined for platform {self._platform}."
3436
) from e
3537

38+
self._logger = get_logger(self.__class__.__name__)
39+
3640
def process(self) -> None:
3741
pass

depthai_nodes/node/depth_merger.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ def __init__(self, shrinking_factor: float = 0) -> None:
3838
)
3939

4040
self.shrinking_factor = shrinking_factor
41+
self._logger.debug(
42+
f"DepthMerger initialized with shrinking_factor={shrinking_factor}"
43+
)
4144

4245
def build(
4346
self,
@@ -50,11 +53,17 @@ def build(
5053
self.link_args(output_2d, output_depth)
5154
self.shrinking_factor = shrinking_factor
5255
self.host_spatials_calc = HostSpatialsCalc(calib_data, depth_alignment_socket)
56+
self._logger.debug(
57+
f"DepthMerger built with shrinking_factor={shrinking_factor}"
58+
)
5359
return self
5460

5561
def process(self, message_2d: dai.Buffer, depth: dai.ImgFrame) -> None:
62+
self._logger.debug("Processing new input")
5663
spatial_dets = self._transform(message_2d, depth)
64+
self._logger.debug("Spatial detections message created")
5765
self.output.send(spatial_dets) # type: ignore
66+
self._logger.debug("Message sent successfully")
5867

5968
def _transform(
6069
self, message_2d: dai.Buffer, depth: dai.ImgFrame

depthai_nodes/node/gather_data.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import depthai as dai
1515

1616
from depthai_nodes import GatheredData
17+
from depthai_nodes.logging import get_logger
1718

1819

1920
@runtime_checkable
@@ -63,6 +64,9 @@ def __init__(self) -> None:
6364
self.input_reference = self.createInput()
6465
self.out = self.createOutput()
6566

67+
self._logger = get_logger(__name__)
68+
self._logger.debug("GatherData initialized")
69+
6670
@staticmethod
6771
def _default_wait_count_fn(reference: TReference) -> int:
6872
assert isinstance(reference, HasDetections)
@@ -106,14 +110,17 @@ def build(
106110
if wait_count_fn is None:
107111
wait_count_fn = self._default_wait_count_fn
108112
self.set_wait_count_fn(wait_count_fn)
113+
self._logger.debug(f"GatherData built with camera_fps={camera_fps}")
109114
return self
110115

111116
def set_camera_fps(self, fps: int) -> None:
112117
if fps <= 0:
113118
raise ValueError(f"Camera FPS must be positive, got {fps}")
114119
self._camera_fps = fps
120+
self._logger.debug(f"Camera FPS set to {fps}")
115121

116122
def run(self) -> None:
123+
self._logger.debug("GatherData run started")
117124
if not self._camera_fps:
118125
raise ValueError("Camera FPS not set. Call build() before run().")
119126

@@ -124,9 +131,11 @@ def run(self) -> None:
124131
except dai.MessageQueue.QueueException:
125132
break
126133
if input_data:
134+
self._logger.debug("Input data received")
127135
self._add_data(input_data)
128136
self._send_ready_data()
129137
if input_reference:
138+
self._logger.debug("Input reference received")
130139
self._add_reference(input_reference)
131140
self._send_ready_data()
132141

@@ -137,6 +146,7 @@ def _send_ready_data(self) -> None:
137146
if ready_data:
138147
self._clear_old_data(ready_data)
139148
self.out.send(ready_data)
149+
self._logger.debug("Gathered data sent")
140150

141151
def _add_data(self, data: TGathered) -> None:
142152
data_ts = self._get_total_seconds_ts(data)

depthai_nodes/node/img_detections_bridge.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def __init__(self) -> None:
2626
self._log = True
2727
self._ignore_angle = False
2828
self._label_encoding = {}
29+
self._logger.debug("ImgDetectionsBridge initialized")
2930

3031
def setIgnoreAngle(self, ignore_angle: bool) -> bool:
3132
"""Sets whether to ignore the angle of the detections during transformation.
@@ -36,6 +37,7 @@ def setIgnoreAngle(self, ignore_angle: bool) -> bool:
3637
if not isinstance(ignore_angle, bool):
3738
raise ValueError("ignore_angle must be a boolean.")
3839
self._ignore_angle = ignore_angle
40+
self._logger.debug(f"Ignore angle set to {self._ignore_angle}")
3941

4042
def setLabelEncoding(self, label_encoding: Dict[int, str]) -> None:
4143
"""Sets the label encoding.
@@ -47,6 +49,7 @@ def setLabelEncoding(self, label_encoding: Dict[int, str]) -> None:
4749
if not isinstance(label_encoding, Dict):
4850
raise ValueError("label_encoding must be a dictionary.")
4951
self._label_encoding = label_encoding
52+
self._logger.debug(f"Label encoding set to {self._label_encoding}")
5053

5154
def build(
5255
self,
@@ -70,6 +73,9 @@ def build(
7073
self.setIgnoreAngle(ignore_angle)
7174
if label_encoding is not None:
7275
self.setLabelEncoding(label_encoding)
76+
self._logger.debug(
77+
f"ImgDetectionsBridge built with ignore_angle={ignore_angle}, label_encoding={label_encoding}"
78+
)
7379
return self
7480

7581
def process(self, msg: dai.Buffer) -> None:
@@ -78,7 +84,7 @@ def process(self, msg: dai.Buffer) -> None:
7884
@param msg: The input message for the ImgDetections object.
7985
@type msg: dai.ImgDetections or ImgDetectionsExtended
8086
"""
81-
87+
self._logger.debug("Processing new input")
8288
if isinstance(msg, dai.ImgDetections):
8389
msg_transformed = self._img_det_to_img_det_ext(msg)
8490
elif isinstance(msg, ImgDetectionsExtended):
@@ -96,8 +102,13 @@ def process(self, msg: dai.Buffer) -> None:
96102
msg_transformed.setTimestamp(msg.getTimestamp())
97103
msg_transformed.setSequenceNum(msg.getSequenceNum())
98104
msg_transformed.setTransformation(msg.getTransformation())
105+
106+
self._logger.debug("Detection message created")
107+
99108
self.out.send(msg_transformed)
100109

110+
self._logger.debug("Message sent successfully")
111+
101112
def _img_det_to_img_det_ext(
102113
self, img_dets: dai.ImgDetections
103114
) -> ImgDetectionsExtended:

depthai_nodes/node/img_detections_filter.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def __init__(self):
3636
self._confidence_threshold = None
3737
self._max_detections = None
3838
self._sort_by_confidence = False
39+
self._logger.debug("ImgDetectionsFilter initialized")
3940

4041
def setLabels(self, labels: List[int], keep: bool) -> None:
4142
"""Sets the labels to keep or reject.
@@ -57,6 +58,10 @@ def setLabels(self, labels: List[int], keep: bool) -> None:
5758
self._labels_to_keep = None
5859
self._labels_to_reject = labels
5960

61+
self._logger.debug(
62+
f"Labels set to {self._labels_to_keep if keep else self._labels_to_reject}"
63+
)
64+
6065
def setConfidenceThreshold(self, confidence_threshold: float) -> None:
6166
"""Sets the confidence threshold.
6267
@@ -69,6 +74,7 @@ def setConfidenceThreshold(self, confidence_threshold: float) -> None:
6974
):
7075
raise ValueError("confidence_threshold must be a float.")
7176
self._confidence_threshold = confidence_threshold
77+
self._logger.debug(f"Confidence threshold set to {self._confidence_threshold}")
7278

7379
def setMaxDetections(self, max_detections: int) -> None:
7480
"""Sets the maximum number of detections.
@@ -79,6 +85,7 @@ def setMaxDetections(self, max_detections: int) -> None:
7985
if not isinstance(max_detections, int) and max_detections is not None:
8086
raise ValueError("max_detections must be an integer.")
8187
self._max_detections = max_detections
88+
self._logger.debug(f"Max detections set to {self._max_detections}")
8289

8390
def setSortByConfidence(self, sort_by_confidence: bool) -> None:
8491
"""Sets whether to sort the detections by confidence before subsetting.
@@ -89,6 +96,7 @@ def setSortByConfidence(self, sort_by_confidence: bool) -> None:
8996
if not isinstance(sort_by_confidence, bool):
9097
raise ValueError("sort_by_confidence must be a boolean.")
9198
self._sort_by_confidence = sort_by_confidence
99+
self._logger.debug(f"Sort by confidence set to {self._sort_by_confidence}")
92100

93101
def build(
94102
self,
@@ -120,9 +128,14 @@ def build(
120128

121129
self.setSortByConfidence(sort_by_confidence)
122130

131+
self._logger.debug(
132+
f"ImgDetectionsFilter built with labels_to_keep={labels_to_keep}, labels_to_reject={labels_to_reject}, confidence_threshold={confidence_threshold}, max_detections={max_detections}, sort_by_confidence={sort_by_confidence}"
133+
)
134+
123135
return self
124136

125137
def process(self, msg: dai.Buffer) -> None:
138+
self._logger.debug("Processing new input")
126139
assert isinstance(
127140
msg,
128141
(
@@ -159,4 +172,8 @@ def process(self, msg: dai.Buffer) -> None:
159172

160173
msg_new.detections = filtered_detections[: self._max_detections]
161174

175+
self._logger.debug("Detections message created")
176+
162177
self.out.send(msg_new)
178+
179+
self._logger.debug("Message sent successfully")

depthai_nodes/node/img_frame_overlay.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ImgFrameOverlay(BaseHostNode):
2424
def __init__(self, alpha: float = 0.5) -> None:
2525
super().__init__()
2626
self.setAlpha(alpha)
27+
self._logger.debug(f"ImgFrameOverlay initialized with alpha={alpha}")
2728

2829
def setAlpha(self, alpha: float) -> None:
2930
"""Sets the alpha.
@@ -36,6 +37,7 @@ def setAlpha(self, alpha: float) -> None:
3637
if not 0.0 <= alpha <= 1.0:
3738
raise ValueError("Alpha must be between 0.0 and 1.0")
3839
self._alpha = alpha
40+
self._logger.debug(f"Alpha set to {self._alpha}")
3941

4042
def build(
4143
self, frame1: dai.Node.Output, frame2: dai.Node.Output, alpha: float = None
@@ -56,6 +58,8 @@ def build(
5658
if alpha is not None:
5759
self.setAlpha(alpha)
5860

61+
self._logger.debug(f"ImgFrameOverlay built with alpha={alpha}")
62+
5963
return self
6064

6165
def process(self, frame1: dai.Buffer, frame2: dai.Buffer) -> None:
@@ -66,6 +70,7 @@ def process(self, frame1: dai.Buffer, frame2: dai.Buffer) -> None:
6670
@param frame2: The input message for the foreground frame.
6771
@type frame2: dai.ImgFrame
6872
"""
73+
self._logger.debug("Processing new input")
6974
assert isinstance(frame1, dai.ImgFrame)
7075
assert isinstance(frame2, dai.ImgFrame)
7176

@@ -95,4 +100,8 @@ def process(self, frame1: dai.Buffer, frame2: dai.Buffer) -> None:
95100
overlay.setTimestamp(frame1.getTimestamp())
96101
overlay.setSequenceNum(frame1.getSequenceNum())
97102

103+
self._logger.debug("ImgFrame message created")
104+
98105
self.out.send(overlay)
106+
107+
self._logger.debug("Message sent successfully")

depthai_nodes/node/parsers/base_parser.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import depthai as dai
55

6+
from depthai_nodes.logging import get_logger
7+
68

79
class BaseMeta(ABCMeta, type(dai.node.ThreadedHostNode)):
810
pass
@@ -28,6 +30,7 @@ def __init__(self) -> None:
2830
super().__init__()
2931
self._input = self.createInput()
3032
self._out = self.createOutput()
33+
self._logger = get_logger(self.__class__.__name__)
3134

3235
@property
3336
@abstractmethod

0 commit comments

Comments
 (0)