@@ -203,8 +203,8 @@ namespace Tensorflow | |||
=> image_ops_impl.non_max_suppression_padded(boxes, scores, max_output_size, iou_threshold, score_threshold, pad_to_max_output_size, | |||
name, sorted_input, canonicalized_coordinates, tile_size); | |||
public Tensor resize_bilinear(Tensor images, Tensor size, bool align_corners = false, string name = null) | |||
=> gen_image_ops.resize_bilinear(images, size, align_corners: align_corners, name: name); | |||
public Tensor resize_bilinear(Tensor images, Tensor size, bool align_corners = false, bool half_pixel_centers = false, string name = null) | |||
=> gen_image_ops.resize_bilinear(images, size, align_corners: align_corners, half_pixel_centers: half_pixel_centers, name: name); | |||
public Tensor resize_images(Tensor images, Tensor size, string method = ResizeMethod.BILINEAR, | |||
bool preserve_aspect_ratio = false, string name = null) | |||
@@ -155,11 +155,21 @@ namespace Tensorflow | |||
} | |||
} | |||
public static Tensor resize_bilinear(Tensor images, Tensor size, bool align_corners = false, string name = null) | |||
public static Tensor resize_bilinear(Tensor images, | |||
Tensor size, | |||
bool align_corners = false, | |||
bool half_pixel_centers = false, | |||
string name = null) | |||
{ | |||
if (tf.Context.executing_eagerly()) | |||
{ | |||
throw new NotImplementedException("resize_bilinear"); | |||
var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||
"ResizeBilinear", name, | |||
null, | |||
images, size, | |||
"align_corners", align_corners, | |||
"half_pixel_centers", half_pixel_centers); | |||
return results[0]; | |||
} | |||
else | |||
{ | |||
@@ -64,8 +64,8 @@ namespace Tensorflow | |||
var num_t = t.TensorShape.num_elements(); | |||
if (num_t == shape.num_elements()) | |||
throw new NotImplementedException(""); | |||
if(num_t == 1) | |||
return _eager_reshape(t, shape, tf.Context); | |||
if (num_t == 1) | |||
{ | |||
if (t.dtype == dtypes.@bool) | |||
throw new NotImplementedException(""); | |||
@@ -100,6 +100,16 @@ namespace Tensorflow | |||
return op.outputs[0]; | |||
} | |||
private static Tensor _eager_reshape(EagerTensor tensor, int[] shape, Context ctx) | |||
{ | |||
var attr_t = tensor.dtype.as_datatype_enum(); | |||
var dims_t = convert_to_eager_tensor(shape, ctx, dtypes.int32); | |||
var inputs_flat = new[] { tensor, dims_t }; | |||
var attrs = new object[] { "T", attr_t, "Tshape", TF_DataType.TF_INT32 }; | |||
var result = tf.Runner.Execute(ctx, "Reshape", 1, inputs_flat, attrs); | |||
return result[0]; | |||
} | |||
private static Tensor _eager_fill(int[] dims, EagerTensor value, Context ctx) | |||
{ | |||
var attr_t = value.dtype.as_datatype_enum(); | |||
@@ -280,36 +280,25 @@ namespace TensorFlowNET.UnitTest.NativeAPI | |||
[TestMethod] | |||
public unsafe void tensor_resize() | |||
{ | |||
tf.enable_eager_execution(); | |||
var imageArray = new float[256 * 256 * 3]; | |||
using var newSize = tf.convert_to_tensor(new int[] { 100, 100 }); | |||
using (var t = new Tensor(imageArray, new long[] { 1, 256, 256, 3 }, tf.float32)) | |||
using (var t = tf.constant(imageArray, tf.float32, (1, 256, 256, 3))) | |||
{ | |||
Assert.IsFalse(t.IsDisposed); | |||
Assert.AreEqual(256 * 256 * 3 * sizeof(float), (int)t.bytesize); | |||
using var resized = tf.image.resize_bilinear(t, newSize); | |||
EXPECT_EQ((int)resized.shape[0], 1); | |||
EXPECT_EQ((int)resized.shape[1], 100); | |||
EXPECT_EQ((int)resized.shape[2], 100); | |||
EXPECT_EQ((int)resized.shape[3], 3); | |||
EXPECT_EQ(resized.shape[0], 1); | |||
EXPECT_EQ(resized.shape[1], 100); | |||
EXPECT_EQ(resized.shape[2], 100); | |||
EXPECT_EQ(resized.shape[3], 3); | |||
} | |||
fixed (float* ptr = &imageArray[0]) | |||
{ | |||
using (var t = new Tensor((IntPtr)ptr, new long[] { imageArray.Length }, tf.float32, 4 * imageArray.Length)) | |||
{ | |||
Assert.IsFalse(t.IsDisposed); | |||
Assert.AreEqual(256 * 256 * 3 * sizeof(float), (int)t.bytesize); | |||
using var resized = tf.image.resize_bilinear(t, newSize); | |||
EXPECT_EQ((int)resized.shape[0], 1); | |||
EXPECT_EQ((int)resized.shape[1], 100); | |||
EXPECT_EQ((int)resized.shape[2], 100); | |||
EXPECT_EQ((int)resized.shape[3], 3); | |||
} | |||
} | |||
tf.compat.v1.disable_eager_execution(); | |||
} | |||
} | |||
} |