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.
Files changed (28) hide show
  1. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/PKG-INFO +1 -1
  2. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/datasetclasses.py +4 -3
  3. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/responsedataclasses.py +4 -8
  4. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/loss.py +14 -8
  5. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/utils.py +8 -5
  6. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/leap_binder/leapbinder.py +2 -6
  7. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/leaploader.py +8 -5
  8. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/metrics/default_metrics.py +0 -1
  9. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/pyproject.toml +1 -1
  10. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/setup.py +1 -1
  11. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/LICENSE +0 -0
  12. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/README.md +0 -0
  13. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/__init__.py +0 -0
  14. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/__init__.py +0 -0
  15. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/enums.py +0 -0
  16. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/exceptions.py +0 -0
  17. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/contract/visualizer_classes.py +0 -0
  18. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/__init__.py +0 -0
  19. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/__init__.py +0 -0
  20. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/utils.py +0 -0
  21. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/__init__.py +0 -0
  22. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/decoder.py +0 -0
  23. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/helpers/detection/yolo/grid.py +0 -0
  24. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/leap_binder/__init__.py +0 -0
  25. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/metrics/__init__.py +0 -0
  26. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/utils.py +0 -0
  27. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/visualizers/__init__.py +0 -0
  28. {code_loader-0.2.54.dev3 → code_loader-0.2.56}/code_loader/visualizers/default_visualizers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: code-loader
3
- Version: 0.2.54.dev3
3
+ Version: 0.2.56
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -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[..., tf.Tensor]
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
- custom_losses: List[CustomLossInstance]
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
- self.obj_w = 0.7
34
- self.cls_w = 0.00375
35
- self.box_w = 0.05
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
- onehot_labels = tf.one_hot(conf_t_tensor[j], self.num_classes)
109
- single_loss_cls = tf.reduce_mean(self.ce(onehot_labels, sig_pos_conf), axis=-1) * self.cls_w
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 / image_size for loc in loc_pred]
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)) / image_size,
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
- arg_names = inspect.getfullargspec(function)[0]
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
- if metrics or custom_metrics:
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, CustomLossInstance
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
- custom_losses = [CustomLossInstance(custom_loss.name, custom_loss.arg_names)
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
- pred_type_inst = PredictionTypeInstance(prediction_type.name, prediction_type.labels)
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
- custom_losses=custom_losses, metrics=metrics)
236
+ custom_loss_names=custom_loss_names, metrics=metrics)
234
237
 
235
238
  @staticmethod
236
239
  def get_model_setup_response() -> ModelSetup:
@@ -149,4 +149,3 @@ metrics_names_to_functions = {
149
149
  Metric.ConfusionMatrixClassification.name: confusion_matrix_classification_metric,
150
150
  Metric.MeanIOU.name: batch_mean_iou
151
151
  }
152
-
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "0.2.54.dev3"
3
+ version = "0.2.56"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"
@@ -23,7 +23,7 @@ extras_require = \
23
23
 
24
24
  setup_kwargs = {
25
25
  'name': 'code-loader',
26
- 'version': '0.2.54.dev3',
26
+ 'version': '0.2.56',
27
27
  'description': '',
28
28
  'long_description': '# tensorleap code loader\nUsed to load user code to tensorleap \n',
29
29
  'author': 'dorhar',
File without changes