Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Image support - #528

Merged
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support
Jul 31, 2018
Merged

Image support#528
Ivanidzo4ka merged 26 commits into
dotnet:masterfrom
Ivanidzo4ka:ivanidze/image_support

Conversation

@Ivanidzo4ka

@Ivanidzo4kaIvanidzo4ka commented Jul 13, 2018

Copy link
Copy Markdown
Contributor

address #489
need create issue about IDataView datatype extensibility.

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), "height * width is too large");

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

height [](start = 92, length = 6)

nameof for params in this message? #Closed

public override string ToString()
{
if (Height == 0 && Width == 0)
return "Picture";

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Picture [](start = 24, length = 7)

It's a little weird that the image type identifies itself as picture, is it not? #Closed

return false;
if (Width != tmp.Width)
return false;
return true;

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe restructure as return Width == tmp.Width. #Closed

if (other == this)
return true;
var tmp = other as ImageType;
if (tmp == null)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Will if (other as ImageType tmp == null) work? #Closed

{
}

public override bool Equals(ColumnType other)

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Equals [](start = 29, length = 6)

There's something a bit strange about this. ColumnType implements IEquatable<ColumnType>, and the guidelines for that say it should also overload Equals(object) and GetHashCode. Though to be fair to you I think all ColumnTypes have this problem. #Closed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Maybe file a separate issue, we can address later?


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

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

#547


In reply to: 203182127 [](ancestors = 203182127,202379905)

@@ -0,0 +1,3 @@
banana.jpg banana
hotdog.jpg hotdog
tomato.jpg tomato No newline at end of file

@TomFinleyTomFinleyJul 13, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I feel like this should have been "not hotdog." 😃 #Closed

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Are you planning to add their entry point classes next? #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageResizerTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImagePixelExtractorTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImagePixelExtractorTransform [](start = 24, length = 28)

Let's get in the rhythm of adding one line of

for all public classes. #Resolved

namespace Microsoft.ML.Runtime.Data
{
// REVIEW: Rewrite as LambdaTransform to simplify.
public sealed class ImageLoaderTransform : OneToOneTransformBase

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

ImageLoaderTransform [](start = 24, length = 20)

summary #Resolved


/// <summary>
/// Public constructor corresponding to SignatureDataTransform.
/// </summary>

@sfilipisfilipiJul 16, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I know we use this allover, and it's plenty meaningful as a code comment, but it will appear in the docs site as well, where might confuse users. Maybe turn it into a code comment removing the triple ///, and

.
Ideally add a meaningful line for the actual documentation. #Resolved

@sfilipisfilipi left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

:shipit:

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Windows_NT Release

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test Linux Debug

{
Contracts.CheckParam(height > 0, nameof(height));
Contracts.CheckParam(width > 0, nameof(width));
Contracts.CheckParam((long)height * width <= int.MaxValue / 4, nameof(height), $"{nameof(height)} * {nameof(width)} is too large");

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

$"{nameof(height)} * {nameof(width)} is too large" [](start = 91, length = 50)

If you really want it as format strings I'd encourage you to make this follow the if (...) throw Contracts.Except pattern. Or you could continue to make it a string literal by making this nameof(height) + " * " + nameof(width) + " is too large" or something. #Closed

public string ImageFolder;
}

internal const string Summary = "Load images from a file.";

@TomFinleyTomFinleyJul 17, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

a file [](start = 58, length = 6)

You forgot to pluralize this. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

is "a files" ok, or it should be something else?


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Correct would be "load images from files." FYI @Ivanidzo4ka I feel like this is the only thing standing in the way of this being merged.


In reply to: 205597457 [](ancestors = 205597457,203182343)

Ivan Matantsev added 2 commits July 17, 2018 14:56
Grayscale
return exception catching
@safernsafern closed this Jul 23, 2018
@safernsafern reopened this Jul 23, 2018
Ivan Matantsev added 2 commits July 23, 2018 09:41
@Ivanidzo4kaIvanidzo4ka changed the title WIP Image supportImage supportJul 24, 2018
@Ivanidzo4ka
Ivanidzo4ka requested a review from Zruty0July 24, 2018 16:39
@Zruty0

Copy link
Copy Markdown
Contributor

@Ivanidzo4ka , you have surely added a lot of code here :) I would much rather ask @TomFinley to finish his review, rather than jump in and try to grok all this myself.

@TomFinley , if for some reason this doesn't work for you, please let me know and I'll start the review


private const string RegistrationName = "ImageGrayscale";

/// Public constructor corresponding to SignatureDataTransform.

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

/// [](start = 8, length = 4)

Did you mean this to be // and not /// , since it is not really terribly sensible for callers? #Closed

return Infos[iinfo].TypeSrc;
}

public ColorMatrix GreyscaleColorMatrix = new ColorMatrix(

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

public ColorMatrix GreyscaleColorMatrix [](start = 8, length = 39)

This is a mutable, public instance level field that affects the functionality of the transform.

Probably want this to be private (or at least internal if somehow it is referenced somewhere else), static, and almost certainly readonly. #Closed

//verWrittenCur: 0x00010001, // Initial
verWrittenCur: 0x00010002, // Swith from OpenCV to Bitmap
verReadableCur: 0x00010002,
verWeCanReadBack: 0x00010002,

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

0x00010002 [](start = 34, length = 10)

What would happen if you were to read a 0x00010001 model? Would it just be a little bit off? Or is it just fundamentally different?

I think possibly it might be better to load those old models, just use the new types under the hood. If we were to, say, hypothetically change from using DvText to ReadOnlySpan<char> or something like that, we almost certainly would not refuse to load all models just on the basis of the type change alone. #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

In past Loader/Resizer and Pixel extractor was tangled bundle which works together.
From what I found in my investigation during comparing System.Bitmap with old version, Pixel extractor was buggy and throw exception in case of rectangular shape (people used square shape all the time, but maybe rectangle image make sense as well) and Resizer instead of resizing image actually just pick subset of image from top left corner and count it as "Resized" image. Which is fine if you pass real width and height to transform, but if you actually want to resize them, not so great.

That's why I'm bumping versions in all 3 of them.


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

@TomFinleyTomFinleyJul 28, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Ah OK. So they were not just somewhat different, the old ones were fundamentally broken. That's nice. I guess that's a good enough reason to break backcompat. #Closed

private static VersionInfo GetVersionInfo()
{
return new VersionInfo(
modelSignature: "IMGGREY ",

@TomFinleyTomFinleyJul 25, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

IMGGREY [](start = 33, length = 8)

You had a signature of IMGLOADT for that. Why is this not IMGGREYT?

Also: is it intentional that this be GREY? Elsewhere we are using "gray."

If models already exist with this signature I guess we have to keep it, not sure if that's the case though since you didn't bump the version. :) (I'm not suggesting you bump the version to be clear.) #Closed

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

English are so confusing, grey and gray is apparent to have same meaning, but my brain apparently throw coin during typing and at some point I had code with both spelling all across code. Which I tried to unified, but this one slip from my attention.
This is a new transform which we never had before, and I add it "just in case", and "maybe it will prove useful". So i think it make sense to start from version 1.


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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Oh sure @Ivanidzo4ka grey and gray are synonymous, though elsewhere you use gray. Also my impression is that we generally favor American spellings (gray) of words vs. British ones (grey).

...Even though I was brought up to use "grey," and had to correct myself since later in my life people thought I was weird. So now I hypercorrect, and you reap the benefits. :D


In reply to: 205597316 [](ancestors = 205597316,205265843)

@TomFinleyTomFinley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @Ivanidzo4ka !

@Ivanidzo4ka

Copy link
Copy Markdown
ContributorAuthor

@dotnet-bot test VSTS: public-CI

@Ivanidzo4ka
Ivanidzo4ka merged commit bdb742d into dotnet:masterJul 31, 2018
Ivanidzo4ka added a commit that referenced this pull request Jul 31, 2018
codemzs pushed a commit to codemzs/machinelearning that referenced this pull request Aug 1, 2018
Add images support based on System.Drawing
@ghostghost locked as resolved and limited conversation to collaborators Mar 29, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Ivanidzo4ka@Zruty0@TomFinley@sfilipi@safern