Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Setting color parameter in add_labels causes long execution time #3852

Open
kolibril13 opened this issue Dec 19, 2021 · 7 comments
Open

Setting color parameter in add_labels causes long execution time #3852

kolibril13 opened this issue Dec 19, 2021 · 7 comments
Labels
bug Something isn't working performance Relates to performance probably solved Issue that may be solved but requires confirmation

Comments

@kolibril13
Copy link
Contributor

kolibril13 commented Dec 19, 2021

🐛 Bug

Changing the color of a 3D mask with viewer.add_labels(x, color= {1: "blue"}) results in a 3x longer execution time, then setting the color by a random seed e.g. viewer.add_labels(x, seed=0.4). Here is a screenshot:

image

Currently, it is more performant to guess a random seed that creates the color blue, then to set blue in the first case. It would be great if there was a solution to make this method faster.

To Reproduce

Here is the code, that I ran in a VS Code notebook:

import matplotlib.pyplot as plt
import napari
import numpy as np
import scipy
from skimage import data

try:
    viewer
except NameError:
    viewer = napari.Viewer()
    viewer.theme = 'light'
    viewer.dims.ndisplay = 3

# make data
blobs = data.binary_blobs(length=512, volume_fraction=0.1, n_dim=3, seed=42)
# label data
mylabel, feature_num=scipy.ndimage.label(blobs)
label_index,counts = np.unique(mylabel, return_counts= True)
#sort labels
labeled_dots = {}
for A, B in zip(label_index,counts):
    labeled_dots[A] = B
sorted_dict = dict(sorted(labeled_dots.items(), key=lambda item: item[1], reverse=True))
highest_count=list(sorted_dict.keys())[1] #get highest label

#create masks
mask1 = mylabel.copy()
mask1[mylabel == highest_count] = 0
mask1bool = (mask1 != 0)
mask2bool = (mylabel ==  highest_count)
viewer.layers.clear()
viewer.add_labels(mask1bool, color= {1: "blue"})
viewer.add_labels(mask2bool, color = {1: "red"})

viewer.camera.angles = (-61.54, 51.3, -63.5)
viewer.camera.zoom = 0.72
viewer.layers.clear()
viewer.add_labels(mask1bool, seed=0.4)
viewer.add_labels(mask2bool, seed=0.5)

viewer.camera.angles = (-61.54, 51.3, -63.5)
viewer.camera.zoom = 0.72

Expected behavior

Setting color by parameter should take the same execution time then setting color by random seed

Environment

  • Please copy and paste the information at napari info option in help menubar here:
    napari: 0.4.12
    Platform: macOS-12.0.1-x86_64-i386-64bit
    System: MacOS 12.0.1
    Python: 3.9.5 (default, May 4 2021, 03:36:27) [Clang 12.0.0 (clang-1200.0.32.29)]
    Qt: 5.15.2
    PyQt5: 5.15.6
    NumPy: 1.21.1
    SciPy: 1.6.1
    Dask: 2021.12.0
    VisPy: 0.9.4

OpenGL:

  • GL version: 2.1 Metal - 76.1
  • MAX_TEXTURE_SIZE: 16384

Screens:

  • screen 1: resolution 1680x1050, scale 2.0

Plugins:

  • console: 0.0.4
  • scikit-image: 0.4.12
  • svg: 0.1.5
  • Any other relevant information:

Additional context

Produced output:
image
EDIT: Also trying to switch from 2d to 3d with custom color caused the extra time delay:
image

@kolibril13 kolibril13 added the bug Something isn't working label Dec 19, 2021
@jni
Copy link
Member

jni commented Dec 20, 2021

Thanks @kolibril13 for the report. This is due to the way labels colors are calculated. It should be fixed once we map labels to colors in the shader as proposed in #3308. Unfortunately it's not a trivial fix, but I think we are close to getting it working. 🤞

@jni jni added the performance Relates to performance label Dec 20, 2021
@psobolewskiPhD
Copy link
Member

psobolewskiPhD commented Jan 21, 2024

On 0.4.18 that cell with red/blue gives me 2.4-2.5 s per run.
The next one (with seed) gives me about the same, bit faster around 2.1-2.2 s

If I use the 2nd notebook to check toggle to 3d, also on 0.4.18:
Adding the red/blue layer (in 2D): 0.3s
toggle to 3D: 1,5-1.7s

Adding the seed layers (in 2D): 0.3s
toggle to 3d: 1.6s

So no performance difference really between the two color cases -- i'm tempted to close this.

On 0.4.19rc3 I get:
3D case:
adding the red/blue, first time 1.9 s, repeated: 0.2s -- so there is some warmup effect, possibly the numba code?
adding the seed (using seed_rng), first time: 0.3s, repeated 0.3s -- this was same notebook or isolated in own notebook
(note the colors arnt different though, so something is not quite right)

For the 2D switch to 3D case:
adding the red/blue (2D) first time 1.7 s, repeated: 0.2s -- again there is some warmup effect, possibly the numba code?
toggle to 3D: 0.1 s
for the seed (2D), adding 0.3s
toggle to 3D 0.0 s

@jni @Czaki that 2nd case on 0.4.19rc3 to me is a regression. Adding a layer in 2D should be as fast as possible. Seems like a warmup (numba?) there, but then toggle to 3D is instant. This is nice, but I think the other way around is better, as a moment to toggle to 3d might be expected, while adding a layer should be fast.

Edit: I uninstalled numba (04.19rc3) out of curiosity and now with the red/blue layer I get:
IndexError: index 3 is out of bounds for axis 0 with size 3

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[2], [line 2](vscode-notebook-cell:?execution_count=2&line=2)
      [1](vscode-notebook-cell:?execution_count=2&line=1) viewer.layers.clear()
----> [2](vscode-notebook-cell:?execution_count=2&line=2) viewer.add_labels(mask1bool, color= {1: "blue"})
      [3](vscode-notebook-cell:?execution_count=2&line=3) viewer.add_labels(mask2bool, color = {1: "red"})
      [5](vscode-notebook-cell:?execution_count=2&line=5) viewer.camera.angles = (-61.54, 51.3, -63.5)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:4](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:4), in add_labels(self, data, num_colors, features, properties, color, seed_rng, name, metadata, scale, translate, rotate, shear, affine, opacity, blending, rendering, depiction, visible, multiscale, cache, plane, experimental_clipping_planes)
      [1](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:1) from __future__ import annotations
      [3](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:3) import inspect
----> [4](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:4) import itertools
      [5](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:5) import os
      [6](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/components/viewer_model.py:6) import warnings

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:87](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:87), in deprecated_constructor_arg_by_attr.<locals>.wrapper.<locals>._wrapper(*args, **kwargs)
     [85](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:85) if name in kwargs:
     [86](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:86)     value = kwargs.pop(name)
---> [87](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:87) res = func(*args, **kwargs)
     [89](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:89) if value is not _UNSET:
     [90](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/migrations.py:90)     setattr(args[0], name, value)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:365](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:365), in Labels.__init__(self, data, num_colors, features, properties, color, seed_rng, name, metadata, scale, translate, rotate, shear, affine, opacity, blending, rendering, depiction, visible, multiscale, cache, plane, experimental_clipping_planes)
    [363](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:363) self._selected_color = self.get_color(self._selected_label)
    [364](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:364) self._updated_slice = None
--> [365](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:365) self.color = color
    [367](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:367) self._status = self.mode
    [368](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:368) self._preserve_labels = False

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:638](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:638), in Labels.color(self, color)
    [633](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:633) colors = {
    [634](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:634)     label: transform_color(color_str)[0]
    [635](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:635)     for label, color_str in color.items()
    [636](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:636) }
    [637](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:637) self._color = colors
--> [638](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:638) self.colormap = direct_colormap(colors)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:508](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:508), in Labels.colormap(self, colormap)
    [506](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:506) @colormap.setter
    [507](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:507) def colormap(self, colormap: LabelColormapBase):
--> [508](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:508)     self._set_colormap(colormap)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:533](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:533), in Labels._set_colormap(self, colormap)
    [531](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:531) self._selected_color = self.get_color(self.selected_label)
    [532](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:532) self.events.colormap()  # Will update the LabelVispyColormap shader
--> [533](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:533) self.color_mode = color_mode

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:768](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:768), in Labels.color_mode(self, color_mode)
    [766](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:766) self.events.colormap()  # If remove this emitting, connect shader update to color_mode
    [767](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:767) self.events.selected_label()
--> [768](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:768) self.refresh()

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/base/base.py:1282](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/base/base.py:1282), in Layer.refresh(self, event)
   [1280](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/base/base.py:1280) self.set_view_slice()
   [1281](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/base/base.py:1281) self.events.set_data()
-> [1282](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/base/base.py:1282) self._update_thumbnail()
   [1283](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/base/base.py:1283) self._set_highlight(force=True)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1067](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1067), in Labels._update_thumbnail(self)
   [1064](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1064) zoom_factor = tuple(new_shape [/](https://file+.vscode-resource.vscode-cdn.net/) imshape)
   [1066](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1066) downsampled = ndi.zoom(image, zoom_factor, prefilter=False, order=0)
-> [1067](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1067) color_array = self.colormap.map(downsampled)
   [1068](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1068) color_array[..., 3] *= self.opacity
   [1070](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/layers/labels/labels.py:1070) self.thumbnail = color_array

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:373](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:373), in DirectLabelColormap.map(self, values)
    [371](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:371) if values.dtype.kind in {'f', 'U'}:
    [372](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:372)     raise TypeError("DirectLabelColormap can only be used with int")
--> [373](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:373) mapper = self._get_mapping_from_cache(values.dtype)
    [374](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:374) if mapper is not None:
    [375](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:375)     mapped = mapper[values]

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:205](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:205), in LabelColormapBase._get_mapping_from_cache(self, data_dtype)
    [201](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:201) if key not in self._cache_mapping and data_dtype.itemsize <= 2:
    [202](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:202)     data = np.arange(
    [203](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:203)         np.iinfo(target_dtype).max + 1, dtype=target_dtype
    [204](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:204)     ).astype(data_dtype)
--> [205](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:205)     self._cache_mapping[key] = self._map_without_cache(data)
    [206](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:206) return self._cache_mapping.get(key)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:386](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:386), in DirectLabelColormap._map_without_cache(self, values)
    [384](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:384) def _map_without_cache(self, values: np.ndarray) -> np.ndarray:
    [385](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:385)     cmap = self._cmap_without_selection()
--> [386](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:386)     cast = _labels_raw_to_texture_direct(values, cmap)
    [387](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:387)     return self._map_precast(cast, apply_selection=False)

File [~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:826](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:826), in _labels_raw_to_texture_direct_numpy(data, direct_colormap)
    [824](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:824) if data.dtype.itemsize > 2:
    [825](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:825)     data = np.clip(data, 0, mapper.shape[0] - 1)
--> [826](https://file+.vscode-resource.vscode-cdn.net/Users/piotrsobolewski/Dev/python_stuffs/~/Dev/miniforge3/envs/napari-419/lib/python3.11/site-packages/napari/utils/colormaps/colormap.py:826) return mapper[data]

IndexError: index 3 is out of bounds for axis 0 with size 3

On main the error doesn't occur, so I guess this has been fixed, but not in rc yet. Adding the red/blue layers in 2D or 3D mode is fast without numba: 0.3 s. Toggle to 3D also remains fast (0.0 s). Same for the seed layers.

@psobolewskiPhD psobolewskiPhD added the probably solved Issue that may be solved but requires confirmation label Jan 21, 2024
@Czaki
Copy link
Collaborator

Czaki commented Jan 21, 2024

Edit: I uninstalled numba (04.19rc3) out of curiosity and now with the red/blue layer I get:
IndexError: index 3 is out of bounds for axis 0 with size 3

It was fixed in #6571. Not cherry-picked yet.

On 0.4.19rc3 I get: 3D case: adding the red/blue, first time 1.9 s, repeated: 0.2s -- so there is some warmup effect, possibly the numba code? adding the seed (using seed_rng), first time: 0.3s, repeated 0.3s -- this was same notebook or isolated in own notebook (note the colors arnt different though, so something is not quite right)

For the 2D switch to 3D case: adding the red/blue (2D) first time 1.7 s, repeated: 0.2s -- again there is some warmup effect, possibly the numba code? toggle to 3D: 0.1 s for the seed (2D), adding 0.3s toggle to 3D 0.0 s

In #6602 I have added caching numba code between sessions. Could you play with it?

@jni
Copy link
Member

jni commented Jan 22, 2024

Thanks for the rc testing @psobolewskiPhD, I hope we can make use of your services again in a couple of days for rc4! 😅 But in the meantime, yes, I think this issue can be closed! 🥳

@psobolewskiPhD
Copy link
Member

psobolewskiPhD commented Jan 23, 2024

main with both #6602 and #6607 merged, with numba:
adding the blue/red in 3D, first 1.3 s, second 0.5 s
adding the seed_rng in 3d: 0.2 s

Adding in 2D
blue/red, first: 0.8 s, second 0.4 s
seed_rng: 0.3 s

toggle to 3d
blue/red: 0.1 s
seed_rng: 0.1 s

So a bit better...

Edit: also I can confirm that #6542 fixes the issue with seed throwing an error--it properly warns of deprecation.

@jni
Copy link
Member

jni commented Jan 23, 2024

Another thing to try @psobolewskiPhD @kolibril13 is to use uint8 or uint16 data — that does not depend on conversion by numba (or any other format — it is viewed directly on the GPU) so should be much faster.

@psobolewskiPhD
Copy link
Member

psobolewskiPhD commented Jan 26, 2024

main 737ae89 , with Numba:

case                       1st run         2nd run
red/blue, 3D          1.6 s             0.2 s
seed, 3D                0.2 s            0.3 s
---
red/blue 2D           0.6 s            0.3 s
      toggle 3D              instant, 0 s
seed, 2D                0.2 s            0.2 s
      toggle 3D              instant, 0 s

main 737ae89 , without Numba installed

case                       1st run         2nd run
red/blue, 3D          0.2 s             0.2 s
seed, 3D                0.2 s            0.3 s
---
red/blue 2D           0.2 s            0.3 s
      toggle 3D              instant, 0 s
seed, 2D                0.2 s            0.2 s
      toggle 3D              instant, 0 s

with #6617 without Numba installed, with partsegcore-compiled-backend (conda-forge):

case                       1st run         2nd run
red/blue, 3D          0.2 s             0.2 s
seed, 3D                0.2 s            0.3 s
---
red/blue 2D           0.2 s            0.2 s
      toggle 3D              instant, 0 s
seed, 2D                0.2 s            0.2 s
      toggle 3D              instant, 0 s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working performance Relates to performance probably solved Issue that may be solved but requires confirmation
Projects
None yet
Development

No branches or pull requests

4 participants