Skip to content

[ImageClassification Transfer Learning] Simplify/Hide steps and hyper-parameters in new ImageClassification - Transfer Learning  #4087

Closed
@CESARDELATORRE

Description

@CESARDELATORRE

Since the new (early preview) 'ImageClassification - Transfer Learning' is aimed to provide a high-level API per scenario (image classifciation in this case), we should simplify the API even further.

Here's an example of a current training pipeline:

 var pipeline = mlContext.Transforms.Conversion.MapValueToKey("Label")
                    .Append(mlContext.Transforms.LoadImages("ImageObject", null,
                        "ImagePath"))
                    .Append(mlContext.Transforms.ResizeImages("Image",
                        inputColumnName: "ImageObject", imageWidth: 299,
                        imageHeight: 299))
                    .Append(mlContext.Transforms.ExtractPixels("Image",
                        interleavePixelColors: true))
                    .Append(mlContext.Model.ImageClassification("Image",
                        "Label", arch: DnnEstimator.Architecture.InceptionV3, 
                        epoch: 1, //an epoch is one learning cycle where the learner sees the whole training data set.
                        batchSize: 20));  // batchSize sets then number of images to feed the model at a time

Good points to simplify are image transformations and "technical" hyper-paramenters:

1. Hide image re-size step: Since the image size is determined by the internal DNN model (TensorFlow model, currently) why don't we simply do it within the ImageClassification code?

2. Hide extract pixels step: Same thing here. The extract pixels step should be hidden as part of the ImageClassification code. This is surfacing too much details. I expect the interleavePixelColors could also be determined by the info in the TF model .pb file, ot in the worst case based on the Architecture metadata that we could have per architecture (InceptionV3, etc.).

3. Hide EPOCH and BATCHSIZE: These are also configuration details that, even when they currently have "by default values" (epoch=10 and batchSize=20), those values are not valid for any imageset and architecture and should vary depending on the specific image-set size and chosen architecture. I'd be good to have them initialized dynamically within the ImageClassification code depending on the context instead of "fixed default values" and parameters that surface to the user who might not know what is an EPOCH or BATCH.

After simplifying the above points, the example code could look like the following, which looks a lot simpler and clean: :)

 var pipeline = mlContext.Transforms.Conversion.MapValueToKey("Label")
                    .Append(mlContext.Transforms.LoadImages("ImageObject", null, "ImagePath"))
                    .Append(mlContext.Model.ImageClassification("ImageObject", "Label", arch: DnnEstimator.Architecture.InceptionV3));  

Even the architecture should also be simplified and maybe letting the user select per type of images to be trained, such as: Photos vs. Numbers/Digits vs. other characteristics that make one or the other architecture advisable to be used. A regular .NET developer usually won't know if he/she should use InceptionV3 vs. ResnetV2101, etc.

Activity

time888

time888 commented on Aug 11, 2019

@time888

I tested. DnnEstimator.Architecture.InceptionV3
DrawString "0" to Graphics Save to file 0.gif, and The other is the same 1.gif,2.gif,3.gif .

    public static IEnumerable<ImageNetDigData> LoadImagesFromDirectory(string folder)
    {
        var files = Directory.GetFiles(folder, "*.gif",
searchOption: SearchOption.TopDirectoryOnly);
        foreach (var file in files)
        {
           //0.gif,1.gif,2.gif.3.gif      a0.gif,a1.gif, x1.gif,x2.gif
            var name = Path.GetFileName(file).Split(new char[] { '.' })[0];
            var label = name.Substring(name.Length - 1, 1);

            var nd = new ImageNetDigData()
            {
                ImagePath = file,
                Label = label
            };
            yield return nd;
        }
    }

But classification incorrect。
How to configure parameters?
Give me a sample.

time888

time888 commented on Aug 11, 2019

@time888

The tensorflow_inception_graph.pb classification correct。

        var 学习管道 = M.Transforms.LoadImages(outputColumnName: "input", imageFolder: 培训图片夹, inputColumnName: nameof(ImageNetNumData.ImagePath))
            .Append(M.Transforms.ResizeImages(outputColumnName: "input", imageWidth: 配置.宽, imageHeight: 配置.高, inputColumnName: "input",resizing:Microsoft.ML.Transforms.Image.ImageResizingEstimator.ResizingKind.Fill))
            .Append(M.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: 配置.channelsLast, offsetImage: 配置.平均值))
            .Append(M.Model.LoadTensorFlowModel(迁移原型).
                 ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2_pre_activation" }, inputColumnNames: new[] { "input" }, addBatchDimensionInput: true))
            .Append(M.Regression.Trainers.LbfgsPoissonRegression(labelColumnName: "Label", featureColumnName: "softmax2_pre_activation"));
added
P2Priority of the issue for triage purpose: Needs to be fixed at some point.
on Aug 20, 2019
antoniovs1029

antoniovs1029 commented on Jan 9, 2020

@antoniovs1029
Member

Seems this was closed in #4151

ghost locked as resolved and limited conversation to collaborators on Mar 20, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

P2Priority of the issue for triage purpose: Needs to be fixed at some point.enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @codemzs@CESARDELATORRE@ganik@time888@antoniovs1029

      Issue actions

        [ImageClassification Transfer Learning] Simplify/Hide steps and hyper-parameters in new ImageClassification - Transfer Learning · Issue #4087 · dotnet/machinelearning