[tensor] remove padded value of dimensions (0-init)
authorYelin Jeong <yelini.jeong@samsung.com>
Mon, 12 Jun 2023 06:14:24 +0000 (15:14 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Wed, 9 Aug 2023 01:49:48 +0000 (10:49 +0900)
This patch removes padded value of dimensions.
dimension in GstTensorInfo is 0 by default.

Signed-off-by: Yelin Jeong <yelini.jeong@samsung.com>
ext/nnstreamer/tensor_decoder/tensordec-boundingbox.c
ext/nnstreamer/tensor_decoder/tensordec-imagelabel.c
ext/nnstreamer/tensor_decoder/tensordec-tensor_region.c
ext/nnstreamer/tensor_filter/tensor_filter_nnfw.c
ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
gst/nnstreamer/elements/gsttensor_transform.c
gst/nnstreamer/nnstreamer_plugin_api_util_impl.c

index 623826b..4ae47fc 100644 (file)
@@ -1045,8 +1045,10 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
     g_return_val_if_fail (dim1[1] == 1, NULL);
     max_detection = dim1[2];
     g_return_val_if_fail (max_detection > 0, NULL);
+
+    /** @todo unused dimension value should be 0 */
     for (i = 3; i < NNS_TENSOR_RANK_LIMIT; i++)
-      g_return_val_if_fail (dim1[i] == 1, NULL);
+      g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);
 
     /* Check if the second tensor is compatible */
     dim2 = config->info.info[1].dimension;
@@ -1058,7 +1060,7 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
           max_label, data->label_path, data->labeldata.total_labels);
     g_return_val_if_fail (max_detection == dim2[1], NULL);
     for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)
-      g_return_val_if_fail (dim2[i] == 1, NULL);
+      g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);
 
     /* Check consistency with max_detection */
     if (!_set_max_detection (data, max_detection, MOBILENET_SSD_DETECTION_MAX)) {
@@ -1086,7 +1088,7 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
     dim1 = config->info.info[num_idx].dimension;
     g_return_val_if_fail (dim1[0] == 1, NULL);
     for (i = 1; i < NNS_TENSOR_RANK_LIMIT; ++i)
-      g_return_val_if_fail (dim1[i] == 1, NULL);
+      g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);
 
     /* Check if the classes & scores tensors are compatible */
     dim2 = config->info.info[classes_idx].dimension;
@@ -1094,8 +1096,8 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
     g_return_val_if_fail (dim3[0] == dim2[0], NULL);
     max_detection = dim2[0];
     for (i = 1; i < NNS_TENSOR_RANK_LIMIT; ++i) {
-      g_return_val_if_fail (dim2[i] == 1, NULL);
-      g_return_val_if_fail (dim3[i] == 1, NULL);
+      g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);
+      g_return_val_if_fail (dim3[i] == 0 || dim3[i] == 1, NULL);
     }
 
     /* Check if the bbox locations tensor is compatible */
@@ -1103,7 +1105,7 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
     g_return_val_if_fail (BOX_SIZE == dim4[0], NULL);
     g_return_val_if_fail (max_detection == dim4[1], NULL);
     for (i = 2; i < NNS_TENSOR_RANK_LIMIT; ++i)
-      g_return_val_if_fail (dim4[i] == 1, NULL);
+      g_return_val_if_fail (dim4[i] == 0 || dim4[i] == 1, NULL);
 
     /* Check consistency with max_detection */
     if (!_set_max_detection (data, max_detection,
@@ -1126,7 +1128,7 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
         NULL);
     g_return_val_if_fail (dim[1] == OV_PERSON_DETECTION_MAX, NULL);
     for (i = 2; i < NNS_TENSOR_RANK_LIMIT; ++i)
-      g_return_val_if_fail (dim[i] == 1, NULL);
+      g_return_val_if_fail (dim[i] == 0 || dim[i] == 1, NULL);
   } else if (data->mode == YOLOV5_BOUNDING_BOX) {
     const guint *dim = config->info.info[0].dimension;
     if (!_check_tensors (config, 1U))
@@ -1155,14 +1157,14 @@ bb_getOutCaps (void **pdata, const GstTensorsConfig * config)
     g_return_val_if_fail (max_detection > 0, NULL);
     g_return_val_if_fail (dim1[2] == 1, NULL);
     for (i = 3; i < NNS_TENSOR_RANK_LIMIT; i++)
-      g_return_val_if_fail (dim1[i] == 1, NULL);
+      g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);
 
     /* Check if the second tensor is compatible */
     dim2 = config->info.info[1].dimension;
     g_return_val_if_fail (dim2[0] == 1, NULL);
     g_return_val_if_fail (max_detection == dim2[1], NULL);
     for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)
-      g_return_val_if_fail (dim2[i] == 1, NULL);
+      g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);
 
     /* Check consistency with max_detection */
     if (!_set_max_detection (data, max_detection, MP_PALM_DETECTION_DETECTION_MAX)) {
index af76433..ace4eb3 100644 (file)
@@ -121,7 +121,7 @@ il_getOutCaps (void **pdata, const GstTensorsConfig * config)
   /* This allows N:1 only! */
   g_return_val_if_fail (dim[0] > 0 && dim[1] == 1, NULL);
   for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)
-    g_return_val_if_fail (dim[i] == 1, NULL);
+    g_return_val_if_fail (dim[i] == 0, NULL);
 
   caps = gst_caps_from_string (DECODER_IL_TEXT_CAPS_STR);
   setFramerateFromConfig (caps, config);
index b33c263..0d3b9b6 100644 (file)
@@ -714,8 +714,9 @@ tr_getOutCaps (void **pdata, const GstTensorsConfig *config)
   g_return_val_if_fail (dim1[1] == 1, NULL);\r
   max_detection = dim1[2];\r
   g_return_val_if_fail (max_detection > 0, NULL);\r
+  /** @todo unused dimension value should be 0 */\r
   for (i = 3; i < NNS_TENSOR_RANK_LIMIT; i++)\r
-    g_return_val_if_fail (dim1[i] == 1, NULL);\r
+    g_return_val_if_fail (dim1[i] == 0 || dim1[i] == 1, NULL);\r
 \r
   /**Check if the second tensor is compatible */\r
   dim2 = config->info.info[1].dimension;\r
@@ -726,7 +727,7 @@ tr_getOutCaps (void **pdata, const GstTensorsConfig *config)
         max_label, data->label_path, data->labeldata.total_labels);\r
   g_return_val_if_fail (max_detection == dim2[1], NULL);\r
   for (i = 2; i < NNS_TENSOR_RANK_LIMIT; i++)\r
-    g_return_val_if_fail (dim2[i] == 1, NULL);\r
+    g_return_val_if_fail (dim2[i] == 0 || dim2[i] == 1, NULL);\r
 \r
   /**Check consistency with max_detection */\r
   if (!_set_max_detection (data, max_detection, MOBILENET_SSD_DETECTION_MAX)) {\r
index 9349f9c..84bd646 100644 (file)
@@ -404,9 +404,6 @@ nnfw_convert_to_gst_info (const nnfw_tinfo_s * nnfw_info,
 
     for (idx = ninfo->rank - 1; idx >= 0; idx--)
       ginfo->dimension[idx] = ninfo->dims[ninfo->rank - idx - 1];
-
-    for (idx = NNS_TENSOR_RANK_LIMIT - 1; idx >= ninfo->rank; idx--)
-      ginfo->dimension[idx] = 1;
   }
 
   gst_info->num_tensors = nnfw_info->num_tensors;
index ea531b7..78b7df3 100644 (file)
@@ -641,12 +641,6 @@ TFLiteInterpreter::getTensorDim (int tensor_idx, tensor_dim dim)
   /* the order of dimension is reversed at CAPS negotiation */
   std::reverse_copy (tensor_dims->data, tensor_dims->data + len, dim);
 
-  /** @todo remove below lines (dno not fill 1) */
-  /* fill the remnants with 1 */
-  for (int i = len; i < NNS_TENSOR_RANK_LIMIT; ++i) {
-    dim[i] = 1;
-  }
-
   return 0;
 }
 
index 2f17b2e..9a164d0 100644 (file)
@@ -1152,15 +1152,28 @@ gst_tensor_transform_dimchg (GstTensorTransform * filter,
      *
      * @todo CRITICAL-TODO: Optimize the performance!
      */
-    for (i = NNS_TENSOR_RANK_LIMIT - 1; i > to; i--)
+    for (i = NNS_TENSOR_RANK_LIMIT - 1; i > to; i--) {
+      if (toDim[i] == 0)
+        continue;
       loopLimit *= toDim[i];
-    for (i = 0; i < to; i++)
+    }
+
+    for (i = 0; i < to; i++) {
+      if (toDim[i] == 0)
+        break;
       loopBlockSize *= toDim[i];
+    }
 
-    for (i = 0; i < from; i++)
+    for (i = 0; i < from; i++) {
+      if (fromDim[i] == 0)
+        break;
       copyblocksize *= fromDim[i];
-    for (i = 0; i < to; i++)
+    }
+    for (i = 0; i < to; i++) {
+      if (toDim[i] == 0)
+        break;
       copyblocklimit *= toDim[i];
+    }
 
     for (i = 0; i < loopLimit; i++) {
       /* [i1][i2][...][iN][b][...] i = i1 x i2 x ... x iN */
@@ -1470,7 +1483,10 @@ gst_tensor_transform_transpose (GstTensorTransform * filter,
 
   indexI = filter->data_transpose.trans_order[0];
   indexJ = filter->data_transpose.trans_order[1];
-  SL = fromDim[3], SI = fromDim[0], SJ = fromDim[1], SK = fromDim[2];
+  SL = fromDim[3] > 0 ? fromDim[3] : 1;
+  SI = fromDim[0] > 0 ? fromDim[0] : 1;
+  SJ = fromDim[1] > 0 ? fromDim[1] : 1;
+  SK = fromDim[2] > 0 ? fromDim[2] : 1;
 
   switch (indexI) {
     case 0:
index 16bf23d..ad9e63b 100644 (file)
@@ -270,10 +270,7 @@ gst_tensor_info_convert_to_meta (GstTensorInfo * info, GstTensorMetaInfo * meta)
 
   for (i = 0; i < NNS_TENSOR_RANK_LIMIT; i++) {
     /** @todo handle rank from info.dimension */
-    if (info->dimension[i] > 0)
-      meta->dimension[i] = info->dimension[i];
-    else
-      break;
+    meta->dimension[i] = info->dimension[i];
   }
 
   return TRUE;
@@ -287,17 +284,9 @@ gst_tensor_info_convert_to_meta (GstTensorInfo * info, GstTensorMetaInfo * meta)
 guint
 gst_tensor_info_get_rank (const GstTensorInfo * info)
 {
-  gint idx;
-
   g_return_val_if_fail (info != NULL, 0);
 
-  /** rank is at least 1 */
-  for (idx = NNS_TENSOR_RANK_LIMIT - 1; idx > 0; idx--) {
-    if (info->dimension[idx] != 1)
-      break;
-  }
-  /** @todo use gst_tensor_dimension_get_rank (info->dimension) after 0-init dim is done */
-  return idx + 1;
+  return gst_tensor_dimension_get_rank (info->dimension);
 }
 
 /**
@@ -1095,13 +1084,6 @@ gst_tensor_parse_dimension (const gchar * dimstr, tensor_dim dim)
     rank = i + 1;
   }
 
-  /**
-   * @todo remove below lines
-   * (0-initialized before parsing the string, filled remained dimension with 0)
-   */
-  for (; i < NNS_TENSOR_RANK_LIMIT; i++)
-    dim[i] = 1;
-
   g_strfreev (strv);
   g_free (dim_string);
   return rank;
@@ -1622,8 +1604,7 @@ gst_tensor_meta_info_convert (GstTensorMetaInfo * meta, GstTensorInfo * info)
       break;
     }
 
-    /** @todo handle rank from info.dimension (Fill 0, not 1) */
-    info->dimension[i] = (meta->dimension[i] > 0) ? meta->dimension[i] : 1;
+    info->dimension[i] = meta->dimension[i];
   }
 
   return TRUE;