code-loader 0.2.54.dev3__tar.gz → 0.2.56__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/PKG-INFO +1 -1
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/datasetclasses.py +4 -3
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/responsedataclasses.py +4 -8
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/loss.py +14 -8
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/utils.py +8 -5
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/leap_binder/leapbinder.py +2 -6
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/leaploader.py +8 -5
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/metrics/default_metrics.py +0 -1
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/pyproject.toml +1 -1
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/setup.py +1 -1
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/LICENSE +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/README.md +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/enums.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/exceptions.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/visualizer_classes.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/utils.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/decoder.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/grid.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/leap_binder/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/metrics/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/utils.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/visualizers/__init__.py +0 -0
- {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/visualizers/default_visualizers.py +0 -0
@@ -6,7 +6,7 @@ import numpy.typing as npt
|
|
6
6
|
import tensorflow as tf # type: ignore
|
7
7
|
|
8
8
|
from code_loader.contract.enums import DataStateType, DatasetMetadataType, \
|
9
|
-
DataStateEnum, LeapDataType, ConfusionMatrixValue
|
9
|
+
DataStateEnum, LeapDataType, MetricEnum, ConfusionMatrixValue
|
10
10
|
from code_loader.contract.visualizer_classes import LeapImage, LeapText, LeapGraph, LeapHorizontalBar, \
|
11
11
|
LeapTextMask, LeapImageMask, LeapImageWithBBox
|
12
12
|
|
@@ -52,7 +52,7 @@ VisualizerCallableInterface = Union[
|
|
52
52
|
VisualizerCallableReturnType = Union[LeapImage, LeapText, LeapGraph, LeapHorizontalBar,
|
53
53
|
LeapImageMask, LeapTextMask, LeapImageWithBBox]
|
54
54
|
|
55
|
-
CustomCallableInterface = Callable[
|
55
|
+
CustomCallableInterface = Callable[[tf.Tensor, tf.Tensor], tf.Tensor]
|
56
56
|
|
57
57
|
|
58
58
|
@dataclass
|
@@ -74,7 +74,6 @@ MetricCallableReturnType = Union[tf.Tensor, List[List[ConfusionMatrixElement]]]
|
|
74
74
|
class CustomLossHandler:
|
75
75
|
name: str
|
76
76
|
function: CustomCallableInterface
|
77
|
-
arg_names: List[str]
|
78
77
|
|
79
78
|
|
80
79
|
@dataclass
|
@@ -120,6 +119,8 @@ class MetadataHandler:
|
|
120
119
|
class PredictionTypeHandler:
|
121
120
|
name: str
|
122
121
|
labels: List[str]
|
122
|
+
metrics: Optional[List[MetricEnum]] = None
|
123
|
+
custom_metrics: Optional[List[Union[CustomCallableInterface, ConfusionMatrixCallableInterface]]] = None
|
123
124
|
|
124
125
|
|
125
126
|
@dataclass
|
@@ -1,7 +1,7 @@
|
|
1
1
|
from typing import List, Optional, Dict
|
2
2
|
|
3
3
|
from dataclasses import dataclass, field
|
4
|
-
from code_loader.contract.enums import DatasetMetadataType, LeapDataType
|
4
|
+
from code_loader.contract.enums import DatasetMetadataType, LeapDataType, MetricEnum
|
5
5
|
|
6
6
|
|
7
7
|
@dataclass
|
@@ -45,12 +45,6 @@ class MetricInstance:
|
|
45
45
|
arg_names: List[str]
|
46
46
|
|
47
47
|
|
48
|
-
@dataclass
|
49
|
-
class CustomLossInstance:
|
50
|
-
name: str
|
51
|
-
arg_names: List[str]
|
52
|
-
|
53
|
-
|
54
48
|
@dataclass
|
55
49
|
class CustomLayerInstance:
|
56
50
|
name: str
|
@@ -62,6 +56,8 @@ class CustomLayerInstance:
|
|
62
56
|
class PredictionTypeInstance:
|
63
57
|
name: str
|
64
58
|
labels: List[str]
|
59
|
+
metrics: Optional[List[MetricEnum]] = None
|
60
|
+
custom_metrics: Optional[List[str]] = None
|
65
61
|
|
66
62
|
|
67
63
|
@dataclass
|
@@ -72,7 +68,7 @@ class DatasetSetup:
|
|
72
68
|
outputs: List[DatasetOutputInstance]
|
73
69
|
visualizers: List[VisualizerInstance]
|
74
70
|
prediction_types: List[PredictionTypeInstance]
|
75
|
-
|
71
|
+
custom_loss_names: List[str]
|
76
72
|
metrics: List[MetricInstance] = field(default_factory=list)
|
77
73
|
|
78
74
|
|
@@ -20,19 +20,21 @@ class YoloLoss:
|
|
20
20
|
def __init__(self, num_classes: int, default_boxes: List[NDArray[np.int32]],
|
21
21
|
overlap_thresh: float, background_label: int,
|
22
22
|
from_logits: bool = True, weights: List[float] = [4.0, 1.0, 0.4],
|
23
|
-
max_match_per_gt: int = 10
|
23
|
+
max_match_per_gt: int = 10, image_size: int = 640,
|
24
|
+
cls_w: float = 0.3, obj_w: float = 0.7, box_w: float = 0.05):
|
24
25
|
self.background_label = background_label
|
25
26
|
self.default_boxes = [tf.convert_to_tensor(box_arr) for box_arr in default_boxes]
|
26
27
|
self.num_classes = num_classes
|
27
28
|
self.threshold = overlap_thresh
|
28
29
|
self.variance = (1, 1)
|
29
|
-
self.ce = tf.keras.losses.CategoricalCrossentropy(from_logits=False, reduction='none')
|
30
30
|
self.from_logits = from_logits
|
31
|
-
# self.bce = tf.keras.losses.BinaryCrossentropy()
|
32
31
|
self.weights = weights # Following yolov7 weights
|
33
|
-
|
34
|
-
self.
|
35
|
-
|
32
|
+
scale_factor = 3. / len(weights)
|
33
|
+
class_factor = self.num_classes / 80
|
34
|
+
image_factor = image_size / 640.
|
35
|
+
self.obj_w = obj_w * scale_factor
|
36
|
+
self.cls_w = cls_w * class_factor * scale_factor
|
37
|
+
self.box_w = box_w * image_factor ** 2 * scale_factor
|
36
38
|
self.max_match_per_gt = max_match_per_gt
|
37
39
|
|
38
40
|
def __call__(self, y_true: tf.Tensor, y_pred: Tuple[List[tf.Tensor], List[tf.Tensor]]) -> \
|
@@ -105,8 +107,12 @@ class YoloLoss:
|
|
105
107
|
else:
|
106
108
|
sig_pos_conf = conf_data_layer[j]
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
+
one_hot_preds = tf.one_hot(tf.boolean_mask(conf_t_tensor[j], pos[j]), self.num_classes)
|
111
|
+
matched_prediction = tf.boolean_mask(sig_pos_conf, pos[j, ...], axis=0)
|
112
|
+
matched_prediction = tf.clip_by_value(matched_prediction, 1e-7, 1 - 1e-7)
|
113
|
+
single_loss_cls = tf.reduce_mean(-(
|
114
|
+
one_hot_preds * tf.math.log(matched_prediction) + (1 - one_hot_preds) * tf.math.log(
|
115
|
+
1 - matched_prediction))) * self.cls_w
|
110
116
|
else:
|
111
117
|
single_loss_cls = tf.constant(0, dtype=tf.float32)
|
112
118
|
else: # No GT
|
@@ -1,5 +1,4 @@
|
|
1
|
-
from typing import Tuple, List
|
2
|
-
|
1
|
+
from typing import Tuple, List, Union
|
3
2
|
import numpy as np
|
4
3
|
import tensorflow as tf # type: ignore
|
5
4
|
from numpy.typing import NDArray
|
@@ -52,15 +51,19 @@ def encode_bboxes(matched: tf.Tensor, priors: tf.Tensor, variances: Tuple[int, i
|
|
52
51
|
return tf.concat([g_cxcy, g_wh], 1)
|
53
52
|
|
54
53
|
|
55
|
-
def scale_loc_prediction(loc_pred: List[tf.Tensor], decoded: bool = False, image_size: float = 640.,
|
54
|
+
def scale_loc_prediction(loc_pred: List[tf.Tensor], decoded: bool = False, image_size: Union[float, Tuple[float, float]] = 640.,
|
56
55
|
strides: Tuple[int, int, int] = (8, 16, 32)) -> \
|
57
56
|
List[tf.Tensor]:
|
58
57
|
new_loc_pred = [None] * len(loc_pred)
|
58
|
+
if isinstance(image_size, int) or isinstance(image_size, float):
|
59
|
+
scale_arr: NDArray[np.float32] = np.array([image_size, image_size, image_size, image_size], dtype=np.float32)
|
60
|
+
else:
|
61
|
+
scale_arr = np.array([*image_size[::-1], *image_size[::-1]], dtype=np.float32)
|
59
62
|
if decoded:
|
60
|
-
new_loc_pred = [loc /
|
63
|
+
new_loc_pred = [loc / scale_arr for loc in loc_pred]
|
61
64
|
else:
|
62
65
|
for i in range(len(loc_pred)):
|
63
|
-
new_loc_pred[i] = tf.concat([(strides[i] * (2 * tf.sigmoid(loc_pred[i][..., :2]) - 0.5)) /
|
66
|
+
new_loc_pred[i] = tf.concat([(strides[i] * (2 * tf.sigmoid(loc_pred[i][..., :2]) - 0.5)) / scale_arr[:2],
|
64
67
|
2 * tf.sigmoid(loc_pred[i][..., 2:])], axis=-1)
|
65
68
|
return new_loc_pred
|
66
69
|
|
@@ -81,8 +81,7 @@ class LeapBinder:
|
|
81
81
|
|
82
82
|
@typechecked
|
83
83
|
def add_custom_loss(self, function: CustomCallableInterface, name: str) -> None:
|
84
|
-
|
85
|
-
self.setup_container.custom_loss_handlers.append(CustomLossHandler(name, function, arg_names))
|
84
|
+
self.setup_container.custom_loss_handlers.append(CustomLossHandler(name, function))
|
86
85
|
|
87
86
|
@typechecked
|
88
87
|
def add_custom_metric(self,
|
@@ -95,10 +94,7 @@ class LeapBinder:
|
|
95
94
|
def add_prediction(self, name: str, labels: List[str], metrics: Optional[List[MetricEnum]] = None,
|
96
95
|
custom_metrics: Optional[
|
97
96
|
List[Union[CustomCallableInterface, ConfusionMatrixCallableInterface]]] = None) -> None:
|
98
|
-
|
99
|
-
raise DeprecationWarning("Adding metrics on 'leap_binder.add_prediction' method is deprecated."
|
100
|
-
"Please update the leap script and use metric block instead.")
|
101
|
-
self.setup_container.prediction_types.append(PredictionTypeHandler(name, labels))
|
97
|
+
self.setup_container.prediction_types.append(PredictionTypeHandler(name, labels, metrics, custom_metrics))
|
102
98
|
|
103
99
|
@typechecked
|
104
100
|
def set_ground_truth(self, function: SectionCallableInterface, name: str) -> None:
|
@@ -12,7 +12,7 @@ from code_loader.contract.enums import DataStateEnum, TestingSectionEnum, DataSt
|
|
12
12
|
from code_loader.contract.exceptions import DatasetScriptException
|
13
13
|
from code_loader.contract.responsedataclasses import DatasetIntegParseResult, DatasetTestResultPayload, \
|
14
14
|
DatasetPreprocess, DatasetSetup, DatasetInputInstance, DatasetOutputInstance, DatasetMetadataInstance, \
|
15
|
-
VisualizerInstance, PredictionTypeInstance, ModelSetup, CustomLayerInstance, MetricInstance
|
15
|
+
VisualizerInstance, PredictionTypeInstance, ModelSetup, CustomLayerInstance, MetricInstance
|
16
16
|
from code_loader.leap_binder import global_leap_binder
|
17
17
|
from code_loader.utils import get_root_exception_line_number, get_shape
|
18
18
|
|
@@ -215,12 +215,15 @@ class LeapLoader:
|
|
215
215
|
VisualizerInstance(visualizer_handler.name, visualizer_handler.type, visualizer_handler.arg_names)
|
216
216
|
for visualizer_handler in setup.visualizers]
|
217
217
|
|
218
|
-
|
219
|
-
for custom_loss in setup.custom_loss_handlers]
|
218
|
+
custom_loss_names = [custom_loss.name for custom_loss in setup.custom_loss_handlers]
|
220
219
|
|
221
220
|
prediction_types = []
|
222
221
|
for prediction_type in setup.prediction_types:
|
223
|
-
|
222
|
+
custom_metrics_names = None
|
223
|
+
if prediction_type.custom_metrics:
|
224
|
+
custom_metrics_names = [custom_metric.__name__ for custom_metric in prediction_type.custom_metrics]
|
225
|
+
pred_type_inst = PredictionTypeInstance(prediction_type.name, prediction_type.labels,
|
226
|
+
prediction_type.metrics, custom_metrics_names)
|
224
227
|
prediction_types.append(pred_type_inst)
|
225
228
|
|
226
229
|
metrics = []
|
@@ -230,7 +233,7 @@ class LeapLoader:
|
|
230
233
|
|
231
234
|
return DatasetSetup(preprocess=dataset_preprocess, inputs=inputs, outputs=ground_truths, metadata=metadata,
|
232
235
|
visualizers=visualizers, prediction_types=prediction_types,
|
233
|
-
|
236
|
+
custom_loss_names=custom_loss_names, metrics=metrics)
|
234
237
|
|
235
238
|
@staticmethod
|
236
239
|
def get_model_setup_response() -> ModelSetup:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/__init__.py
RENAMED
File without changes
|
{code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/decoder.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/visualizers/default_visualizers.py
RENAMED
File without changes
|