From 22a2107d3e796781f8ffe26a7b062cdeb1f14d4a Mon Sep 17 00:00:00 2001 From: Mustafa Bal Date: Thu, 26 Mar 2020 12:43:50 -0700 Subject: [PATCH 1/3] The provided imageFolder path may be null or empty --- src/Microsoft.ML.ImageAnalytics/ImageLoader.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.ML.ImageAnalytics/ImageLoader.cs b/src/Microsoft.ML.ImageAnalytics/ImageLoader.cs index 167996990c..07ecbb37be 100644 --- a/src/Microsoft.ML.ImageAnalytics/ImageLoader.cs +++ b/src/Microsoft.ML.ImageAnalytics/ImageLoader.cs @@ -103,14 +103,16 @@ internal ImageLoadingTransformer(IHostEnvironment env, string imageFolder = null internal ImageLoadingTransformer(IHostEnvironment env, string imageFolder = null, bool type = true, params (string outputColumnName, string inputColumnName)[] columns) : base(Contracts.CheckRef(env, nameof(env)).Register(nameof(ImageLoadingTransformer)), columns) { - // Throws ArgumentException if given imageFolder path is invalid or empty. Note: imageFolder may be null in this case. - if (imageFolder != null) + // Throws ArgumentException if given imageFolder path is invalid. Note: imageFolder may be null or empty in this case. + if (String.IsNullOrEmpty(imageFolder)) + ImageFolder = null; + else + { if (Directory.Exists(imageFolder)) ImageFolder = Path.GetFullPath(imageFolder); else throw new ArgumentException(String.Format("Directory \"{0}\" does not exist.", imageFolder)); - else - ImageFolder = null; + } _useImageType = type; } From e2cb6b51b827e98ac04cd7e3a9ef4487790b324c Mon Sep 17 00:00:00 2001 From: Mustafa Bal Date: Thu, 26 Mar 2020 13:37:19 -0700 Subject: [PATCH 2/3] Added unit test for loading images with incorrect, empty, null, and correct imageFolder paths --- test/Microsoft.ML.Tests/ImagesTests.cs | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/Microsoft.ML.Tests/ImagesTests.cs b/test/Microsoft.ML.Tests/ImagesTests.cs index 874e67727c..30a8b0d811 100644 --- a/test/Microsoft.ML.Tests/ImagesTests.cs +++ b/test/Microsoft.ML.Tests/ImagesTests.cs @@ -98,6 +98,38 @@ public void TestEstimatorSaveLoad() Done(); } + [Fact] + public void TestLoadImages() + { + var env = new MLContext(1); + var dataFile = GetDataPath("images/images.tsv"); + var correctImageFolder = Path.GetDirectoryName(dataFile); + var data = TextLoader.Create(env, new TextLoader.Options() + { + Columns = new[] + { + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } + }, new MultiFileSource(dataFile)); + + // Testing for invalid imageFolder path, should throw an ArgumentException + var incorrectImageFolder = correctImageFolder + "-nonExistantDirectory"; + Assert.Throws(() => new ImageLoadingTransformer(env, incorrectImageFolder, ("ImageReal", "ImagePath")).Transform(data)); + + // Testing for empty imageFolder path, should not throw an exception + var emptyImageFolder = String.Empty; + var imagesEmptyImageFolder = new ImageLoadingTransformer(env, emptyImageFolder, ("ImageReal", "ImagePath")).Transform(data); + + // Testing for null imageFolder path, should not throw an exception + var imagesNullImageFolder = new ImageLoadingTransformer(env, null, ("ImageReal", "ImagePath")).Transform(data); + + // Testing for correct imageFolder path, should not throw an exception + var imagesCorrectImageFolder = new ImageLoadingTransformer(env, correctImageFolder, ("ImageReal", "ImagePath")).Transform(data); + + Done(); + } + [Fact] public void TestSaveImages() { From b54bfd178b9580ee53becfa1985af4346493cd65 Mon Sep 17 00:00:00 2001 From: Mustafa Bal Date: Thu, 26 Mar 2020 16:47:43 -0700 Subject: [PATCH 3/3] align brackets and spacings throuout document --- test/Microsoft.ML.Tests/ImagesTests.cs | 86 +++++++++++++------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/test/Microsoft.ML.Tests/ImagesTests.cs b/test/Microsoft.ML.Tests/ImagesTests.cs index 30a8b0d811..7ab0035dc2 100644 --- a/test/Microsoft.ML.Tests/ImagesTests.cs +++ b/test/Microsoft.ML.Tests/ImagesTests.cs @@ -33,16 +33,16 @@ public void TestEstimatorChain() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var invalidData = TextLoader.Create(env, new TextLoader.Options() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.Single, 0), - } + new TextLoader.Column("ImagePath", DataKind.Single, 0), + } }, new MultiFileSource(dataFile)); var pipe = new ImageLoadingEstimator(env, imageFolder, ("ImageReal", "ImagePath")) @@ -64,9 +64,9 @@ public void TestEstimatorSaveLoad() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var pipe = new ImageLoadingEstimator(env, imageFolder, ("ImageReal", "ImagePath")) @@ -108,9 +108,9 @@ public void TestLoadImages() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); // Testing for invalid imageFolder path, should throw an ArgumentException @@ -140,9 +140,9 @@ public void TestSaveImages() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", 100, 100, "ImageReal", ImageResizingEstimator.ResizingKind.IsoPad).Transform(images); @@ -177,9 +177,9 @@ public void TestGreyscaleTransformImages() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); @@ -311,9 +311,9 @@ public void TestBackAndForthConversionWithAlphaInterleave() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -368,9 +368,9 @@ public void TestBackAndForthConversionWithoutAlphaInterleave() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -425,9 +425,9 @@ public void TestBackAndForthConversionWithDifferentOrder() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -484,9 +484,9 @@ public void TestBackAndForthConversionWithAlphaNoInterleave() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -541,9 +541,9 @@ public void TestBackAndForthConversionWithoutAlphaNoInterleave() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -598,9 +598,9 @@ public void TestBackAndForthConversionWithAlphaInterleaveNoOffset() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -656,9 +656,9 @@ public void TestBackAndForthConversionWithoutAlphaInterleaveNoOffset() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -713,9 +713,9 @@ public void TestBackAndForthConversionWithAlphaNoInterleaveNoOffset() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), - } + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), + } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data); var cropped = new ImageResizingTransformer(env, "ImageCropped", imageWidth, imageHeight, "ImageReal").Transform(images); @@ -771,8 +771,8 @@ public void TestBackAndForthConversionWithoutAlphaNoInterleaveNoOffset() { Columns = new[] { - new TextLoader.Column("ImagePath", DataKind.String, 0), - new TextLoader.Column("Name", DataKind.String, 1), + new TextLoader.Column("ImagePath", DataKind.String, 0), + new TextLoader.Column("Name", DataKind.String, 1), } }, new MultiFileSource(dataFile)); var images = new ImageLoadingTransformer(env, imageFolder, ("ImageReal", "ImagePath")).Transform(data);