[Tensors] Complete Set of Test Case for Tensors
authorjijoong.moon <jijoong.moon@samsung.com>
Wed, 27 Jun 2018 08:09:37 +0000 (17:09 +0900)
committer함명주/동작제어Lab(SR)/Principal Engineer/삼성전자 <myungjoo.ham@samsung.com>
Thu, 28 Jun 2018 04:10:03 +0000 (13:10 +0900)
Test Case is:
  1. generate random png (RGB, 640x480)
  2. read x-raw from png
  3. Make Three Tensors (gsttesttensors)
     . R Tensor [1][640][480][1] : Size 307200
     . G Tensor [1][640][480][1] : Size 307200
     . B Tensor [1][640][480][1] : Size 307200
     . num_tensors : 3
     . glist dimensions : tensor_dim type([1][640][480][1]) x 3

- Add generate golden data from python code
- Add tar for the tizen rpm pacakging
- Add binary difference check
- Modify tensor_meta to work right

Signed-off-by: jijoong.moon <jijoong.moon@samsung.com>
common/tensor_meta.c
packaging/nnstreamer.spec
packaging/testcase_tensors.tar.gz [new file with mode: 0644]
tests/nnstreamer_tensors/generateGoldenTestResult.py
tests/nnstreamer_tensors/runTest.sh
tests/nnstreamer_tensors/tensors_test/gsttensorscheck.c
tests/nnstreamer_tensors/tensors_test/gsttesttensors.c

index 58313fb..4959dab 100644 (file)
@@ -172,22 +172,24 @@ gst_make_tensors (GstBuffer * buffer)
 GstMetaTensor *
 gst_append_tensor (GstBuffer * buffer, GstMemory * mem, tensor_dim * dim)
 {
-  GstMemory *mem_dimension;
-  GstMapInfo info;
+  tensor_dim *d;
+  GstMapInfo dest_info;
+  gst_buffer_map (buffer, &dest_info, GST_MAP_WRITE);
 
+  g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
+
+  gst_buffer_append_memory (buffer, mem);
   GstMetaTensor *meta = GST_META_TENSOR_GET (buffer);
   if (!meta) {
     meta = gst_make_tensors (buffer);
   }
-  gst_buffer_append_memory (buffer, mem);
+
   meta->num_tensors = meta->num_tensors + 1;
 
-  mem_dimension = gst_allocator_alloc (NULL, sizeof(tensor_dim), NULL);
-  gst_memory_map (mem_dimension, &info, GST_MAP_WRITE);
-  memcpy (info.data, dim, sizeof(tensor_dim));
+  d = g_slice_new (tensor_dim);
+  memcpy (d, dim, sizeof (tensor_dim));
+  meta->dimensions = g_list_append (meta->dimensions, d);
 
-  meta->dimensions = g_list_append (meta->dimensions, info.data);
-  gst_memory_unmap (mem_dimension, &info);
   return meta;
 }
 
@@ -195,22 +197,28 @@ GstMemory *
 gst_get_tensor (GstBuffer * buffer, gint nth)
 {
   GstMetaTensor *meta;
+  GstMemory *mem;
   meta = (GstMetaTensor *) gst_buffer_get_meta_tensor (buffer);
-  if (!meta)
+  if (!meta) {
     return (GstMemory *) buffer;
-  else
-    return gst_buffer_get_memory (buffer, nth);
+  } else {
+    mem = gst_buffer_get_memory (buffer, nth);
+    return mem;
+  }
 }
 
 tensor_dim *
 gst_get_tensordim (GstBuffer * buffer, gint nth)
 {
   GstMetaTensor *meta;
+  tensor_dim *dim;
   meta = (GstMetaTensor *) gst_buffer_get_meta_tensor (buffer);
-  if (meta)
-    return (tensor_dim *) g_list_nth_data (meta->dimensions, nth);
-  else
+  if (meta) {
+    dim = (tensor_dim *) g_list_nth_data (meta->dimensions, nth);
+    return dim;
+  } else {
     return NULL;
+  }
 }
 
 GstFlowReturn
index e5dda23..7b8dddb 100644 (file)
@@ -11,6 +11,7 @@ Source0:      nnstreamer-%{version}.tar.gz
 Source1001:    nnstreamer.manifest
 Source2001:    testcase_tensor_converter.tar.gz
 Source2002:    testcase_tensor_decoder.tar.gz
+Source2003:    testcase_tensors.tar.gz
 
 Requires:      gstreamer >= 1.8.0
 Requires:      libdlog
@@ -81,7 +82,9 @@ pushd nnstreamer_decoder
 tar -xf %{SOURCE2002}
 popd
 
-cp nnstreamer_decoder/testcase01_RGB_642x480.png nnstreamer_tensors
+pushd nnstreamer_tensors
+tar -xf %{SOURCE2003}
+popd
 
 export SKIPGEN=YES
 ./testAll.sh
diff --git a/packaging/testcase_tensors.tar.gz b/packaging/testcase_tensors.tar.gz
new file mode 100644 (file)
index 0000000..4fa6825
Binary files /dev/null and b/packaging/testcase_tensors.tar.gz differ
index f18da4b..0305a12 100755 (executable)
@@ -52,4 +52,8 @@ def genCase01_PNG_random(colorType, width, height):
     img.save('testcase01_'+colorType+'_'+str(width)+'x'+str(height)+'.png')
     return (string, string_size, expected_size)
 
-genCase01_PNG_random('RGB', 642, 480)
+def write(filename, string):
+    newfile = open(filename, 'wb')
+    newfile.write(string)
+
+write('testcase01_RGB_640x480.golden', genCase01_PNG_random('RGB', 640, 480)[0])
index 9fc11f6..66e735c 100755 (executable)
@@ -11,6 +11,8 @@ else
   sopath=$1
 fi
 
-gstTest "--gst-plugin-path=../../build/tests/nnstreamer_tensors/tensors_test filesrc location=testcase01_RGB_642x480.png ! pngdec ! videoscale ! imagefreeze ! videoconvert ! video/x-raw,format=RGB,width=642,height=480,framerate=0/1 ! testtensors silent=TRUE ! tensorscheck ! filesink location=\"testcase01_RGB_642x480.nonip.log\" sync=true"
+gstTest "--gst-plugin-path=../../build/tests/nnstreamer_tensors/tensors_test filesrc location=testcase01_RGB_640x480.png ! pngdec ! videoscale ! imagefreeze ! videoconvert ! video/x-raw,format=RGB,width=640,height=480,framerate=0/1 ! testtensors silent=TRUE ! tensorscheck ! filesink location=\"testcase01_RGB_640x480.nonip.log\" sync=true" 1
+
+compareAllSizeLimit testcase01_RGB_640x480.golden testcase01_RGB_640x480.nonip.log 1
 
 report
index 6f20e32..a164563 100644 (file)
@@ -55,7 +55,7 @@
 /**
  * SECTION:element-tensorscheck
  *
- * FIXME:Describe tensorscheck here.
+ * This is the element to test tensors only.
  *
  * <refsect2>
  * <title>Example launch line</title>
@@ -102,7 +102,7 @@ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("ANY")
+    GST_STATIC_CAPS (GST_TENSOR_CAP_DEFAULT)
     );
 
 #define gst_tensorscheck_parent_class parent_class
@@ -255,7 +255,6 @@ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
 
   GstStructure *s = gst_caps_get_structure (caps, 0);
   gst_structure_get_int (s, "rank", &filter->rank);
-  printf ("%d\n", filter->rank);
   gst_structure_get_int (s, "dim1", &dim);
   filter->dimension[0] = dim;
   gst_structure_get_int (s, "dim2", &dim);
@@ -294,33 +293,50 @@ gst_tensors_check (Gsttensorscheck * filter, GstBuffer * inbuf)
   GstBuffer *outbuf;
   gint num_tensors;
   GstMapInfo info, src_info, dest_info;
-  GstMemory *mem;
   GstMemory *buffer_mem;
   tensor_dim *dim;
   unsigned int d0, d1, d2;
+  gboolean ret;
 
-  outbuf = gst_buffer_new ();
+  /* Mapping input buffer (tensors) into src_info */
   gst_buffer_map (inbuf, &src_info, GST_MAP_READ);
-  num_tensors = gst_get_num_tensors (inbuf);
-  printf ("num tensors : %d\n", num_tensors);
-  mem = gst_get_tensor (inbuf, 0);
-  dim = gst_get_tensordim (inbuf, 0);
-  buffer_mem = gst_allocator_alloc (NULL, (*dim)[1] * (*dim)[2], NULL);
+
+  /* Making output GstBuffer */
+  outbuf = gst_buffer_new ();
+
+  /* Making output buffer (one big buffer for check tensors) */
+  buffer_mem =
+      gst_allocator_alloc (NULL,
+      filter->dimension[0] * filter->dimension[1] * filter->dimension[2] *
+      filter->dimension[3], NULL);
   gst_buffer_append_memory (outbuf, buffer_mem);
+
   gst_buffer_map (outbuf, &dest_info, GST_MAP_WRITE);
 
-  printf ("%d %d %d %d\n", (*dim)[0], (*dim)[1], (*dim)[2], (*dim)[3]);
-  gst_memory_map (mem, &info, GST_MAP_READ);
-  size_t span = 0;
-  for (d0 = 0; d0 < (*dim)[3]; d0++) {
-    for (d1 = 0; d1 < (*dim)[2]; d1++) {
-      span = d1 * (*dim)[1];
-      for (d2 = 0; d2 < (*dim)[1]; d2++) {
-        dest_info.data[span + d2] = info.data[span + d2 * (*dim)[0]];
+  /* Get number of tensors */
+  num_tensors = gst_get_num_tensors (inbuf);
+
+  for (int i = 0; i < num_tensors; i++) {
+    GstMemory *mem = gst_get_tensor (inbuf, i);
+    gst_memory_unref (mem);
+    dim = gst_get_tensordim (inbuf, i);
+    ret = gst_memory_map (mem, &info, GST_MAP_WRITE);
+
+    if (!ret)
+      return NULL;
+    size_t span = 0;
+    size_t span1 = 0;
+    for (d0 = 0; d0 < (*dim)[3]; d0++) {
+      for (d1 = 0; d1 < (*dim)[2]; d1++) {
+        span = d1 * (*dim)[1];
+        span1 = d1 * (*dim)[1] * 3;
+        for (d2 = 0; d2 < (*dim)[1]; d2++) {
+          dest_info.data[span1 + (d2 * num_tensors) + i] = info.data[span + d2];
+        }
       }
     }
+    gst_memory_unmap (mem, &info);
   }
-
   gst_buffer_unmap (inbuf, &src_info);
   gst_buffer_unmap (outbuf, &dest_info);
 
index 963767b..914caba 100644 (file)
@@ -295,26 +295,29 @@ gst_test_tensors (Gsttesttensors * filter, GstBuffer * inbuf)
 {
   GstBuffer *outbuf;
   gint num_tensor;
-  GstMapInfo info, src_info, dest_info;
-  GstMemory *mem;
+  GstMapInfo info, src_info;
+
   int d0, d1, d2;
   outbuf = gst_buffer_new ();
   gst_buffer_map (inbuf, &src_info, GST_MAP_READ);
-  gst_buffer_map (outbuf, &dest_info, GST_MAP_WRITE);
 
   gst_make_tensors (outbuf);
+
   for (num_tensor = 0; num_tensor < filter->dimension[0]; num_tensor++) {
-    mem =
+
+    GstMemory *mem =
         gst_allocator_alloc (NULL, filter->dimension[1] * filter->dimension[2],
         NULL);
     gst_memory_map (mem, &info, GST_MAP_WRITE);
     size_t span = 0;
+    size_t span1 = 0;
     for (d0 = 0; d0 < filter->dimension[3]; d0++) {
       g_assert (d0 == 0);
       for (d1 = 0; d1 < filter->dimension[2]; d1++) {
-        span = d1 * filter->dimension[1];
+        span = d1 * filter->dimension[1] * filter->dimension[0];
+        span1 = d1 * filter->dimension[1];
         for (d2 = 0; d2 < filter->dimension[1]; d2++) {
-          info.data[span + d2] =
+          info.data[span1 + d2] =
               src_info.data[span + (d2 * filter->dimension[0]) + num_tensor];
         }
       }
@@ -324,15 +327,12 @@ gst_test_tensors (Gsttesttensors * filter, GstBuffer * inbuf)
     dim[1] = filter->dimension[1];
     dim[2] = filter->dimension[2];
     dim[3] = 1;
-    gst_append_tensor (outbuf, mem, &dim);
+
     gst_memory_unmap (mem, &info);
+    gst_append_tensor (outbuf, mem, &dim);
   }
 
   gst_buffer_unmap (inbuf, &src_info);
-  printf ("num_tensors = %d\n", gst_get_num_tensors (outbuf));
-  tensor_dim *dim = gst_get_tensordim (outbuf, 1);
-  printf ("%d %d %d %d \n", (*dim)[0], (*dim)[1], (*dim)[2], (*dim)[3]);
-  gst_buffer_unmap (outbuf, &dest_info);
 
   return outbuf;
 }
@@ -387,6 +387,7 @@ gst_testtensors_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
     return gst_pad_push (filter->srcpad, buf);
 
   out = gst_test_tensors (filter, buf);
+
   gst_buffer_unref (buf);
 
   return gst_pad_push (filter->srcpad, out);