Opened 7 years ago
Closed 6 years ago
#3545 closed defect (fixed)
i.superpixels.slic: behaviour of step parameter confusing
Reported by: | mlennert | Owned by: | |
---|---|---|---|
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)
follow-up: 2 comment:1 by , 7 years ago
follow-up: 4 comment:2 by , 7 years ago
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; }
follow-up: 5 comment:4 by , 7 years ago
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.
follow-up: 6 comment:5 by , 7 years ago
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.
follow-up: 7 comment:6 by , 7 years ago
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 by , 7 years ago
comment:8 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Replying to mlennert:
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.