def multibox_prior(data, sizes=(1,), ratios=(1,), steps=(-1, -1), offsets=(0.5, 0.5), clip=False): """Generate prior(anchor) boxes from data, sizes and ratios. Parameters ---------- data : tvm.Tensor 4-D with shape [batch, c_in, h_in, w_in]] sizes : tuple of float Tuple of sizes for anchor boxes. ratios : tuple of float Tuple of ratios for anchor boxes. steps : Tuple of float Priorbox step across y and x, -1 for auto calculation. offsets : tuple of int Priorbox center offsets, y and x respectively. clip : boolean Whether to clip out-of-boundary boxes. Returns ------- out : tvm.Tensor 3-D tensor with shape [1, h_in * w_in * (num_sizes + num_ratios - 1), 4] """ out = hybrid_multibox_prior(data, tvm.convert(sizes), tvm.convert(ratios), tvm.convert(steps), tvm.convert(offsets)) if clip: out = topi.clip(out, 0, 1) return out
def verify_clip(N, a_min, a_max, dtype): A = tvm.placeholder((N, N), dtype=dtype, name='A') B = topi.clip(A, a_min, a_max) s = tvm.create_schedule([B.op]) # use memoize to pickle the test data for next time use @memoize("topi.tests.test_topi_clip") def get_ref_data(): a_np = np.random.uniform(a_min * 2, a_max * 2, size=(N, N)).astype(dtype) b_np = np.clip(a_np, a_min, a_max) return a_np, b_np a_np, b_np = get_ref_data() def check_device(device): ctx = tvm.context(device, 0) if not ctx.exist: print("Skip because %s is not enabled" % device) return print("Running on target: %s" % device) with tvm.target.create(device): s = topi.generic.schedule_injective(B) a = tvm.nd.array(a_np, ctx) b = tvm.nd.array(np.zeros(get_const_tuple(B.shape), dtype=dtype), ctx) f = tvm.build(s, [A, B], device, name="clip") f(a, b) np.testing.assert_allclose(b.asnumpy(), b_np, rtol=1e-5) for device in get_all_backend(): check_device(device)
def verify_clip(N, a_min, a_max, dtype): A = tvm.placeholder((N, N), dtype=dtype, name='A') B = topi.clip(A, a_min, a_max) s = tvm.create_schedule([B.op]) # use memoize to pickle the test data for next time use @memoize("topi.tests.test_topi_clip") def get_ref_data(): a_np = np.random.uniform(a_min*2, a_max*2, size=(N, N)).astype(dtype) b_np = np.clip(a_np, a_min, a_max) return a_np, b_np a_np, b_np = get_ref_data() def check_device(device): ctx = tvm.context(device, 0) if not ctx.exist: print("Skip because %s is not enabled" % device) return print("Running on target: %s" % device) with tvm.target.create(device): s = topi.generic.schedule_injective(B) a = tvm.nd.array(a_np, ctx) b = tvm.nd.array(np.zeros(get_const_tuple(B.shape), dtype=dtype), ctx) f = tvm.build(s, [A, B], device, name="clip") f(a, b) tvm.testing.assert_allclose(b.asnumpy(), b_np, rtol=1e-5) for device in get_all_backend(): check_device(device)
def verify_clip(N, a_min, a_max, dtype): A = tvm.placeholder((N, N), dtype=dtype, name='A') B = topi.clip(A, a_min, a_max) s = tvm.create_schedule([B.op]) # use memoize to pickle the test data for next time use @memoize("topi.tests.test_topi_clip") def get_ref_data(): a_np = np.random.uniform(a_min*2, a_max*2, size=(N, N)).astype(dtype) b_np = np.clip(a_np, a_min, a_max) return a_np, b_np a_np, b_np = get_ref_data() def check_device(device): if not tvm.module.enabled(device): print("Skip because %s is not enabled" % device) return ctx = tvm.cpu(0) if device == "llvm" else tvm.gpu(0) a = tvm.nd.array(a_np, ctx) b = tvm.nd.array(np.zeros(get_const_tuple(B.shape), dtype=dtype), ctx) f = tvm.build(s, [A, B], device, name="clip") f(a, b) np.testing.assert_allclose(b.asnumpy(), b_np, rtol=1e-5) for device in ['llvm']: check_device(device)
def verify_clip(N, a_min, a_max, dtype): A = tvm.placeholder((N, N), dtype=dtype, name='A') B = topi.clip(A, a_min, a_max) s = tvm.create_schedule([B.op]) # use memoize to pickle the test data for next time use @memoize("topi.tests.test_topi_clip") def get_ref_data(): a_np = np.random.uniform(a_min * 2, a_max * 2, size=(N, N)).astype(dtype) b_np = np.clip(a_np, a_min, a_max) return a_np, b_np a_np, b_np = get_ref_data() def check_device(device): if not tvm.module.enabled(device): print("Skip because %s is not enabled" % device) return ctx = tvm.cpu(0) if device == "llvm" else tvm.gpu(0) a = tvm.nd.array(a_np, ctx) b = tvm.nd.array(np.zeros(get_const_tuple(B.shape), dtype=dtype), ctx) f = tvm.build(s, [A, B], device, name="clip") f(a, b) np.testing.assert_allclose(b.asnumpy(), b_np, rtol=1e-5) for device in ['llvm']: check_device(device)
def multibox_prior_gpu(data, sizes=(1, ), ratios=(1, ), steps=(-1, -1), offsets=(0.5, 0.5), clip=False): """Generate prior(anchor) boxes from data, sizes and ratios. Parameters ---------- data : tvm.Tensor 4-D with shape [batch, c_in, h_in, w_in]] sizes : tuple of float Tuple of sizes for anchor boxes. ratios : tuple of float Tuple of ratios for anchor boxes. steps : Tuple of float Priorbox step across y and x, -1 for auto calculation. offsets : tuple of int Priorbox center offsets, y and x respectively. clip : boolean Whether to clip out-of-boundary boxes. Returns ------- out : tvm.Tensor 3-D tensor with shape [1, h_in * w_in * (num_sizes + num_ratios - 1), 4] """ num_sizes = len(sizes) num_ratios = len(ratios) oshape = (1, data.shape[2] * data.shape[3] * (num_sizes + num_ratios - 1), 4) out = tvm.extern(oshape, [data], lambda ins, outs: multibox_prior_ir( ins[0], outs[0], sizes, ratios, steps, offsets), tag="multibox_prior") if clip: out = topi.clip(out, 0, 1) return out
def multibox_prior_gpu(data, sizes=(1,), ratios=(1,), steps=(-1, -1), offsets=(0.5, 0.5), clip=False): """Generate prior(anchor) boxes from data, sizes and ratios. Parameters ---------- data : tvm.Tensor 4-D with shape [batch, c_in, h_in, w_in]] sizes : tuple of float Tuple of sizes for anchor boxes. ratios : tuple of float Tuple of ratios for anchor boxes. steps : Tuple of float Priorbox step across y and x, -1 for auto calculation. offsets : tuple of int Priorbox center offsets, y and x respectively. clip : boolean Whether to clip out-of-boundary boxes. Returns ------- out : tvm.Tensor 3-D tensor with shape [1, h_in * w_in * (num_sizes + num_ratios - 1), 4] """ num_sizes = len(sizes) num_ratios = len(ratios) oshape = ( 1, data.shape[2] * data.shape[3] * (num_sizes + num_ratios - 1), 4) out = tvm.extern(oshape, [data], lambda ins, outs: multibox_prior_ir( ins[0], outs[0], sizes, ratios, steps, offsets), tag="multibox_prior") if clip: out = topi.clip(out, 0, 1) return out
def clip_compute(attrs, inputs, output_type, target): assert len(inputs) == 1 return [topi.clip(inputs[0], attrs.a_min, attrs.a_max)]
def _interpolate(im, im_shape, x, y, out_size, dtype): num_batch = im_shape[0] height = im_shape[1] width = im_shape[2] channels = im_shape[3] out_height = out_size[0] out_width = out_size[1] max_y = int(im_shape[1] - 1) max_x = int(im_shape[2] - 1) #[-1,1] -> [0, width-1] x = topi.multiply(topi.add(x, tvm.const(1, dtype=dtype)), width / tvm.const(2, dtype=dtype)) y = topi.multiply(topi.add(y, tvm.const(1, dtype=dtype)), height / tvm.const(2, dtype=dtype)) # do sampling dim3 = out_height * out_width * num_batch x0 = topi.cast(topi.floor(x), 'int32') y0 = topi.cast(topi.floor(y), 'int32') x1 = topi.add(x0,tvm.const(1, dtype="int32")) y1 = topi.add(y0,tvm.const(1, dtype="int32")) x0 = topi.clip(x0, 0, max_x) x1 = topi.clip(x1, 0, max_x) y0 = topi.clip(y0, 0, max_y) y1 = topi.clip(y1, 0, max_y) dim2 = width dim1 = width * height base = tvm.compute((dim3,),lambda i:(i // (out_height * out_width)) * width * height, name = 'base') base_y0 = topi.add(base, topi.multiply(y0, dim2)) base_y1 = topi.add(base, topi.multiply(y1, dim2)) idx_a = topi.add(base_y0, x0) idx_b = topi.add(base_y1, x0) idx_c = topi.add(base_y0, x1) idx_d = topi.add(base_y1, x1) im_flat = topi.reshape(im, (num_batch * height * width, channels)) im_flat = topi.cast(im_flat, dtype) Ia = tvm.compute((dim3, channels),lambda i,j: im_flat[idx_a[i], j], name = 'Ia') Ib = tvm.compute((dim3, channels),lambda i,j: im_flat[idx_b[i], j], name = 'Ib') Ic = tvm.compute((dim3, channels),lambda i,j: im_flat[idx_c[i], j], name = 'Ic') Id = tvm.compute((dim3, channels),lambda i,j: im_flat[idx_d[i], j], name = 'Id') x0_f = topi.cast(x0, dtype) x1_f = topi.cast(x1, dtype) y0_f = topi.cast(y0, dtype) y1_f = topi.cast(y1, dtype) wa = topi.expand_dims(topi.multiply(topi.subtract(x1_f, x), topi.subtract(y1_f, y)), 1) wb = topi.expand_dims(topi.multiply(topi.subtract(x1_f, x), topi.subtract(y, y0_f)), 1) wc = topi.expand_dims(topi.multiply(topi.subtract(x, x0_f), topi.subtract(y1_f, y)), 1) wd = topi.expand_dims(topi.multiply(topi.subtract(x, x0_f), topi.subtract(y, y0_f)), 1) output = topi.add(topi.add(topi.add(topi.multiply(wa, Ia), topi.multiply(wb, Ib)),topi.multiply(wc, Ic)), topi.multiply(wd, Id)) return output
def _interpolate(im, im_shape, x, y, out_size, dtype): num_batch = im_shape[0] height = im_shape[1] width = im_shape[2] channels = im_shape[3] out_height = out_size[0] out_width = out_size[1] max_y = int(im_shape[1] - 1) max_x = int(im_shape[2] - 1) # [-1,1] -> [0, width-1] x_temp = topi.multiply(topi.add(x, tvm.const(1, dtype=dtype)), width / tvm.const(2, dtype=dtype)) y_temp = topi.multiply(topi.add(y, tvm.const(1, dtype=dtype)), height / tvm.const(2, dtype=dtype)) # do sampling dim3 = out_height * out_width * num_batch x_zero = topi.cast(topi.floor(x_temp), 'int32') y_zero = topi.cast(topi.floor(y_temp), 'int32') x_one = topi.add(x_zero, tvm.const(1, dtype="int32")) y_one = topi.add(y_zero, tvm.const(1, dtype="int32")) x_zero = topi.clip(x_zero, 0, max_x) x_one = topi.clip(x_one, 0, max_x) y_zero = topi.clip(y_zero, 0, max_y) y_one = topi.clip(y_one, 0, max_y) dim2 = width base = tvm.compute((dim3, ), lambda i: (i // (out_height * out_width)) * width * height, name='base') base_y0 = topi.add(base, topi.multiply(y_zero, dim2)) base_y1 = topi.add(base, topi.multiply(y_one, dim2)) idx_a = topi.add(base_y0, x_zero) idx_b = topi.add(base_y1, x_zero) idx_c = topi.add(base_y0, x_one) idx_d = topi.add(base_y1, x_one) im_flat = topi.reshape(im, (num_batch * height * width, channels)) im_flat = topi.cast(im_flat, dtype) i_a = tvm.compute((dim3, channels), lambda i, j: im_flat[idx_a[i], j], name='Ia') i_b = tvm.compute((dim3, channels), lambda i, j: im_flat[idx_b[i], j], name='Ib') i_c = tvm.compute((dim3, channels), lambda i, j: im_flat[idx_c[i], j], name='Ic') i_d = tvm.compute((dim3, channels), lambda i, j: im_flat[idx_d[i], j], name='Id') x0_f = topi.cast(x_zero, dtype) x1_f = topi.cast(x_one, dtype) y0_f = topi.cast(y_zero, dtype) y1_f = topi.cast(y_zero, dtype) w_a = topi.expand_dims( topi.multiply(topi.subtract(x1_f, x_temp), topi.subtract(y1_f, y_temp)), 1) w_b = topi.expand_dims( topi.multiply(topi.subtract(x1_f, x_temp), topi.subtract(y_temp, y0_f)), 1) w_c = topi.expand_dims( topi.multiply(topi.subtract(x_temp, x0_f), topi.subtract(y1_f, y_temp)), 1) w_d = topi.expand_dims( topi.multiply(topi.subtract(x_temp, x0_f), topi.subtract(y_temp, y0_f)), 1) output = topi.add( topi.add( topi.add(topi.multiply(w_a, i_a), topi.multiply(w_b, i_b)), topi.multiply(w_c, i_c)), topi.multiply(w_d, i_d)) return output