Skip to content

Add a DNN Image Featurizer Transform Estimator #1447

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 56 commits into from
Nov 27, 2018
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
bc71575
Skeleton for implementing with a new tranformer
vaeksare Oct 26, 2018
32dc90c
Approach using a chain of transformers
vaeksare Oct 26, 2018
38fecff
Reworked to use estimator chain
vaeksare Oct 26, 2018
5e1faa5
Add basic testing
vaeksare Oct 27, 2018
3c3aa2a
Reworked to use extension methods
vaeksare Oct 29, 2018
66b621e
Create more extensive tests
vaeksare Oct 30, 2018
87a5d51
Remove changes to onnx transform tests
vaeksare Oct 30, 2018
5bec174
Rework to use CDN approach
vaeksare Oct 31, 2018
8876f02
Add static extensions
vaeksare Oct 31, 2018
2630f7b
Added test for static pipeline
vaeksare Nov 1, 2018
4a38bf9
Updated to use correct CDN location
vaeksare Nov 2, 2018
75b1b0d
Added some minor comments
vaeksare Nov 2, 2018
271ae03
Use extension methods and set up the model download/nuget placement
vaeksare Nov 7, 2018
2e5ef2d
Change the proj to try to fix download
vaeksare Nov 7, 2018
85ca884
Fix the download in csproj
vaeksare Nov 7, 2018
b76deda
Models successfully download into correct folder
vaeksare Nov 7, 2018
259ac05
Include the onnx models in the nuget package
vaeksare Nov 7, 2018
d093d4b
Fix tests and add documentation
vaeksare Nov 8, 2018
30b9488
Fixed building breaking due to merge
vaeksare Nov 8, 2018
a3792d9
Update the estimator name to match new name
vaeksare Nov 8, 2018
9338464
Change model download location and update the corresponding doc
vaeksare Nov 9, 2018
1e7c7ae
Actually fixed the download location
vaeksare Nov 9, 2018
ec352d4
Address PR comments and add experimental test (not enabled yet)
vaeksare Nov 9, 2018
ee24322
Changed documentation style to use xml
vaeksare Nov 9, 2018
6c97453
Add test that checks output results
vaeksare Nov 9, 2018
24caec9
Address more comments
vaeksare Nov 9, 2018
3975134
Change param name to be more accurate
vaeksare Nov 9, 2018
bf25371
Added refs to documentation
vaeksare Nov 9, 2018
c72bcfe
Add one more ref
vaeksare Nov 9, 2018
2bb2163
Added all 4 different models
vaeksare Nov 10, 2018
4cdd1eb
Address comments
vaeksare Nov 10, 2018
af7a844
Address more comments
vaeksare Nov 10, 2018
0e2d617
More comment fixes
vaeksare Nov 10, 2018
e9e60b0
Address some of the comments
vaeksare Nov 12, 2018
326d8bf
Replace TLC links
vaeksare Nov 12, 2018
579ad6b
Rework download location
vaeksare Nov 12, 2018
368cd64
Change model download to new redist proj
vaeksare Nov 14, 2018
1d106bd
Add the models to content folder
vaeksare Nov 14, 2018
1bebc64
Address some comments
vaeksare Nov 21, 2018
22e385b
Merge remote-tracking branch 'upstream/master' into dnn-image-feat
vaeksare Nov 21, 2018
8f9e808
Revert "Merge remote-tracking branch 'upstream/master' into dnn-image…
vaeksare Nov 21, 2018
a1e571d
Merge remote-tracking branch 'upstream/master' into dnn-image-feat
vaeksare Nov 21, 2018
55b5b0f
updated libmf ref
vaeksare Nov 21, 2018
7405fce
Updated to fix issues related to OnnxTransform changes
vaeksare Nov 22, 2018
ce93709
Merge remote-tracking branch 'upstream/master' into dnn-image-feat
vaeksare Nov 22, 2018
02e8ebc
Update to new namespace
vaeksare Nov 22, 2018
c519a19
Address more comments
vaeksare Nov 26, 2018
a687ccb
Reorganize model downloading
vaeksare Nov 26, 2018
52a3e6a
Fix test downloading
vaeksare Nov 26, 2018
9f566a2
Removed model duplication in NuGets
vaeksare Nov 26, 2018
d33eb06
Updated targets location
vaeksare Nov 26, 2018
3e4db44
Fixed issues with target content inclusion
vaeksare Nov 26, 2018
5fbd41d
Change targets file to be consistent
vaeksare Nov 27, 2018
bdc9f60
Fix bug due to targets
vaeksare Nov 27, 2018
8effaf9
Simplify model copy in tests
vaeksare Nov 27, 2018
b27ebe2
Address minor comment
vaeksare Nov 27, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions Microsoft.ML.sln
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.SamplesUtils",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.Recommender", "src\Microsoft.ML.Recommender\Microsoft.ML.Recommender.csproj", "{C8E1772B-DFD9-4A4D-830D-6AAB1C668BB3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.DnnImageFeaturizer.ResNet18", "src\Microsoft.ML.DnnImageFeaturizer.ResNet18\Microsoft.ML.DnnImageFeaturizer.ResNet18.csproj", "{9222FC9D-599A-49A5-B685-08CC9A5C81D7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.DnnImageFeaturizer.AlexNet", "src\Microsoft.ML.DnnImageFeaturizer.AlexNet\Microsoft.ML.DnnImageFeaturizer.AlexNet.csproj", "{6C29AA9B-054B-4762-BEA5-D305B932AA80}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.DnnImageFeaturizer.ResNet50", "src\Microsoft.ML.DnnImageFeaturizer.ResNet50\Microsoft.ML.DnnImageFeaturizer.ResNet50.csproj", "{4805129D-78C8-46D4-9519-0AD9B0574D6D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.ML.DnnImageFeaturizer.ResNet101", "src\Microsoft.ML.DnnImageFeaturizer.ResNet101\Microsoft.ML.DnnImageFeaturizer.ResNet101.csproj", "{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -511,6 +519,38 @@ Global
{C8E1772B-DFD9-4A4D-830D-6AAB1C668BB3}.Release|Any CPU.Build.0 = Release|Any CPU
Copy link
Member

@wschin wschin Nov 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not aligned? #Resolved

{C8E1772B-DFD9-4A4D-830D-6AAB1C668BB3}.Release-Intrinsics|Any CPU.ActiveCfg = Release-Intrinsics|Any CPU
{C8E1772B-DFD9-4A4D-830D-6AAB1C668BB3}.Release-Intrinsics|Any CPU.Build.0 = Release-Intrinsics|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug-Intrinsics|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Debug-Intrinsics|Any CPU.Build.0 = Debug-Intrinsics|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Release|Any CPU.Build.0 = Release|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Release-Intrinsics|Any CPU.ActiveCfg = Release-Intrinsics|Any CPU
{9222FC9D-599A-49A5-B685-08CC9A5C81D7}.Release-Intrinsics|Any CPU.Build.0 = Release-Intrinsics|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug-Intrinsics|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Debug-Intrinsics|Any CPU.Build.0 = Debug-Intrinsics|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Release|Any CPU.Build.0 = Release|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Release-Intrinsics|Any CPU.ActiveCfg = Release-Intrinsics|Any CPU
{6C29AA9B-054B-4762-BEA5-D305B932AA80}.Release-Intrinsics|Any CPU.Build.0 = Release-Intrinsics|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug-Intrinsics|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Debug-Intrinsics|Any CPU.Build.0 = Debug-Intrinsics|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Release|Any CPU.Build.0 = Release|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Release-Intrinsics|Any CPU.ActiveCfg = Release-Intrinsics|Any CPU
{4805129D-78C8-46D4-9519-0AD9B0574D6D}.Release-Intrinsics|Any CPU.Build.0 = Release-Intrinsics|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Debug-Intrinsics|Any CPU.ActiveCfg = Debug-Intrinsics|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Debug-Intrinsics|Any CPU.Build.0 = Debug-Intrinsics|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Release|Any CPU.Build.0 = Release|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Release-Intrinsics|Any CPU.ActiveCfg = Release-Intrinsics|Any CPU
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71}.Release-Intrinsics|Any CPU.Build.0 = Release-Intrinsics|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -567,6 +607,10 @@ Global
{ECB71297-9DF1-48CE-B93A-CD969221F9B6} = {DA452A53-2E94-4433-B08C-041EDEC729E6}
Copy link
Member

@wschin wschin Nov 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not aligned? #Resolved

{11A5210E-2EA7-42F1-80DB-827762E9C781} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
{C8E1772B-DFD9-4A4D-830D-6AAB1C668BB3} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
{9222FC9D-599A-49A5-B685-08CC9A5C81D7} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
{6C29AA9B-054B-4762-BEA5-D305B932AA80} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
{4805129D-78C8-46D4-9519-0AD9B0574D6D} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
{DB7CEB5E-8BE6-48A7-87BE-B91D9AE96F71} = {09EADF06-BE25-4228-AB53-95AE3E15B530}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {41165AF1-35BB-4832-A189-73060F82B01D}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>ML.NET component for pretrained AlexNet image featurization</PackageDescription>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="../Microsoft.ML.OnnxTransform/Microsoft.ML.OnnxTransform.nupkgproj" />
</ItemGroup>

<ItemGroup>
<Content Include="$(LocalAppData)\mlnet-resources\AlexNetOnnx\AlexNet.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\AlexNetOnnx" />
Copy link
Member

@eerhardt eerhardt Nov 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These .onnx files shouldn't go under the lib folder in the NuGet package. The lib folder is only for .NET assemblies (more or less).

Instead, these files should be placed in the contentFiles directory.

See https://docs.microsoft.com/en-us/nuget/reference/nuspec#including-content-files #Closed

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed to go into contentFiles. Thanks!


In reply to: 232773780 [](ancestors = 232773780)

<Content Include="$(LocalAppData)\mlnet-resources\AlexNetPrepOnnx\AlexNetPreprocess.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\AlexNetPrepOnnx" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project DefaultTargets="Pack">

<Import Project="Microsoft.ML.DnnImageFeaturizer.AlexNet.nupkgproj" />

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>ML.NET component for pretrained ResNet101 image featurization</PackageDescription>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="../Microsoft.ML.OnnxTransform/Microsoft.ML.OnnxTransform.nupkgproj" />
</ItemGroup>

<ItemGroup>
<Content Include="$(LocalAppData)\mlnet-resources\ResNet101Onnx\ResNet101.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\ResNet101Onnx" />
<Content Include="$(LocalAppData)\mlnet-resources\ResNetPrepOnnx\ResNetPreprocess.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\ResNetPrepOnnx" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project DefaultTargets="Pack">

<Import Project="Microsoft.ML.DnnImageFeaturizer.ResNet101.nupkgproj" />

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>ML.NET component for pretrained ResNet18 image featurization</PackageDescription>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="../Microsoft.ML.OnnxTransform/Microsoft.ML.OnnxTransform.nupkgproj" />
</ItemGroup>

<ItemGroup>
<Content Include="$(LocalAppData)\mlnet-resources\ResNet18Onnx\ResNet18.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\ResNet18Onnx" />
<Content Include="$(LocalAppData)\mlnet-resources\ResNetPrepOnnx\ResNetPreprocess.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\ResNetPrepOnnx" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project DefaultTargets="Pack">

<Import Project="Microsoft.ML.DnnImageFeaturizer.ResNet18.nupkgproj" />

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="Pack">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PackageDescription>ML.NET component for pretrained ResNet50 image featurization</PackageDescription>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="../Microsoft.ML.OnnxTransform/Microsoft.ML.OnnxTransform.nupkgproj" />
</ItemGroup>

<ItemGroup>
<Content Include="$(LocalAppData)\mlnet-resources\ResNet50Onnx\ResNet50.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\ResNet50Onnx" />
<Content Include="$(LocalAppData)\mlnet-resources\ResNetPrepOnnx\ResNetPreprocess.onnx" Pack="true" PackagePath=".\lib\netstandard2.0\ResNetPrepOnnx" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project DefaultTargets="Pack">

<Import Project="Microsoft.ML.DnnImageFeaturizer.ResNet50.nupkgproj" />

</Project>
58 changes: 58 additions & 0 deletions src/Microsoft.ML.DnnImageFeaturizer.AlexNet/AlexNet.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Microsoft.ML.Runtime;
using Microsoft.ML.Runtime.Data;
using System.IO;
using System.Reflection;

namespace Microsoft.ML.Transforms
{
/// <summary>
/// This is an extension method to be used with the <see cref="DnnImageFeaturizerEstimator"/> in order to use a pretrained AlexNet model.
/// The NuGet containing this extension is also guaranteed to include the binary model file. Note that when building the project
/// containing this extension method, the corresponding binary model will be downloaded from the CDN at
/// https://express-tlcresources.azureedge.net/image/AlexNetPrepOnnx/AlexNetPreprocess.onnx and
/// https://express-tlcresources.azureedge.net/image/AlexNetOnnx/AlexNet.onnx and placed into the local app directory
/// folder under mlnet-resources.
Copy link
Member

@eerhardt eerhardt Nov 19, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this comment about Note that when building the project containing this extension method still apply?

This doesn't make sense for an XML summary comment on a class. The XML comments are for the users of this API, not developers working on this file. #Resolved

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed the comment, thanks!


In reply to: 234754997 [](ancestors = 234754997)

/// </summary>
public static class AlexNetExtension
Copy link
Member

@eerhardt eerhardt Nov 26, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AlexNetExtension [](start = 24, length = 16)

(nit) it is nice to keep the class name and the containing file name in sync.

AlexNetExtension vs AlexNet.cs #Resolved

{
/// <summary>
/// If including this through a NuGet, the location of the model will be the same as of this file. This looks for the model there.
/// This should be the default way to use AlexNet if importing the model from a NuGet.
/// </summary>
public static EstimatorChain<OnnxTransform> AlexNet(this DnnImageModelSelector dnnModelContext, IHostEnvironment env, string input, string output)
{
var modelChain = new EstimatorChain<OnnxTransform>();
var tempCol = "onnxDnnPrep";
var execDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

Copy link
Member

@wschin wschin Nov 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// There are two estimators created below. The first one is for image preprocessing and the second one is the actual DNN model.
``` #Resolved

// There are two estimators created below. The first one is for image preprocessing and the second one is the actual DNN model.
var prepEstimator = new OnnxScoringEstimator(env, Path.Combine(execDir, "AlexNetPrepOnnx", "AlexNetPreprocess.onnx"), input, tempCol);
var mainEstimator = new OnnxScoringEstimator(env, Path.Combine(execDir, "AlexNetOnnx", "AlexNet.onnx"), tempCol, output);
modelChain = modelChain.Append(prepEstimator);
modelChain = modelChain.Append(mainEstimator);
return modelChain;
}

/// <summary>
/// This allows a custom model location to be specified. This is useful is a custom model is specified,
/// or if the model is desired to be placed or shipped separately in a different folder from the main application. Note that because Onnx models
/// must be in a directory all by themsleves for the OnnxTransform to work, this method appends a AlexNetOnnx/AlexNetPrepOnnx subdirectory
/// to the passed in directory to prevent having to make that directory manually each time.
/// </summary>
public static EstimatorChain<OnnxTransform> AlexNet(this DnnImageModelSelector dnnModelContext, IHostEnvironment env, string input, string output, string modelDir)
{
var modelChain = new EstimatorChain<OnnxTransform>();
var tempCol = "onnxDnnPrep";

var prepEstimator = new OnnxScoringEstimator(env, Path.Combine(modelDir, "AlexNetPrepOnnx", "AlexNetPreprocess.onnx"), input, tempCol);
Copy link
Member

@wschin wschin Nov 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
var prepEstimator = new OnnxScoringEstimator(env, Path.Combine(modelDir, "AlexNetPrepOnnx", "AlexNetPreprocess.onnx"), input, tempCol);
// Image processing
var prepEstimator = new OnnxScoringEstimator(env, Path.Combine(modelDir, "AlexNetPrepOnnx", "AlexNetPreprocess.onnx"), input, tempCol);
``` #Resolved

var mainEstimator = new OnnxScoringEstimator(env, Path.Combine(modelDir, "AlexNetOnnx", "AlexNet.onnx"), tempCol, output);
Copy link
Member

@wschin wschin Nov 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
var mainEstimator = new OnnxScoringEstimator(env, Path.Combine(modelDir, "AlexNetOnnx", "AlexNet.onnx"), tempCol, output);
// The actual DNN which featurizes images.
var mainEstimator = new OnnxScoringEstimator(env, Path.Combine(modelDir, "AlexNetOnnx", "AlexNet.onnx"), tempCol, output);
``` #Resolved

modelChain = modelChain.Append(prepEstimator);
modelChain = modelChain.Append(mainEstimator);
return modelChain;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<Project Sdk="Microsoft.NET.Sdk">

<UsingTask TaskName="DownloadFilesFromUrl" AssemblyFile="$(ToolsDir)Microsoft.DotNet.Build.Tasks.dll"/>

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IncludeInPackage>Microsoft.ML.DnnImageFeaturizer.AlexNet</IncludeInPackage>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Microsoft.ML.OnnxTransform\Microsoft.ML.OnnxTransform.csproj" />
</ItemGroup>

<PropertyGroup>
<LocalAppDataDir>$(LocalAppData)</LocalAppDataDir>
<MlnetAppDataDir>$(LocalAppData)/mlnet-resources</MlnetAppDataDir>
</PropertyGroup>

<ItemGroup>
<PreprocessFile Include="$(MlnetAppDataDir)/AlexNetPrepOnnx/AlexNetPreprocess.onnx"
Url="https://express-tlcresources.azureedge.net/image/AlexNetPrepOnnx/AlexNetPreprocess.onnx "
DestinationFile="$(MlnetAppDataDir)/AlexNetPrepOnnx/AlexNetPreprocess.onnx"
DestinationDir="$(MlnetAppDataDir)/AlexNetPrepOnnx" />
</ItemGroup>

<ItemGroup>
<ModelFile Include="$(MlnetAppDataDir)/AlexNetOnnx/AlexNet.onnx"
Url="https://express-tlcresources.azureedge.net/image/AlexNetOnnx/AlexNet.onnx"
DestinationFile="$(MlnetAppDataDir)/AlexNetOnnx/AlexNet.onnx"
DestinationDir="$(MlnetAppDataDir)/AlexNetOnnx" />
</ItemGroup>

<Target Name="DownloadPrepModels" Inputs="@(PreprocessFile)" Outputs="%(PreprocessFile.DestinationFile)">
<Message Importance="High" Text="Downloading external model files... %(PreprocessFile.DestinationFile)" />
<MakeDir Directories="$(MlnetAppDataDir)" />
<MakeDir Directories="$(LocalAppDataDir)" />
<MakeDir Directories="%(PreprocessFile.DestinationDir)" />
<DownloadFilesFromUrl Items="@(PreprocessFile)"/>
</Target>

<Target Name="DownloadMainModels"
DependsOnTargets="DownloadPrepModels"
AfterTargets="Build"
Inputs="@(ModelFile)" Outputs="%(ModelFile.DestinationFile)">
<Message Importance="High" Text="Downloading external model files... %(ModelFile.DestinationFile)" />
<MakeDir Directories="%(ModelFile.DestinationDir)" />
<DownloadFilesFromUrl Items="@(ModelFile)"/>
</Target>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<Project Sdk="Microsoft.NET.Sdk">

<UsingTask TaskName="DownloadFilesFromUrl" AssemblyFile="$(ToolsDir)Microsoft.DotNet.Build.Tasks.dll"/>

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IncludeInPackage>Microsoft.ML.DnnImageFeaturizer.ResNet101</IncludeInPackage>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Microsoft.ML.OnnxTransform\Microsoft.ML.OnnxTransform.csproj" />
</ItemGroup>

<PropertyGroup>
<LocalAppDataDir>$(LocalAppData)</LocalAppDataDir>
<MlnetAppDataDir>$(LocalAppData)/mlnet-resources</MlnetAppDataDir>
</PropertyGroup>

<ItemGroup>
<PreprocessFile Include="$(MlnetAppDataDir)/ResNetPrepOnnx/ResNetPreprocess.onnx"
Url="https://express-tlcresources.azureedge.net/image/ResNetPrepOnnx/ResNetPreprocess.onnx "
DestinationFile="$(MlnetAppDataDir)/ResNetPrepOnnx/ResNetPreprocess.onnx"
DestinationDir="$(MlnetAppDataDir)/ResNetPrepOnnx" />
</ItemGroup>

<ItemGroup>
<ModelFile Include="$(MlnetAppDataDir)/ResNet101Onnx/ResNet101.onnx"
Url="https://express-tlcresources.azureedge.net/image/ResNet101Onnx/ResNet101.onnx"
DestinationFile="$(MlnetAppDataDir)/ResNet101Onnx/ResNet101.onnx"
DestinationDir="$(MlnetAppDataDir)/ResNet101Onnx" />
</ItemGroup>

<Target Name="DownloadPrepModels" Inputs="@(PreprocessFile)" Outputs="%(PreprocessFile.DestinationFile)">
<Message Importance="High" Text="Downloading external model files... %(PreprocessFile.DestinationFile)" />
<MakeDir Directories="$(MlnetAppDataDir)" />
<MakeDir Directories="$(LocalAppDataDir)" />
<MakeDir Directories="%(PreprocessFile.DestinationDir)" />
<DownloadFilesFromUrl Items="@(PreprocessFile)"/>
</Target>

<Target Name="DownloadMainModels"
DependsOnTargets="DownloadPrepModels"
AfterTargets="Build"
Inputs="@(ModelFile)" Outputs="%(ModelFile.DestinationFile)">
<Message Importance="High" Text="Downloading external model files... %(ModelFile.DestinationFile)" />
<MakeDir Directories="%(ModelFile.DestinationDir)" />
<DownloadFilesFromUrl Items="@(ModelFile)"/>
</Target>

</Project>
Loading