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)