[Transform] Add Standardization Mode in Tranform Plugin
authorjijoong.moon <jijoong.moon@samsung.com>
Thu, 4 Oct 2018 07:32:35 +0000 (16:32 +0900)
committerMyungJoo Ham <myungjoo.ham@gmail.com>
Wed, 10 Oct 2018 04:47:17 +0000 (13:47 +0900)
Add Standardization Mode (mode=stand, option=default). Could be added
more methods.

for Tensor T,
: out[i] = fabs((T[i] - average(T)) / (stand(T) + 1e-10))

**Self evaluation:**
1. Build test:  [X]Passed [ ]Failed [ ]Skipped
2. Run test:  [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: jijoong.moon <jijoong.moon@samsung.com>
gst/tensor_transform/tensor_transform.c
gst/tensor_transform/tensor_transform.h

index 6175c0d..095d75b 100644 (file)
@@ -51,6 +51,7 @@
 #include <string.h>
 #include <gst/gst.h>
 #include <glib.h>
+#include <math.h>
 
 #include "tensor_transform.h"
 
@@ -193,6 +194,7 @@ static const gchar *gst_tensor_transform_mode_string[] = {
   [GTT_TYPECAST] = "typecast",
   [GTT_ARITHMETIC] = "arithmetic",
   [GTT_TRANSPOSE] = "transpose",
+  [GTT_STAND] = "stand",
   [GTT_END] = "error",
 };
 
@@ -220,6 +222,18 @@ gst_tensor_transform_get_arith_mode (const gchar * str)
   return ARITH_END;
 }
 
+static const gchar *gst_tensor_transform_stand_string[] = {
+  [STAND_DEFAULT] = "default",
+  [STAND_END] = NULL,
+};
+
+/**
+ * @brief Get the corresponding mode from the string value
+ * @param[in] str The string value for the mode
+ * @return corresponding mode for the string. ARITH_END for errors
+ */
+#define gst_tensor_transform_get_stand_mode(str) find_key_strv(gst_tensor_transform_stand_string, str)
+
 /**
  * @brief Get the corresponding mode from the string value
  * @param[in] str The string value for the mode
@@ -301,6 +315,15 @@ gst_tensor_transform_set_option_data (GstTensor_Transform * filter)
       g_strfreev (strv);
     }
       break;
+    case GTT_STAND:
+    {
+      filter->data_stand.mode =
+          gst_tensor_transform_get_stand_mode (filter->option);
+
+      g_assert (filter->data_stand.mode >= 0);
+      filter->loaded = TRUE;
+    }
+      break;
     default:
       g_printerr ("Cannot identify mode\n");
       g_assert (0);
@@ -736,6 +759,58 @@ gst_tensor_transform_transpose (GstTensor_Transform * filter,
 
 
 /**
+ * @brief subrouting for tensor-tranform, "stand" case.
+ *        : pixel = abs((pixel - average(tensor))/(std(tensor) + val))
+ * @param[in/out] filter "this" pointer
+ * @param[in] inptr input tensor
+ * @param[out] outptr output tensor
+ * @return Gst flow status
+ */
+static GstFlowReturn
+gst_tensor_transform_stand (GstTensor_Transform * filter,
+    const uint8_t * inptr, uint8_t * outptr)
+{
+  int i;
+  size_t Size;
+  uint32_t *fromDim = filter->fromDim;
+  double average, stand;
+
+  float *in = (float *) inptr;
+  float *out = (float *) outptr;
+  Size = fromDim[3] * fromDim[2] * fromDim[1] * fromDim[0];
+
+  switch (filter->data_stand.mode) {
+    case STAND_DEFAULT:
+    {
+      average = 0.0;
+
+      for (i = 0; i < Size; i++) {
+        average = (in[i] - average) / (i + 1) + average;
+      }
+
+      stand = 0.0;
+
+      for (i = 0; i < Size; i++) {
+        stand += pow (in[i] - average, 2) / (Size - 1);
+      }
+
+      stand = sqrt (stand);
+      for (i = 0; i < Size; i++) {
+        out[i] = fabs ((in[i] - average) / (stand + 1e-10));
+      }
+    }
+      break;
+    default:
+      g_printerr ("Cannot identify mode\n");
+      g_assert (0);
+  }
+
+  return GST_FLOW_OK;
+}
+
+
+
+/**
  * @brief non-ip transform. required vmethod for BaseTransform class.
  * @param[in/out] trans "super" pointer
  * @param[in] inbuf The input gst buffer
@@ -770,6 +845,9 @@ gst_tensor_transform_transform (GstBaseTransform * trans,
     case GTT_TRANSPOSE:
       res = gst_tensor_transform_transpose (filter, inptr, outptr);
       break;
+    case GTT_STAND:
+      res = gst_tensor_transform_stand (filter, inptr, outptr);
+      break;
     default:
       res = GST_FLOW_NOT_SUPPORTED;
   }
@@ -976,6 +1054,17 @@ gst_tensor_dimension_conversion (GstTensor_Transform * filter,
       ret = TRUE;
     }
       break;
+    case GTT_STAND:
+    {
+      int i;
+      for (i = 0; i < NNS_TENSOR_RANK_LIMIT; i++) {
+        destDim[i] = srcDim[i];
+      }
+      *destType = srcType;
+      ret = TRUE;
+    }
+      break;
+
     default:
       return FALSE;
   }
@@ -1131,6 +1220,7 @@ gst_tensor_transform_set_caps (GstBaseTransform * trans,
   switch (filter->mode) {
     case GTT_TRANSPOSE:
     case GTT_ARITHMETIC:
+    case GTT_STAND:
     case GTT_DIMCHG:
       if (itype != otype || filter->type != itype) {
         debug_print (!filter->silent, "Filter Type Not Matched\n");
@@ -1167,6 +1257,7 @@ gst_tensor_transform_transform_size (GstBaseTransform * trans,
   switch (filter->mode) {
     case GTT_TRANSPOSE:
     case GTT_ARITHMETIC:
+    case GTT_STAND:
     case GTT_DIMCHG:
       *othersize = size;        /* size of input = size of output if dimchg */
       break;
index 5eaa07b..386822d 100644 (file)
@@ -72,6 +72,7 @@ typedef enum
   GTT_TYPECAST = 1,             /* Type change. "typecast" */
   GTT_ARITHMETIC = 2,           /* Type change. "typecast" */
   GTT_TRANSPOSE = 3,            /* Transpose. "transpose" */
+  GTT_STAND = 4,                /* Standardization. "stand" */
 
   GTT_END,
 } tensor_transform_mode;
@@ -83,6 +84,12 @@ typedef enum
   ARITH_END,
 } tensor_transform_arith_mode;
 
+typedef enum
+{
+  STAND_DEFAULT = 0,
+  STAND_END,
+} tensor_transform_stand_mode;
+
 /**
  * @brief Internal data structure for dimchg mode.
  */
@@ -115,6 +122,13 @@ typedef struct _tensor_transform_transpose {
 } tensor_transform_transpose;
 
 /**
+ * @brief Internal data structure for arithmetic mode.
+ */
+typedef struct _tensor_transform_stand {
+  tensor_transform_stand_mode mode;
+} tensor_transform_stand;
+
+/**
  * @brief Internal data structure for tensor_transform instances.
  */
 struct _GstTensor_Transform
@@ -129,6 +143,7 @@ struct _GstTensor_Transform
     tensor_transform_typecast data_typecast; /**< Parsed option value for "typecast" mode. */
     tensor_transform_arithmetic data_arithmetic; /**< Parsed option value for "arithmetic" mode. */
     tensor_transform_transpose data_transpose; /**< Parsed option value for "transpose" mode. */
+    tensor_transform_stand data_stand; /**< Parsed option value for "stand" mode. */
   };
   gboolean loaded; /**< TRUE if mode & option are loaded */