| @@ -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, | => 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); | 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, | public Tensor resize_images(Tensor images, Tensor size, string method = ResizeMethod.BILINEAR, | ||||
| bool preserve_aspect_ratio = false, string name = null) | 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()) | 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 | else | ||||
| { | { | ||||
| @@ -64,8 +64,8 @@ namespace Tensorflow | |||||
| var num_t = t.TensorShape.num_elements(); | var num_t = t.TensorShape.num_elements(); | ||||
| if (num_t == shape.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) | if (t.dtype == dtypes.@bool) | ||||
| throw new NotImplementedException(""); | throw new NotImplementedException(""); | ||||
| @@ -100,6 +100,16 @@ namespace Tensorflow | |||||
| return op.outputs[0]; | 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) | private static Tensor _eager_fill(int[] dims, EagerTensor value, Context ctx) | ||||
| { | { | ||||
| var attr_t = value.dtype.as_datatype_enum(); | var attr_t = value.dtype.as_datatype_enum(); | ||||
| @@ -280,36 +280,25 @@ namespace TensorFlowNET.UnitTest.NativeAPI | |||||
| [TestMethod] | [TestMethod] | ||||
| public unsafe void tensor_resize() | public unsafe void tensor_resize() | ||||
| { | { | ||||
| tf.enable_eager_execution(); | |||||
| var imageArray = new float[256 * 256 * 3]; | var imageArray = new float[256 * 256 * 3]; | ||||
| using var newSize = tf.convert_to_tensor(new int[] { 100, 100 }); | 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.IsFalse(t.IsDisposed); | ||||
| Assert.AreEqual(256 * 256 * 3 * sizeof(float), (int)t.bytesize); | Assert.AreEqual(256 * 256 * 3 * sizeof(float), (int)t.bytesize); | ||||
| using var resized = tf.image.resize_bilinear(t, newSize); | 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(); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||