Skip to content

Commit

Permalink
[SYSTEMDS-3545] Image Cutout Linearized
Browse files Browse the repository at this point in the history
This commit adds the linearized cutout functionality to the list of
image augmentation techniques.

Closes #1845
  • Loading branch information
slnkahveci authored and Baunsgaard committed Oct 17, 2023
1 parent 2b05e9f commit 6d02b61
Show file tree
Hide file tree
Showing 4 changed files with 251 additions and 0 deletions.
70 changes: 70 additions & 0 deletions scripts/builtin/img_cutout_linearized.dml
Original file line number Diff line number Diff line change
@@ -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))
}
}
}
1 change: 1 addition & 0 deletions src/main/java/org/apache/sysds/common/Builtins.java
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
@net.jcip.annotations.NotThreadSafe

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;
}
}
}
36 changes: 36 additions & 0 deletions src/test/scripts/functions/builtin/image_cutout_linearized.dml
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 6d02b61

Please sign in to comment.