1
0
Fork 0
mirror of synced 2024-05-16 10:52:20 +12:00

Update random erasing; Support x padding

This commit is contained in:
nagadomi 2018-08-29 05:47:02 +09:00
parent 93cd40a53c
commit 0fe21eef70
4 changed files with 42 additions and 22 deletions

View file

@ -63,16 +63,24 @@ local function crop_if_large_pair(x, y, max_size)
return x, y
end
end
local function padding_x(x, pad)
local function padding_x(x, pad, x_zero)
if pad > 0 then
x = iproc.padding(x, pad, pad, pad, pad)
if x_zero then
x = iproc.zero_padding(x, pad, pad, pad, pad)
else
x = iproc.padding(x, pad, pad, pad, pad)
end
end
return x
end
local function padding_xy(x, y, pad, y_zero)
local function padding_xy(x, y, pad, x_zero, y_zero)
local scale = y:size(2) / x:size(2)
if pad > 0 then
x = iproc.padding(x, pad, pad, pad, pad)
if x_zero then
x = iproc.zero_padding(x, pad, pad, pad, pad)
else
x = iproc.padding(x, pad, pad, pad, pad)
end
if y_zero then
y = iproc.zero_padding(y, pad * scale, pad * scale, pad * scale, pad * scale)
else
@ -127,7 +135,7 @@ local function load_images(list)
xx = alpha_util.fill(xx, meta2.alpha, alpha_color)
end
xx, yy = crop_if_large_pair(xx, yy, settings.max_training_image_size)
xx, yy = padding_xy(xx, yy, settings.padding, settings.padding_y_zero)
xx, yy = padding_xy(xx, yy, settings.padding, settings.padding_x_zero, settings.padding_y_zero)
if settings.grayscale then
xx = iproc.rgb2y(xx)
yy = iproc.rgb2y(yy)
@ -140,7 +148,7 @@ local function load_images(list)
else
im = crop_if_large(im, settings.max_training_image_size)
im = iproc.crop_mod4(im)
im = padding_x(im, settings.padding)
im = padding_x(im, settings.padding, settings.padding_x_zero)
local scale = 1.0
if settings.random_half_rate > 0.0 then
scale = 2.0

View file

@ -13,6 +13,21 @@ local function pcacov(x)
local ce, cv = torch.symeig(c, 'V')
return ce, cv
end
function random_rect_size(rect_min, rect_max)
local r = torch.Tensor(2):uniform():cmul(torch.Tensor({rect_max - rect_min, rect_max - rect_min})):int()
local rect_h = r[1] + rect_min
local rect_w = r[2] + rect_min
return rect_h, rect_w
end
function random_rect(height, width, rect_h, rect_w)
local r = torch.Tensor(2):uniform():cmul(torch.Tensor({height - 1 - rect_h, width-1 - rect_w})):int()
local rect_y1 = r[1] + 1
local rect_x1 = r[2] + 1
local rect_x2 = rect_x1 + rect_w
local rect_y2 = rect_y1 + rect_h
return {x1 = rect_x1, y1 = rect_y1, x2 = rect_x2, y2 = rect_y2}
end
function data_augmentation.erase(src, p, n, rect_min, rect_max)
if torch.uniform() < p then
local src, conversion = iproc.byte2float(src)
@ -21,17 +36,12 @@ function data_augmentation.erase(src, p, n, rect_min, rect_max)
local height = src:size(2)
local width = src:size(3)
for i = 1, n do
local r = torch.Tensor(4):uniform():cmul(torch.Tensor({height-1, width-1, rect_max - rect_min, rect_max - rect_min})):int()
local rect_y1 = r[1] + 1
local rect_x1 = r[2] + 1
local rect_h = r[3] + rect_min
local rect_w = r[4] + rect_min
local rect_x2 = math.min(rect_x1 + rect_w, width)
local rect_y2 = math.min(rect_y1 + rect_h, height)
local sub_rect = src:sub(1, ch, rect_y1, rect_y2, rect_x1, rect_x2)
for i = 1, ch do
sub_rect[i]:fill(src[i][rect_y1][rect_x1])
end
local rect_h, rect_w = random_rect_size(rect_min, rect_max)
local rect1 = random_rect(height, width, rect_h, rect_w)
local rect2 = random_rect(height, width, rect_h, rect_w)
dest_rect = src:sub(1, ch, rect1.y1, rect1.y2, rect1.x1, rect1.x2)
src_rect = src:sub(1, ch, rect2.y1, rect2.y2, rect2.x1, rect2.x2)
dest_rect:copy(src_rect:clone())
end
if conversion then
src = iproc.float2byte(src)

View file

@ -92,6 +92,11 @@ end
function pairwise_transform_utils.preprocess_user(x, y, scale_y, size, options)
x, y = pairwise_transform_utils.crop_if_large_pair(x, y, scale_y, options.max_size, scale_y)
x = data_augmentation.erase(x,
options.random_erasing_rate,
options.random_erasing_n,
options.random_erasing_rect_min,
options.random_erasing_rect_max)
x, y = data_augmentation.pairwise_rotate(x, y,
options.random_pairwise_rotate_rate,
options.random_pairwise_rotate_min,
@ -105,11 +110,6 @@ function pairwise_transform_utils.preprocess_user(x, y, scale_y, size, options)
scale_max)
x, y = data_augmentation.pairwise_negate(x, y, options.random_pairwise_negate_rate)
x, y = data_augmentation.pairwise_negate_x(x, y, options.random_pairwise_negate_x_rate)
x = data_augmentation.erase(x,
options.random_erasing_rate,
options.random_erasing_n,
options.random_erasing_rect_min,
options.random_erasing_rect_max)
x = iproc.crop_mod4(x)
y = iproc.crop_mod4(y)
return x, y

View file

@ -82,6 +82,7 @@ cmd:option("-loss", "huber", 'loss function (huber|l1|mse|bce)')
cmd:option("-update_criterion", "mse", 'mse|loss')
cmd:option("-padding", 0, 'replication padding size')
cmd:option("-padding_y_zero", 0, 'zero padding y for segmentation (0|1)')
cmd:option("-padding_x_zero", 0, 'zero padding x for segmentation (0|1)')
cmd:option("-grayscale", 0, 'grayscale x&y (0|1)')
cmd:option("-validation_filename_split", 0, 'make validation-set based on filename(basename)')
cmd:option("-invert_x", 0, 'invert x image in convert_lua')
@ -104,6 +105,7 @@ to_bool(settings, "use_transparent_png")
to_bool(settings, "pairwise_y_binary")
to_bool(settings, "pairwise_flip")
to_bool(settings, "padding_y_zero")
to_bool(settings, "padding_x_zero")
to_bool(settings, "grayscale")
to_bool(settings, "validation_filename_split")
to_bool(settings, "invert_x")