Opened 2 years ago

Closed 2 years ago

#3545 closed defect (fixed)

i.superpixels.slic: behaviour of step parameter confusing

Reported by: mlennert Owned by: grass-dev@…
Priority: minor Milestone:
Component: Addons Version: unspecified
Keywords: i.superpixels.slic step Cc:
CPU: Unspecified Platform: Unspecified

Description

The behavior of the step parameter in i.superpixels.slic is a bit confusing:

GRASS 7.5.svn (Belgique31370):/data/home/mlennert > i.superpixels.slic orthos2016_p46_internal step=200 out=test200 perturb=10 compact=1 --o 

WARNING: Initialized 9 of 24 seeds


GRASS 7.5.svn (Belgique31370):/data/home/mlennert > i.superpixels.slic orthos2016_p46_internal step=20 out=test20 perturb=10 compact=1 --o

WARNING: Initialized 1169 of 2925 seeds

GRASS 7.5.svn (Belgique31370):/data/home/mlennert > i.superpixels.slic orthos2016_p46_internal step=2 out=test2 perturb=10 compact=1 --o

WARNING: Initialized 76 of 187 seeds

Normally, one would expect a larger number of seeds with step=2 than step=20. This behavior comes from lines 277ff of main.c, which read:

superpixelsize = step * step;
if (step < 5) {
    superpixelsize = 0.5 + (double)nrows * ncols / n_super_pixels;

    step = sqrt((double)superpixelsize) + 0.5;
}

Why this limit at 5 ? If it is really necessary, it should at least be documented in the man page to avoid confusion.

Change History (8)

comment:1 in reply to:  description ; Changed 2 years ago by mmetz

Replying to mlennert:

The behavior of the step parameter in i.superpixels.slic is a bit confusing:

[...]

Normally, one would expect a larger number of seeds with step=2 than step=20. This behavior comes from lines 277ff of main.c, which read:

superpixelsize = step * step;
if (step < 5) {
    superpixelsize = 0.5 + (double)nrows * ncols / n_super_pixels;

    step = sqrt((double)superpixelsize) + 0.5;
}

Why this limit at 5 ? If it is really necessary, it should at least be documented in the man page to avoid confusion.

The reason is that with small step sizes, you would get mini-superpixels, mostly squares. The SLIC algorithm likes a somewhat larger distance between superpixel centers in order to produce reasonable results. You can modify the condition to step < 2 and see what happens.

comment:2 in reply to:  1 ; Changed 2 years ago by mlennert

Replying to mmetz:

Replying to mlennert:

The behavior of the step parameter in i.superpixels.slic is a bit confusing:

[...]

Normally, one would expect a larger number of seeds with step=2 than step=20. This behavior comes from lines 277ff of main.c, which read:

superpixelsize = step * step;
if (step < 5) {
    superpixelsize = 0.5 + (double)nrows * ncols / n_super_pixels;

    step = sqrt((double)superpixelsize) + 0.5;
}

Why this limit at 5 ? If it is really necessary, it should at least be documented in the man page to avoid confusion.

The reason is that with small step sizes, you would get mini-superpixels, mostly squares. The SLIC algorithm likes a somewhat larger distance between superpixel centers in order to produce reasonable results. You can modify the condition to step < 2 and see what happens.

Doing this and asking for a step of 2 both on my VISNIR aerial photos and on the BW NC orthophoto, I get tiny superpixels of divers shapes. I don't find them very useful for my particular application, but this should be up to the user to decide, not imposed by the module.

If there are other reasons why step has to be above a certain threshold I would prefer the code to just raise the value to that threshold and tell the user about it, rather than creating a step value which is not very understandable for users. Something like this:

if (step < 5) {
    G_warning("Setting step to the minimum value of 5.");
    step = 5;
}

comment:3 Changed 2 years ago by mmetz

In 72634:

i.superpixels.slic: allow step > 1 (see #3545)

comment:4 in reply to:  2 ; Changed 2 years ago by mmetz

Replying to mlennert:

Replying to mmetz:

Replying to mlennert:

The behavior of the step parameter in i.superpixels.slic is a bit confusing:

[...]

Normally, one would expect a larger number of seeds with step=2 than step=20. This behavior comes from lines 277ff of main.c, which read:

superpixelsize = step * step;
if (step < 5) {
    superpixelsize = 0.5 + (double)nrows * ncols / n_super_pixels;

    step = sqrt((double)superpixelsize) + 0.5;
}

Why this limit at 5 ? If it is really necessary, it should at least be documented in the man page to avoid confusion.

The reason is that with small step sizes, you would get mini-superpixels, mostly squares. The SLIC algorithm likes a somewhat larger distance between superpixel centers in order to produce reasonable results. You can modify the condition to step < 2 and see what happens.

Doing this and asking for a step of 2 both on my VISNIR aerial photos and on the BW NC orthophoto, I get tiny superpixels of divers shapes. I don't find them very useful for my particular application, but this should be up to the user to decide, not imposed by the module.

OK, I changed the condition to step < 2 and updated the option description in r72634.

comment:5 in reply to:  4 ; Changed 2 years ago by mlennert

Replying to mmetz:

Replying to mlennert:

Replying to mmetz:

Replying to mlennert:

The behavior of the step parameter in i.superpixels.slic is a bit confusing:

[...]

Normally, one would expect a larger number of seeds with step=2 than step=20. This behavior comes from lines 277ff of main.c, which read:

superpixelsize = step * step;
if (step < 5) {
    superpixelsize = 0.5 + (double)nrows * ncols / n_super_pixels;

    step = sqrt((double)superpixelsize) + 0.5;
}

Why this limit at 5 ? If it is really necessary, it should at least be documented in the man page to avoid confusion.

The reason is that with small step sizes, you would get mini-superpixels, mostly squares. The SLIC algorithm likes a somewhat larger distance between superpixel centers in order to produce reasonable results. You can modify the condition to step < 2 and see what happens.

Doing this and asking for a step of 2 both on my VISNIR aerial photos and on the BW NC orthophoto, I get tiny superpixels of divers shapes. I don't find them very useful for my particular application, but this should be up to the user to decide, not imposed by the module.

OK, I changed the condition to step < 2 and updated the option description in r72634.

Thanks, but this will lead to the same issue for step = 1. Why do you want to make this into such a special case ? When I comment out everything between l277 and l281, and launch the module with step=1 on the NC orthophoto I get as many "superpixels" as original pixels. Again, I cannot imagine a use case for this, but why should the module artificially replace this with a calculation the origin of which is not really clear.

I would plead for respecting the user's choice of step, with a mention in the man page that a step below 5 will lead to extremely small superpixels.

comment:6 in reply to:  5 ; Changed 2 years ago by mmetz

Replying to mlennert:

Replying to mmetz:

Replying to mlennert:

Replying to mmetz:

Replying to mlennert:

The behavior of the step parameter in i.superpixels.slic is a bit confusing:

[...]

Normally, one would expect a larger number of seeds with step=2 than step=20. This behavior comes from lines 277ff of main.c, which read:

superpixelsize = step * step;
if (step < 5) {
    superpixelsize = 0.5 + (double)nrows * ncols / n_super_pixels;

    step = sqrt((double)superpixelsize) + 0.5;
}

Why this limit at 5 ? If it is really necessary, it should at least be documented in the man page to avoid confusion.

The reason is that with small step sizes, you would get mini-superpixels, mostly squares. The SLIC algorithm likes a somewhat larger distance between superpixel centers in order to produce reasonable results. You can modify the condition to step < 2 and see what happens.

Doing this and asking for a step of 2 both on my VISNIR aerial photos and on the BW NC orthophoto, I get tiny superpixels of divers shapes. I don't find them very useful for my particular application, but this should be up to the user to decide, not imposed by the module.

OK, I changed the condition to step < 2 and updated the option description in r72634.

Thanks, but this will lead to the same issue for step = 1. Why do you want to make this into such a special case ?

Because ...

When I comment out everything between l277 and l281, and launch the module with step=1 on the NC orthophoto I get as many "superpixels" as original pixels.

effictively a unique ID for each pixel. Regarding a superpixel as a group of neighboring pixels with similar spectral characteristics, there are no superpixels with step=1 and it is easier to use r.mapcalc.

Again, I cannot imagine a use case for this, but why should the module artificially replace this with a calculation the origin of which is not really clear.

I would plead for respecting the user's choice of step, with a mention in the man page that a step below 5 will lead to extremely small superpixels.

I would leave it as it is now and mention in the manual that step=1 would not generate any superpixels, but instead a unique ID for each pixel.

comment:7 in reply to:  6 Changed 2 years ago by mlennert

Replying to mmetz:

I would leave it as it is now and mention in the manual that step=1 would not generate any superpixels, but instead a unique ID for each pixel.

Done in r72652. Please check if what I wrote is ok.

comment:8 Changed 2 years ago by mlennert

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.