This is an automated email from the ASF dual-hosted git repository.

baunsgaard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new 6d02b61bcf [SYSTEMDS-3545] Image Cutout Linearized
6d02b61bcf is described below

commit 6d02b61bcf9d25a6f5e3545c30b7239d3eda6790
Author: slnkahveci <[email protected]>
AuthorDate: Thu Jun 15 13:51:00 2023 +0200

    [SYSTEMDS-3545] Image Cutout Linearized
    
    This commit adds the linearized cutout functionality to the list of
    image augmentation techniques.
    
    Closes #1845
---
 scripts/builtin/img_cutout_linearized.dml          |  70 ++++++++++
 .../java/org/apache/sysds/common/Builtins.java     |   1 +
 .../builtin/part1/BuiltinImageCutoutLinTest.java   | 144 +++++++++++++++++++++
 .../functions/builtin/image_cutout_linearized.dml  |  36 ++++++
 4 files changed, 251 insertions(+)

diff --git a/scripts/builtin/img_cutout_linearized.dml 
b/scripts/builtin/img_cutout_linearized.dml
new file mode 100644
index 0000000000..cb923e31ba
--- /dev/null
+++ b/scripts/builtin/img_cutout_linearized.dml
@@ -0,0 +1,70 @@
+#-------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#-------------------------------------------------------------
+
+# Image Cutout function replaces a rectangular section of an image with a 
constant value.
+#
+# INPUT:
+# 
---------------------------------------------------------------------------------------------
+# img_in      Input images as linearized 2D matrix with top left corner at [1, 
1]
+# x           Column index of the top left corner of the rectangle (starting 
at 1)
+# y           Row index of the top left corner of the rectangle (starting at 1)
+# width       Width of the rectangle (must be positive)
+# height      Height of the rectangle (must be positive)
+# fill_value   The value to set for the rectangle
+# s_cols      Width of a single image
+# s_rows      Height of a single image
+# 
---------------------------------------------------------------------------------------------
+#
+# OUTPUT:
+# 
------------------------------------------------------------------------------------------
+# img_out     Output images as linearized 2D matrix with top left corner at 
[1, 1]
+# 
------------------------------------------------------------------------------------------
+
+m_img_cutout_linearized = function(Matrix[Double] img_in, Integer x, Integer 
y, Integer width, Integer height, 
+  Double fill_value, Integer s_cols, Integer s_rows) return (Matrix[Double] 
img_out) {
+  rows = nrow(img_in) 
+  cols = ncol(img_in) 
+
+  if (width < 1 | height < 1) {
+    print("Invalid width or height. Returning input")
+    img_out = img_in
+  } else {
+
+    start_x = max(1, x)
+    start_y = max(1, y)
+
+    end_x = start_x + width - 1
+    end_x = min(s_cols, end_x)
+
+    end_y = start_y + height - 1
+    end_y = min(s_rows, end_y)
+
+    img_out = img_in
+
+    # Iterate through each row of the rectangular region
+    for (i in start_y: end_y){
+      start_idx = (i-1) * s_cols + start_x
+      end_idx = (i-1) * s_cols + end_x
+
+      img_out[, start_idx:end_idx] = matrix(fill_value, rows=rows, 
cols=(end_x-start_x+1))
+    }
+  }
+}
diff --git a/src/main/java/org/apache/sysds/common/Builtins.java 
b/src/main/java/org/apache/sysds/common/Builtins.java
index c94e425815..4b781c3931 100644
--- a/src/main/java/org/apache/sysds/common/Builtins.java
+++ b/src/main/java/org/apache/sysds/common/Builtins.java
@@ -166,6 +166,7 @@ public enum Builtins {
        IMG_ROTATE("img_rotate", true),
        IMG_SHEAR("img_shear", true),
        IMG_CUTOUT("img_cutout", true),
+       IMG_CUTOUT_LINEARIZED("img_cutout_linearized", true),
        IMG_SAMPLE_PAIRING("img_sample_pairing", true),
        IMG_INVERT("img_invert", true),
        IMG_INVERT_LINEARIZED("img_invert_linearized", true),
diff --git 
a/src/test/java/org/apache/sysds/test/functions/builtin/part1/BuiltinImageCutoutLinTest.java
 
b/src/test/java/org/apache/sysds/test/functions/builtin/part1/BuiltinImageCutoutLinTest.java
new file mode 100644
index 0000000000..48c3c83a3b
--- /dev/null
+++ 
b/src/test/java/org/apache/sysds/test/functions/builtin/part1/BuiltinImageCutoutLinTest.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sysds.test.functions.builtin.part1;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.apache.sysds.common.Types.ExecMode;
+import org.apache.sysds.common.Types.ExecType;
+import org.apache.sysds.runtime.matrix.data.MatrixValue;
+import org.apache.sysds.test.AutomatedTestBase;
+import org.apache.sysds.test.TestConfiguration;
+import org.apache.sysds.test.TestUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
[email protected]
+
+public class BuiltinImageCutoutLinTest extends AutomatedTestBase {
+       private final static String TEST_NAME = "image_cutout_linearized";
+       private final static String TEST_DIR = "functions/builtin/";
+       private final static String TEST_CLASS_DIR = TEST_DIR + 
BuiltinImageCutoutLinTest.class.getSimpleName() + "/";
+
+       private final static double eps = 1e-10;
+       private final static double spSparse = 0.1;
+       private final static double spDense = 0.9;
+
+       @Parameterized.Parameter(0)
+       public int s_rows;
+       @Parameterized.Parameter(1)
+       public int s_cols;
+       @Parameterized.Parameter(2)
+       public int x;
+       @Parameterized.Parameter(3)
+       public int y;
+       @Parameterized.Parameter(4)
+       public int width;
+       @Parameterized.Parameter(5)
+       public int height;
+       @Parameterized.Parameter(6)
+       public int fill_color;
+       @Parameterized.Parameter(7)
+       public int n_imgs;
+
+       @Parameterized.Parameters
+       public static Collection<Object[]> data() {
+               return Arrays.asList(new Object[][] {
+                       {12, 12, 7, 5, 6, 2, 0, 512}, 
+                       {13, 11, 10, 7, 2, 3, 32, 175},
+                       {32, 32, 2, 11, 1, 60, 64, 4}, 
+                       {64, 64, 50, 17, 10, 109, 96, 5}, 
+                       {64, 61, 33, 20, 30, 10, 128, 32},
+                       {128, 128, 2, 3, 2, 9, 192, 5}, 
+                       {123, 128, 83, 70, 50, 2, 225, 12},});
+       }
+
+       @Override
+       public void setUp() {
+               addTestConfiguration(TEST_NAME, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME, new String[] {"B"}));
+       }
+
+       @Test
+       public void testImageTranslateMatrixDenseCP() {
+               runImageCutoutLinTest(false, ExecType.CP);
+       }
+
+       @Test
+       public void testImageTranslateMatrixSparseCP() {
+               runImageCutoutLinTest(true, ExecType.CP);
+       }
+
+       @Test
+       public void testImageTranslateMatrixDenseSP() {
+               runImageCutoutLinTest(false, ExecType.SPARK);
+       }
+
+       @Test
+       public void testImageTranslateMatrixSparseSP() {
+               runImageCutoutLinTest(false, ExecType.SPARK);
+       }
+
+       private void runImageCutoutLinTest(boolean sparse, ExecType instType) {
+               ExecMode platformOld = setExecMode(instType);
+               disableOutAndExpectedDeletion();
+
+               setOutputBuffering(true);
+
+               try {
+                       loadTestConfiguration(getTestConfiguration(TEST_NAME));
+                       double sparsity = sparse ? spSparse : spDense;
+
+                       String HOME = SCRIPT_DIR + TEST_DIR;
+                       fullDMLScriptName = HOME + TEST_NAME + ".dml";
+                       programArgs = new String[] {"-nvargs", "in_file=" + 
input("A"), "out_file=" + output("B"),
+                               "width=" + (s_cols * s_rows), "height=" + 
n_imgs, "x=" + (x + 1), "y=" + (y + 1), "w=" + width,
+                               "h=" + height, "fill_color=" + fill_color, 
"s_cols=" + s_cols, "s_rows=" + s_rows};
+
+                       double[][] A = getRandomMatrix(n_imgs, s_cols * s_rows, 
0, 255, sparsity, 7);
+                       writeInputMatrixWithMTD("A", A, true);
+
+                       double[][] ref = new double[n_imgs][s_cols * s_rows];
+                       for(int i = 0; i < n_imgs; i++) {
+                               for(int j = 0; j < s_cols * s_rows; j++) {
+                                       ref[i][j] = A[i][j];
+                                       if(y <= (int) Math.floor(j / s_cols) && 
(int) Math.floor(j / s_cols) < y + height && x <= (j % s_cols) &&
+                                               (j % s_cols) < x + width) {
+                                               ref[i][j] = fill_color;
+                                       }
+                               }
+                       }
+
+                       runTest(true, false, null, -1);
+
+                       HashMap<MatrixValue.CellIndex, Double> dmlfile = 
readDMLMatrixFromOutputDir("B");
+                       double[][] dml_res = 
TestUtils.convertHashMapToDoubleArray(dmlfile, n_imgs, (s_cols * s_rows));
+
+                       TestUtils.compareMatrices(ref, dml_res, eps, "Java vs. 
DML");
+
+               }
+               finally {
+                       rtplatform = platformOld;
+               }
+       }
+}
diff --git a/src/test/scripts/functions/builtin/image_cutout_linearized.dml 
b/src/test/scripts/functions/builtin/image_cutout_linearized.dml
new file mode 100644
index 0000000000..d81a9f37e5
--- /dev/null
+++ b/src/test/scripts/functions/builtin/image_cutout_linearized.dml
@@ -0,0 +1,36 @@
+#-------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#-------------------------------------------------------------
+
+input = read($in_file)
+width = ifdef($width, 512)
+height = ifdef($height, 512)
+x = ifdef($x, 0)
+y = ifdef($y, 0)
+w = ifdef($w, width)
+h = ifdef($h, height)
+s_cols = ifdef($s_cols, 512)
+s_rows = ifdef($s_rows, 512)
+fill_value = ifdef($fill_color, 0)
+
+input = matrix(input, rows=height, cols=width)
+
+res = img_cutout_linearized(input, x, y, w, h, fill_value, s_cols, s_rows)
+write(res, $out_file)

Reply via email to