Skip to content

Commit

Permalink
adressing issue dotnet#1798 for the Image Analytics project.
Browse files Browse the repository at this point in the history
  • Loading branch information
sfilipi committed Feb 1, 2019
1 parent d4f034b commit 958d05a
Show file tree
Hide file tree
Showing 10 changed files with 499 additions and 434 deletions.
20 changes: 10 additions & 10 deletions src/Microsoft.ML.ImageAnalytics/EntryPoints/ImageAnalytics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ internal static class ImageAnalytics
{
[TlcModule.EntryPoint(Name = "Transforms.ImageLoader", Desc = ImageLoaderTransformer.Summary,
UserName = ImageLoaderTransformer.UserName, ShortName = ImageLoaderTransformer.LoaderSignature)]
public static CommonOutputs.TransformOutput ImageLoader(IHostEnvironment env, ImageLoaderTransformer.Arguments input)
public static CommonOutputs.TransformOutput ImageLoader(IHostEnvironment env, ImageLoaderTransformer.Options input)
{
var h = EntryPointUtils.CheckArgsAndCreateHost(env, "ImageLoaderTransform", input);
var xf = ImageLoaderTransformer.Create(h, input, input.Data);
Expand All @@ -24,25 +24,25 @@ public static CommonOutputs.TransformOutput ImageLoader(IHostEnvironment env, Im
};
}

[TlcModule.EntryPoint(Name = "Transforms.ImageResizer", Desc = ImageResizerTransformer.Summary,
UserName = ImageResizerTransformer.UserName, ShortName = ImageResizerTransformer.LoaderSignature)]
public static CommonOutputs.TransformOutput ImageResizer(IHostEnvironment env, ImageResizerTransformer.Arguments input)
[TlcModule.EntryPoint(Name = "Transforms.ImageResizer", Desc = ImageResizingTransformer.Summary,
UserName = ImageResizingTransformer.UserName, ShortName = ImageResizingTransformer.LoaderSignature)]
public static CommonOutputs.TransformOutput ImageResizer(IHostEnvironment env, ImageResizingTransformer.Arguments input)
{
var h = EntryPointUtils.CheckArgsAndCreateHost(env, "ImageResizerTransform", input);
var xf = ImageResizerTransformer.Create(h, input, input.Data);
var xf = ImageResizingTransformer.Create(h, input, input.Data);
return new CommonOutputs.TransformOutput()
{
Model = new TransformModelImpl(h, xf, input.Data),
OutputData = xf
};
}

[TlcModule.EntryPoint(Name = "Transforms.ImagePixelExtractor", Desc = ImagePixelExtractorTransformer.Summary,
UserName = ImagePixelExtractorTransformer.UserName, ShortName = ImagePixelExtractorTransformer.LoaderSignature)]
public static CommonOutputs.TransformOutput ImagePixelExtractor(IHostEnvironment env, ImagePixelExtractorTransformer.Arguments input)
[TlcModule.EntryPoint(Name = "Transforms.ImagePixelExtractor", Desc = ImagePixelExtractingTransformer.Summary,
UserName = ImagePixelExtractingTransformer.UserName, ShortName = ImagePixelExtractingTransformer.LoaderSignature)]
public static CommonOutputs.TransformOutput ImagePixelExtractor(IHostEnvironment env, ImagePixelExtractingTransformer.Options input)
{
var h = EntryPointUtils.CheckArgsAndCreateHost(env, "ImagePixelExtractorTransform", input);
var xf = ImagePixelExtractorTransformer.Create(h, input, input.Data);
var xf = ImagePixelExtractingTransformer.Create(h, input, input.Data);
return new CommonOutputs.TransformOutput()
{
Model = new TransformModelImpl(h, xf, input.Data),
Expand All @@ -52,7 +52,7 @@ public static CommonOutputs.TransformOutput ImagePixelExtractor(IHostEnvironment

[TlcModule.EntryPoint(Name = "Transforms.ImageGrayscale", Desc = ImageGrayscaleTransformer.Summary,
UserName = ImageGrayscaleTransformer.UserName, ShortName = ImageGrayscaleTransformer.LoaderSignature)]
public static CommonOutputs.TransformOutput ImageGrayscale(IHostEnvironment env, ImageGrayscaleTransformer.Arguments input)
public static CommonOutputs.TransformOutput ImageGrayscale(IHostEnvironment env, ImageGrayscaleTransformer.Options input)
{
var h = EntryPointUtils.CheckArgsAndCreateHost(env, "ImageGrayscaleTransform", input);
var xf = ImageGrayscaleTransformer.Create(h, input, input.Data);
Expand Down
35 changes: 20 additions & 15 deletions src/Microsoft.ML.ImageAnalytics/ExtensionsCatalog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,14 @@ public static ImageLoadingEstimator LoadImages(this TransformsCatalog catalog, s
=> new ImageLoadingEstimator(CatalogUtils.GetEnvironment(catalog), imageFolder, columnPairs);

/// <include file='doc.xml' path='doc/members/member[@name="ImagePixelExtractingEstimator"]/*' />
/// <param name="catalog">The transform's catalog.</param>
/// <param name="outputColumnName">Name of the column resulting from the transformation of <paramref name="inputColumnName"/>.</param>
/// <param name="inputColumnName">Name of column to transform. If set to <see langword="null"/>, the value of the <paramref name="outputColumnName"/> will be used as source.</param>
/// <param name="colors">The color schema as defined in <see cref="ImagePixelExtractorTransformer.ColorBits"/>.</param>
/// <param name="interleave"></param>
/// <param name="catalog"> The transform's catalog.</param>
/// <param name="outputColumnName"> Name of the column resulting from the transformation of <paramref name="inputColumnName"/>.</param>
/// <param name="inputColumnName"> Name of column to transform. If set to <see langword="null"/>, the value of the <paramref name="outputColumnName"/> will be used as source.</param>
/// <param name="colors">The color schema as defined in <see cref="ImagePixelExtractingEstimator.ColorBits"/>.</param>
/// <param name="interleave">Wheather to interleave the pixels, meaning keep them in the `ARGB ARGB` order, or leave them separated in the plannar form.</param>
/// <param name="scale">Scale color pixel value by this amount.</param>
/// <param name="offset">Offset color pixel value by this amount.</param>
/// <param name="asFloat">Output the array as float array. If false, output as byte array.</param>
/// <example>
/// <format type="text/markdown">
/// <![CDATA[
Expand All @@ -49,9 +52,11 @@ public static ImageLoadingEstimator LoadImages(this TransformsCatalog catalog, s
public static ImagePixelExtractingEstimator ExtractPixels(this TransformsCatalog catalog,
string outputColumnName,
string inputColumnName = null,
ImagePixelExtractorTransformer.ColorBits colors = ImagePixelExtractorTransformer.ColorBits.Rgb,
bool interleave = false)
=> new ImagePixelExtractingEstimator(CatalogUtils.GetEnvironment(catalog), outputColumnName, inputColumnName, colors, interleave);
ImagePixelExtractingEstimator.ColorBits colors = ImagePixelExtractingEstimator.ColorBits.Rgb,
bool interleave = false, float scale = ImagePixelExtractingTransformer.Defaults.Scale,
float offset = ImagePixelExtractingTransformer.Defaults.Offset,
bool asFloat = ImagePixelExtractingTransformer.Defaults.Convert)
=> new ImagePixelExtractingEstimator(CatalogUtils.GetEnvironment(catalog), outputColumnName, inputColumnName, colors, interleave, scale, offset, asFloat);

/// <include file='doc.xml' path='doc/members/member[@name="ImagePixelExtractingEstimator"]/*' />
/// <param name="catalog">The transform's catalog.</param>
Expand All @@ -62,7 +67,7 @@ public static ImagePixelExtractingEstimator ExtractPixels(this TransformsCatalog
/// [!code-csharp[ConvertToGrayscale](~/../docs/samples/docs/samples/Microsoft.ML.Samples/Dynamic/ImageAnalytics/ExtractPixels.cs)]
/// ]]></format>
/// </example>
public static ImagePixelExtractingEstimator ExtractPixels(this TransformsCatalog catalog, params ImagePixelExtractorTransformer.ColumnInfo[] columns)
public static ImagePixelExtractingEstimator ExtractPixels(this TransformsCatalog catalog, params ImagePixelExtractingEstimator.ColumnInfo[] columns)
=> new ImagePixelExtractingEstimator(CatalogUtils.GetEnvironment(catalog), columns);

/// <summary>
Expand All @@ -82,8 +87,8 @@ public static ImagePixelExtractingEstimator ExtractPixels(this TransformsCatalog
/// <param name="outputColumnName">Name of the resulting output column.</param>
/// <param name="imageWidth">The transformed image width.</param>
/// <param name="imageHeight">The transformed image height.</param>
/// <param name="resizing"> The type of image resizing as specified in <see cref="ImageResizerTransformer.ResizingKind"/>.</param>
/// <param name="cropAnchor">Where to place the anchor, to start cropping. Options defined in <see cref="ImageResizerTransformer.Anchor"/></param>
/// <param name="resizing"> The type of image resizing as specified in <see cref="ImageResizingEstimator.ResizingKind"/>.</param>
/// <param name="cropAnchor">Where to place the anchor, to start cropping. Options defined in <see cref="ImageResizingEstimator.Anchor"/></param>
/// <example>
/// <format type="text/markdown">
/// <![CDATA[
Expand All @@ -95,8 +100,8 @@ public static ImageResizingEstimator Resize(this TransformsCatalog catalog,
int imageWidth,
int imageHeight,
string inputColumnName = null,
ImageResizerTransformer.ResizingKind resizing = ImageResizerTransformer.ResizingKind.IsoCrop,
ImageResizerTransformer.Anchor cropAnchor = ImageResizerTransformer.Anchor.Center)
ImageResizingEstimator.ResizingKind resizing = ImageResizingEstimator.ResizingKind.IsoCrop,
ImageResizingEstimator.Anchor cropAnchor = ImageResizingEstimator.Anchor.Center)
=> new ImageResizingEstimator(CatalogUtils.GetEnvironment(catalog), outputColumnName, imageWidth, imageHeight, inputColumnName, resizing, cropAnchor);

/// <summary>
Expand All @@ -108,7 +113,7 @@ public static ImageResizingEstimator Resize(this TransformsCatalog catalog,
/// Those pre-trained models have a defined width and height for their input images, so often, after getting loaded, the images will need to get resized before
/// further processing.
/// The new width and height, as well as other properties of resizing, like type of scaling (uniform, or non-uniform), and whether to pad the image,
/// or just crop it can be specidied separately for each column loaded, through the <see cref="ImageResizerTransformer.ColumnInfo"/>.
/// or just crop it can be specidied separately for each column loaded, through the <see cref="ImageResizingEstimator.ColumnInfo"/>.
/// <seealso cref = "ImageEstimatorsCatalog" />
/// <seealso cref= "ImageLoadingEstimator" />
/// </remarks >
Expand All @@ -120,7 +125,7 @@ public static ImageResizingEstimator Resize(this TransformsCatalog catalog,
/// [!code-csharp[ConvertToGrayscale](~/../docs/samples/docs/samples/Microsoft.ML.Samples/Dynamic/ImageAnalytics/ResizeImage.cs)]
/// ]]></format>
/// </example>
public static ImageResizingEstimator Resize(this TransformsCatalog catalog, params ImageResizerTransformer.ColumnInfo[] columns)
public static ImageResizingEstimator Resize(this TransformsCatalog catalog, params ImageResizingEstimator.ColumnInfo[] columns)
=> new ImageResizingEstimator(CatalogUtils.GetEnvironment(catalog), columns);
}
}
10 changes: 5 additions & 5 deletions src/Microsoft.ML.ImageAnalytics/ImageGrayscaleTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
using Microsoft.ML.Internal.Utilities;
using Microsoft.ML.Model;

[assembly: LoadableClass(ImageGrayscaleTransformer.Summary, typeof(IDataTransform), typeof(ImageGrayscaleTransformer), typeof(ImageGrayscaleTransformer.Arguments), typeof(SignatureDataTransform),
[assembly: LoadableClass(ImageGrayscaleTransformer.Summary, typeof(IDataTransform), typeof(ImageGrayscaleTransformer), typeof(ImageGrayscaleTransformer.Options), typeof(SignatureDataTransform),
ImageGrayscaleTransformer.UserName, "ImageGrayscaleTransform", "ImageGrayscale")]

[assembly: LoadableClass(ImageGrayscaleTransformer.Summary, typeof(IDataTransform), typeof(ImageGrayscaleTransformer), null, typeof(SignatureLoadDataTransform),
Expand All @@ -37,7 +37,7 @@ namespace Microsoft.ML.ImageAnalytics
/// <include file='doc.xml' path='doc/members/member[@name="ImageGrayscalingEstimator"]/*' />
public sealed class ImageGrayscaleTransformer : OneToOneTransformerBase
{
public sealed class Column : OneToOneColumn
internal sealed class Column : OneToOneColumn
{
internal static Column Parse(string str)
{
Expand All @@ -54,7 +54,7 @@ internal bool TryUnparse(StringBuilder sb)
}
}

public class Arguments : TransformInputBase
internal class Options : TransformInputBase
{
[Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)", ShortName = "col", SortOrder = 1)]
public Column[] Column;
Expand Down Expand Up @@ -86,13 +86,13 @@ private static VersionInfo GetVersionInfo()
/// <param name="env">The estimator's local <see cref="IHostEnvironment"/>.</param>
/// <param name="columns">The name of the columns containing the image paths(first item of the tuple), and the name of the resulting output column (second item of the tuple).</param>

public ImageGrayscaleTransformer(IHostEnvironment env, params (string outputColumnName, string inputColumnName)[] columns)
internal ImageGrayscaleTransformer(IHostEnvironment env, params (string outputColumnName, string inputColumnName)[] columns)
: base(Contracts.CheckRef(env, nameof(env)).Register(RegistrationName), columns)
{
}

// Factory method for SignatureDataTransform.
internal static IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input)
internal static IDataTransform Create(IHostEnvironment env, Options args, IDataView input)
{
Contracts.CheckValue(env, nameof(env));
env.CheckValue(args, nameof(args));
Expand Down
18 changes: 8 additions & 10 deletions src/Microsoft.ML.ImageAnalytics/ImageLoaderTransform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
using Microsoft.ML.Internal.Utilities;
using Microsoft.ML.Model;

[assembly: LoadableClass(ImageLoaderTransformer.Summary, typeof(IDataTransform), typeof(ImageLoaderTransformer), typeof(ImageLoaderTransformer.Arguments), typeof(SignatureDataTransform),
[assembly: LoadableClass(ImageLoaderTransformer.Summary, typeof(IDataTransform), typeof(ImageLoaderTransformer), typeof(ImageLoaderTransformer.Options), typeof(SignatureDataTransform),
ImageLoaderTransformer.UserName, "ImageLoaderTransform", "ImageLoader")]

[assembly: LoadableClass(ImageLoaderTransformer.Summary, typeof(IDataTransform), typeof(ImageLoaderTransformer), null, typeof(SignatureLoadDataTransform),
Expand All @@ -30,12 +30,10 @@

namespace Microsoft.ML.ImageAnalytics
{
/// <summary>
/// Transform which takes one or many columns of type ReadOnlyMemory and loads them as <see cref="ImageType"/>
/// </summary>
/// <include file='doc.xml' path='doc/members/member[@name="ImageLoadingEstimator"]/*' />
public sealed class ImageLoaderTransformer : OneToOneTransformerBase
{
public sealed class Column : OneToOneColumn
internal sealed class Column : OneToOneColumn
{
internal static Column Parse(string str)
{
Expand All @@ -54,7 +52,7 @@ internal bool TryUnparse(StringBuilder sb)
}
}

public sealed class Arguments : TransformInputBase
internal sealed class Options : TransformInputBase
{
[Argument(ArgumentType.Multiple | ArgumentType.Required, HelpText = "New column definition(s) (optional form: name:src)",
ShortName = "col", SortOrder = 1)]
Expand All @@ -78,14 +76,14 @@ public sealed class Arguments : TransformInputBase
/// <param name="env">The host environment.</param>
/// <param name="imageFolder">Folder where to look for images.</param>
/// <param name="columns">Names of input and output columns.</param>
public ImageLoaderTransformer(IHostEnvironment env, string imageFolder = null, params (string outputColumnName, string inputColumnName)[] columns)
internal ImageLoaderTransformer(IHostEnvironment env, string imageFolder = null, params (string outputColumnName, string inputColumnName)[] columns)
: base(Contracts.CheckRef(env, nameof(env)).Register(nameof(ImageLoaderTransformer)), columns)
{
ImageFolder = imageFolder;
}

// Factory method for SignatureDataTransform.
internal static IDataTransform Create(IHostEnvironment env, Arguments args, IDataView data)
internal static IDataTransform Create(IHostEnvironment env, Options args, IDataView data)
{
return new ImageLoaderTransformer(env, args.ImageFolder, args.Column.Select(x => (x.Name, x.Source ?? x.Name)).ToArray())
.MakeDataTransform(data);
Expand Down Expand Up @@ -228,12 +226,12 @@ public sealed class ImageLoadingEstimator : TrivialEstimator<ImageLoaderTransfor
/// <param name="env">The host environment.</param>
/// <param name="imageFolder">Folder where to look for images.</param>
/// <param name="columns">Names of input and output columns.</param>
public ImageLoadingEstimator(IHostEnvironment env, string imageFolder, params (string outputColumnName, string inputColumnName)[] columns)
internal ImageLoadingEstimator(IHostEnvironment env, string imageFolder, params (string outputColumnName, string inputColumnName)[] columns)
: this(env, new ImageLoaderTransformer(env, imageFolder, columns))
{
}

private ImageLoadingEstimator(IHostEnvironment env, ImageLoaderTransformer transformer)
internal ImageLoadingEstimator(IHostEnvironment env, ImageLoaderTransformer transformer)
: base(Contracts.CheckRef(env, nameof(env)).Register(nameof(ImageLoadingEstimator)), transformer)
{
_imageType = new ImageType();
Expand Down
Loading

0 comments on commit 958d05a

Please sign in to comment.