tf-models-nightly 2.18.0.dev20240820__py2.py3-none-any.whl → 2.18.0.dev20240822__py2.py3-none-any.whl

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.
@@ -0,0 +1,278 @@
1
+ # Copyright 2024 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Panoptic Multi-scale MaskConver task definition."""
16
+ from typing import Any, Dict, List, Mapping, Optional, Tuple
17
+ import tensorflow as tf, tf_keras
18
+
19
+ from official.common import dataset_fn
20
+ from official.core import task_factory
21
+ from official.projects.maskconver.configs import multiscale_maskconver as exp_cfg
22
+ from official.projects.maskconver.dataloaders import multiscale_maskconver_input
23
+ from official.projects.maskconver.losses import maskconver_losses
24
+ from official.projects.maskconver.modeling import factory
25
+ from official.projects.maskconver.modeling.layers import copypaste
26
+ from official.projects.maskconver.tasks import maskconver
27
+ from official.projects.volumetric_models.losses import segmentation_losses as volumeteric_segmentation_losses
28
+ from official.vision.dataloaders import input_reader_factory
29
+
30
+
31
+ @task_factory.register_task_cls(exp_cfg.MultiScaleMaskConverTask)
32
+ class PanopticMultiScaleMaskConverTask(maskconver.PanopticMaskRCNNTask):
33
+
34
+ """A single-replica view of training procedure.
35
+
36
+ Panoptic Mask R-CNN task provides artifacts for training/evalution procedures,
37
+ including loading/iterating over Datasets, initializing the model, calculating
38
+ the loss, post-processing, and customized metrics with reduction.
39
+ """
40
+
41
+ def build_model(self) -> tf_keras.Model:
42
+ """Build Panoptic Mask R-CNN model."""
43
+
44
+ tf_keras.utils.set_random_seed(0)
45
+ tf.config.experimental.enable_op_determinism()
46
+ input_specs = tf_keras.layers.InputSpec(
47
+ shape=[None] + self.task_config.model.input_size)
48
+
49
+ l2_weight_decay = self.task_config.losses.l2_weight_decay
50
+ # Divide weight decay by 2.0 to match the implementation of tf.nn.l2_loss.
51
+ # (https://www.tensorflow.org/api_docs/python/tf/keras/regularizers/l2)
52
+ # (https://www.tensorflow.org/api_docs/python/tf/nn/l2_loss)
53
+ l2_regularizer = (tf_keras.regularizers.l2(
54
+ l2_weight_decay / 2.0) if l2_weight_decay else None)
55
+
56
+ model = factory.build_multiscale_maskconver_model(
57
+ input_specs=input_specs,
58
+ model_config=self.task_config.model,
59
+ l2_regularizer=l2_regularizer)
60
+
61
+ # Get images and labels with batch size of 1.
62
+ images, labels = next(
63
+ iter(self.build_inputs(self.task_config.validation_data)))
64
+ images = tf.nest.map_structure(lambda x: x[0:1, ...], images)
65
+ labels = tf.nest.map_structure(lambda x: x[0:1, ...], labels)
66
+ _ = model(
67
+ images,
68
+ image_info=labels['image_info'],
69
+ training=False)
70
+ return model
71
+
72
+ def build_inputs(
73
+ self,
74
+ params: exp_cfg.DataConfig,
75
+ input_context: Optional[tf.distribute.InputContext] = None
76
+ ) -> tf.data.Dataset:
77
+ """Build input dataset."""
78
+ decoder_cfg = params.decoder.get()
79
+
80
+ if params.decoder.type == 'simple_decoder':
81
+ decoder = multiscale_maskconver_input.TfExampleDecoder(
82
+ regenerate_source_id=decoder_cfg.regenerate_source_id,
83
+ mask_binarize_threshold=decoder_cfg.mask_binarize_threshold,
84
+ include_panoptic_masks=decoder_cfg.include_panoptic_masks,
85
+ panoptic_category_mask_key=decoder_cfg.panoptic_category_mask_key,
86
+ panoptic_instance_mask_key=decoder_cfg.panoptic_instance_mask_key)
87
+ else:
88
+ raise ValueError('Unknown decoder type: {}!'.format(params.decoder.type))
89
+
90
+ if params.parser.copypaste:
91
+ sample_fn = copypaste.CopyPaste(
92
+ self.task_config.model.input_size[:2],
93
+ copypaste_frequency=params.parser.copypaste.copypaste_frequency,
94
+ copypaste_aug_scale_max=params.parser.copypaste.copypaste_aug_scale_max,
95
+ copypaste_aug_scale_min=params.parser.copypaste.copypaste_aug_scale_min,
96
+ aug_scale_min=params.parser.copypaste.aug_scale_min,
97
+ aug_scale_max=params.parser.copypaste.aug_scale_max,
98
+ random_flip=params.parser.aug_rand_hflip,
99
+ num_thing_classes=self.task_config.model.num_thing_classes)
100
+ else:
101
+ sample_fn = None
102
+
103
+ parser = multiscale_maskconver_input.Parser(
104
+ output_size=self.task_config.model.input_size[:2],
105
+ min_level=self.task_config.model.min_level,
106
+ max_level=self.task_config.model.max_level,
107
+ fpn_low_range=params.parser.fpn_low_range,
108
+ fpn_high_range=params.parser.fpn_high_range,
109
+ dtype=params.dtype,
110
+ aug_rand_hflip=params.parser.aug_rand_hflip,
111
+ aug_scale_min=params.parser.aug_scale_min,
112
+ aug_scale_max=params.parser.aug_scale_max,
113
+ max_num_instances=params.parser.max_num_instances,
114
+ segmentation_resize_eval_groundtruth=params.parser
115
+ .segmentation_resize_eval_groundtruth,
116
+ segmentation_groundtruth_padded_size=params.parser
117
+ .segmentation_groundtruth_padded_size,
118
+ segmentation_ignore_label=params.parser.segmentation_ignore_label,
119
+ panoptic_ignore_label=params.parser.panoptic_ignore_label,
120
+ num_panoptic_categories=self.task_config.model.num_classes,
121
+ num_thing_categories=self.task_config.model.num_thing_classes,
122
+ mask_target_level=params.parser.mask_target_level,
123
+ level=self.task_config.model.level,
124
+ gaussian_iou=params.parser.gaussaian_iou,
125
+ aug_type=params.parser.aug_type,)
126
+
127
+ reader = input_reader_factory.input_reader_generator(
128
+ params,
129
+ dataset_fn=dataset_fn.pick_dataset_fn(params.file_type),
130
+ sample_fn=sample_fn.copypaste_fn(
131
+ params.is_training) if sample_fn else None,
132
+ decoder_fn=decoder.decode,
133
+ parser_fn=parser.parse_fn(params.is_training))
134
+ dataset = reader.read(input_context=input_context)
135
+
136
+ return dataset
137
+
138
+ def build_losses(self,
139
+ outputs: Mapping[str, Any],
140
+ labels: Mapping[str, Any],
141
+ iteration: Any,
142
+ aux_losses: Optional[Any] = None,
143
+ step=None) -> Dict[str, tf.Tensor]:
144
+ """Build Panoptic Mask R-CNN losses."""
145
+ # pylint: disable=line-too-long
146
+ loss_params = self._task_config.losses
147
+ center_loss_fn = maskconver_losses.PenaltyReducedLogisticFocalLoss(
148
+ alpha=loss_params.alpha, beta=loss_params.beta)
149
+
150
+ true_flattened_ct_heatmap = labels['panoptic_heatmaps']
151
+ true_flattened_ct_heatmap = tf.cast(true_flattened_ct_heatmap, tf.float32)
152
+
153
+ pred_flattened_ct_heatmap = outputs['class_heatmaps']
154
+ pred_flattened_ct_heatmap = tf.cast(pred_flattened_ct_heatmap, tf.float32)
155
+
156
+ center_loss = center_loss_fn(
157
+ target_tensor=true_flattened_ct_heatmap,
158
+ prediction_tensor=pred_flattened_ct_heatmap,
159
+ weights=1.0)
160
+
161
+ replica_context = tf.distribute.get_replica_context()
162
+ global_num_instances = replica_context.all_reduce(
163
+ tf.distribute.ReduceOp.SUM, labels['num_instances'])
164
+ num_replicas = tf.distribute.get_strategy().num_replicas_in_sync
165
+ num_instances = tf.cast(global_num_instances, tf.float32) / tf.cast(num_replicas, tf.float32) + 1.0
166
+
167
+ center_loss = tf.reduce_sum(center_loss) / num_instances
168
+
169
+ gt_masks = labels['panoptic_masks']
170
+ gt_mask_weights = labels['panoptic_mask_weights'][:, None, None, :] * tf.ones_like(gt_masks)
171
+ panoptic_padding_mask = labels['panoptic_padding_mask'][:, :, :, None] * tf.ones_like(gt_masks)
172
+
173
+ # gt_masks
174
+ _, h, w, q = gt_masks.get_shape().as_list()
175
+ predicted_masks = tf.cast(outputs['mask_proposal_logits'], tf.float32)
176
+ predicted_masks = tf.image.resize(
177
+ predicted_masks, tf.shape(gt_masks)[1:3], method='bilinear')
178
+
179
+ mask_loss_fn = tf_keras.losses.BinaryCrossentropy(
180
+ from_logits=True,
181
+ label_smoothing=0.0,
182
+ axis=-1,
183
+ reduction=tf_keras.losses.Reduction.NONE,
184
+ name='binary_crossentropy')
185
+
186
+ mask_weights = tf.cast(gt_masks >= 0, tf.float32) * gt_mask_weights * (
187
+ 1 - panoptic_padding_mask) # b, h, w, # max inst
188
+ mask_loss = mask_loss_fn(
189
+ tf.expand_dims(gt_masks, -1),
190
+ tf.expand_dims(predicted_masks, -1),
191
+ sample_weight=tf.expand_dims(mask_weights, -1))
192
+
193
+ mask_loss = tf.reshape(mask_loss, [-1, h * w, q])
194
+ mask_loss = tf.reduce_sum(tf.reduce_mean(mask_loss, axis=1)) / num_instances
195
+
196
+ # Dice loss
197
+ masked_predictions = tf.sigmoid(predicted_masks) * tf.cast(
198
+ gt_mask_weights > 0, tf.float32) * (1 - panoptic_padding_mask)
199
+ masked_gt_masks = gt_masks * tf.cast(gt_mask_weights > 0, tf.float32) * (
200
+ 1 - panoptic_padding_mask)
201
+
202
+ masked_predictions = tf.transpose(masked_predictions, [0, 3, 1, 2])
203
+ masked_predictions = tf.reshape(masked_predictions, [-1, h, w, 1])
204
+ masked_gt_masks = tf.transpose(masked_gt_masks, [0, 3, 1, 2])
205
+ masked_gt_masks = tf.reshape(masked_gt_masks, [-1, h, w, 1])
206
+
207
+ dice_loss_fn = volumeteric_segmentation_losses.SegmentationLossDiceScore(
208
+ metric_type='adaptive', axis=(2, 3))
209
+ dice_loss = dice_loss_fn(logits=masked_predictions, labels=masked_gt_masks)
210
+
211
+ total_loss = center_loss + loss_params.mask_weight * (mask_loss + dice_loss)
212
+ if aux_losses:
213
+ total_loss += tf.add_n(aux_losses)
214
+
215
+ total_loss = loss_params.loss_weight * total_loss
216
+
217
+ losses = {'total_loss': total_loss,
218
+ 'mask_loss': mask_loss,
219
+ 'center_loss': center_loss,
220
+ 'dice_loss': dice_loss,}
221
+ return losses
222
+
223
+ def train_step(self,
224
+ inputs: Tuple[Any, Any],
225
+ model: tf_keras.Model,
226
+ optimizer: tf_keras.optimizers.Optimizer,
227
+ metrics: Optional[List[Any]] = None) -> Dict[str, Any]:
228
+ """Does forward and backward.
229
+
230
+ Args:
231
+ inputs: a dictionary of input tensors.
232
+ model: the model, forward pass definition.
233
+ optimizer: the optimizer for this training step.
234
+ metrics: a nested structure of metrics objects.
235
+
236
+ Returns:
237
+ A dictionary of logs.
238
+ """
239
+ images, labels = inputs
240
+ num_replicas = tf.distribute.get_strategy().num_replicas_in_sync
241
+
242
+ with tf.GradientTape() as tape:
243
+ outputs = model(
244
+ images,
245
+ box_indices=labels['panoptic_box_indices'],
246
+ classes=labels['panoptic_classes'],
247
+ training=True)
248
+ outputs = tf.nest.map_structure(
249
+ lambda x: tf.cast(x, tf.float32), outputs)
250
+
251
+ # Computes per-replica loss.
252
+ losses = self.build_losses(
253
+ outputs=outputs,
254
+ labels=labels,
255
+ aux_losses=model.losses,
256
+ iteration=optimizer.iterations,
257
+ step=optimizer.iterations)
258
+ scaled_loss = losses['total_loss'] / num_replicas
259
+
260
+ # For mixed_precision policy, when LossScaleOptimizer is used, loss is
261
+ # scaled for numerical stability.
262
+ if isinstance(optimizer, tf_keras.mixed_precision.LossScaleOptimizer):
263
+ scaled_loss = optimizer.get_scaled_loss(scaled_loss)
264
+
265
+ tvars = model.trainable_variables
266
+ grads = tape.gradient(scaled_loss, tvars)
267
+ # Scales back gradient when LossScaleOptimizer is used.
268
+ if isinstance(optimizer, tf_keras.mixed_precision.LossScaleOptimizer):
269
+ grads = optimizer.get_unscaled_gradients(grads)
270
+ optimizer.apply_gradients(list(zip(grads, tvars)))
271
+
272
+ logs = {self.loss: losses['total_loss']}
273
+
274
+ if metrics:
275
+ for m in metrics:
276
+ m.update_state(losses[m.name])
277
+
278
+ return logs
@@ -0,0 +1,30 @@
1
+ # Copyright 2024 The TensorFlow Authors. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Panoptic MaskRCNN trainer."""
16
+
17
+ from absl import app
18
+
19
+ from official.common import flags as tfm_flags
20
+ from official.projects.maskconver.configs import maskconver as maskconver_cfg # pylint: disable=unused-import
21
+ from official.projects.maskconver.configs import multiscale_maskconver as multiscale_maskconver_cfg # pylint: disable=unused-import
22
+ from official.projects.maskconver.modeling import fpn # pylint: disable=unused-import
23
+ from official.projects.maskconver.tasks import maskconver as maskconver_task # pylint: disable=unused-import
24
+ from official.projects.maskconver.tasks import multiscale_maskconver as multiscale_maskconver_task # pylint: disable=unused-import
25
+ from official.vision import train
26
+
27
+
28
+ if __name__ == '__main__':
29
+ tfm_flags.define_flags()
30
+ app.run(train.main)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tf-models-nightly
3
- Version: 2.18.0.dev20240820
3
+ Version: 2.18.0.dev20240822
4
4
  Summary: TensorFlow Official Models
5
5
  Home-page: https://github.com/tensorflow/models
6
6
  Author: Google Inc.
@@ -163,7 +163,7 @@ official/legacy/transformer/optimizer.py,sha256=VbM_Dnblv4hmtaFugBh1cFK2_mnihxoW
163
163
  official/legacy/transformer/transformer.py,sha256=6ZCu61XxU1LRdMah1NKvEA-pF23gNr3n3d3rBybtv-Q,21761
164
164
  official/legacy/transformer/transformer_forward_test.py,sha256=pnvQ8g9k5FCQeKB523rtAxKfB4VbDtyeBrhy6xvfaeY,6070
165
165
  official/legacy/transformer/transformer_layers_test.py,sha256=0aCeywTKqSOTrZtkVBvy3FJhL4pwppeM4er1w01MAeI,3576
166
- official/legacy/transformer/transformer_main.py,sha256=fRFOvrbDjSPLmCFLhaPeD-xlDNm-8tqHiidV4Z8HokI,18193
166
+ official/legacy/transformer/transformer_main.py,sha256=rn2E4MiwNL6uGwcl5Njnw-3h86HOq8sQfBp3gXITSRw,18110
167
167
  official/legacy/transformer/transformer_main_test.py,sha256=aZnbdbJCsDazU4tUhAs_xpuXZe0ZrZJgCxQy0ez92SY,6641
168
168
  official/legacy/transformer/transformer_test.py,sha256=2eD65briKm6pcEpveYcFuNh3wSWt3bcYETClbarewqc,3638
169
169
  official/legacy/transformer/translate.py,sha256=OO5B5qlSMu2hGMd2KYn1DyUaPDC4tuQm-2vA-xric8o,6961
@@ -531,6 +531,16 @@ official/projects/deepmac_maskrcnn/serving/detection_test.py,sha256=t5YdUlmPa3Ft
531
531
  official/projects/deepmac_maskrcnn/serving/export_saved_model.py,sha256=oXGf3Sd7umPWuBW3ZbOrTVIz8kSm23ki8N-OpHs__so,3991
532
532
  official/projects/deepmac_maskrcnn/tasks/__init__.py,sha256=7oiypy0N82PDw9aSdcJBLVoGTd_oRSUOdvuJhMv4leQ,609
533
533
  official/projects/deepmac_maskrcnn/tasks/deep_mask_head_rcnn.py,sha256=5GwDu4XVk1NRzGU9IA07Joqib7QLx6wZQ_h8fAfm-rY,9436
534
+ official/projects/maskconver/__init__.py,sha256=7oiypy0N82PDw9aSdcJBLVoGTd_oRSUOdvuJhMv4leQ,609
535
+ official/projects/maskconver/train.py,sha256=XDW0ArwYLcJpT137J3QgBEaoZHb-GE3rGbnKNsSVynI,1397
536
+ official/projects/maskconver/configs/__init__.py,sha256=7oiypy0N82PDw9aSdcJBLVoGTd_oRSUOdvuJhMv4leQ,609
537
+ official/projects/maskconver/configs/backbones.py,sha256=hbx64MddUeOQuviLZK4NsYnDMxaWTAJxLngUUUw8IIQ,1467
538
+ official/projects/maskconver/configs/decoders.py,sha256=F1u9ef1YA0MphPYvzHWpIDTtY834E1zM-eLd3XJd-8c,1163
539
+ official/projects/maskconver/configs/maskconver.py,sha256=mSjY3epff8zVG52YSNPcS1QMaKxgmQWkCfuV26SuD8Y,18925
540
+ official/projects/maskconver/configs/multiscale_maskconver.py,sha256=yDZVLMSVNZyo23sTzfxzthDgHJh_VGGkYxyTEVEqjw8,8106
541
+ official/projects/maskconver/tasks/__init__.py,sha256=7oiypy0N82PDw9aSdcJBLVoGTd_oRSUOdvuJhMv4leQ,609
542
+ official/projects/maskconver/tasks/maskconver.py,sha256=AAoFojpD8r7MQdaDlYBjNs3-ryow1nvmVe1pUnWWwto,25256
543
+ official/projects/maskconver/tasks/multiscale_maskconver.py,sha256=D_77WLT4zBBFdj-uo6yU3JfrxVvept2o87wg2sqbEz8,11730
534
544
  official/projects/maxvit/__init__.py,sha256=7oiypy0N82PDw9aSdcJBLVoGTd_oRSUOdvuJhMv4leQ,609
535
545
  official/projects/maxvit/registry_imports.py,sha256=anP9wyf9iahIxbm7wUXq32GXq5zUWQ1q6gSS7r1jY18,934
536
546
  official/projects/maxvit/train.py,sha256=03CS9XA8ag92YZpgAPED_DgPGMlnIwYNtPTAXFzuqdA,958
@@ -1212,9 +1222,9 @@ tensorflow_models/tensorflow_models_test.py,sha256=nc6A9K53OGqF25xN5St8EiWvdVbda
1212
1222
  tensorflow_models/nlp/__init__.py,sha256=4tA5Pf4qaFwT-fIFOpX7x7FHJpnyJT-5UgOeFYTyMlc,807
1213
1223
  tensorflow_models/uplift/__init__.py,sha256=mqfa55gweOdpKoaQyid4A_4u7xw__FcQeSIF0k_pYmI,999
1214
1224
  tensorflow_models/vision/__init__.py,sha256=zBorY_v5xva1uI-qxhZO3Qh-Dii-Suq6wEYh6hKHDfc,833
1215
- tf_models_nightly-2.18.0.dev20240820.dist-info/AUTHORS,sha256=1dG3fXVu9jlo7bul8xuix5F5vOnczMk7_yWn4y70uw0,337
1216
- tf_models_nightly-2.18.0.dev20240820.dist-info/LICENSE,sha256=WxeBS_DejPZQabxtfMOM_xn8qoZNJDQjrT7z2wG1I4U,11512
1217
- tf_models_nightly-2.18.0.dev20240820.dist-info/METADATA,sha256=4bsxNjZHn4lL4Bh4Fun2713UIwYgOXoccQHUAWlaydg,1432
1218
- tf_models_nightly-2.18.0.dev20240820.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
1219
- tf_models_nightly-2.18.0.dev20240820.dist-info/top_level.txt,sha256=gum2FfO5R4cvjl2-QtP-S1aNmsvIZaFFT6VFzU0f4-g,33
1220
- tf_models_nightly-2.18.0.dev20240820.dist-info/RECORD,,
1225
+ tf_models_nightly-2.18.0.dev20240822.dist-info/AUTHORS,sha256=1dG3fXVu9jlo7bul8xuix5F5vOnczMk7_yWn4y70uw0,337
1226
+ tf_models_nightly-2.18.0.dev20240822.dist-info/LICENSE,sha256=WxeBS_DejPZQabxtfMOM_xn8qoZNJDQjrT7z2wG1I4U,11512
1227
+ tf_models_nightly-2.18.0.dev20240822.dist-info/METADATA,sha256=IcMXUQ2bVpwSiwP4QbM0KZsqgPoLxn5WDJSbwMDa9oU,1432
1228
+ tf_models_nightly-2.18.0.dev20240822.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
1229
+ tf_models_nightly-2.18.0.dev20240822.dist-info/top_level.txt,sha256=gum2FfO5R4cvjl2-QtP-S1aNmsvIZaFFT6VFzU0f4-g,33
1230
+ tf_models_nightly-2.18.0.dev20240822.dist-info/RECORD,,