jhennies / CebraEM

MIT License
5 stars 2 forks source link

Error when exiting field of extracted area during gt annotation in napari #46

Open mrheinnecker opened 12 months ago

mrheinnecker commented 12 months ago

As shown in the attached screenshot, there occurs an error at ground truth annotation in napari as soon as I exit the extracted area with the curser. (The error pops up in the panel on the lower right side and I pasted the traceback at the end of this issue)

the error is not crucial as it is possible to work around by trying to not exit the area, sometimes it is hard to merge supervoxels that are very close to the boundaries bit so far i managed. It would just make it a little easier if that was fixed.

I encountered that the issue seems to occur only for the left and the top boundary of the cube. If I exit on the right or the bottom, no error occurs.

image


IndexError Traceback (most recent call last) File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/vispy/app/backends/_qt.py:532, in QtBaseCanvasBackend.mouseMoveEvent(self=, ev=) 530 if self._vispy_canvas is None: 531 return --> 532 self._vispy_mouse_move( self = <vispy.app.backends._qt.CanvasBackendDesktop object at 0x7fef3ade78b0> ev = <PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> 533 native=ev, 534 pos=_get_event_xy(ev), 535 modifiers=self._modifiers(ev), 536 )

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/vispy/app/base.py:216, in BaseCanvasBackend._vispy_mouse_move(self=, kwargs={'button': 1, 'buttons': [], 'last_event': , 'last_mouse_press': None, 'modifiers': (<Key 'Control'>,), 'native': , 'pos': (222, 578), 'press_event': }) 213 else: 214 kwargs['button'] = self._vispy_mouse_data['press_event'].button --> 216 ev = self._vispy_canvas.events.mouse_move(kwargs) self = <vispy.app.backends._qt.CanvasBackendDesktop object at 0x7fef3ade78b0> self._vispy_canvas.events.mouse_move = <vispy.util.event.EventEmitter object at 0x7fef3ade8a90> kwargs = {'native': <PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10>, 'pos': (222, 578), 'modifiers': (<Key 'Control'>,), 'buttons': [], 'press_event': <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=True is_dragging=False last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[406 613] press_event=None source=None sources=[] time=1695040930.2576623 type=mouse_press>, 'last_event': <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=False is_dragging=True last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[225 578] press_event=MouseEvent source=None sources=[] time=1695040930.6366537 type=mouse_move>, 'last_mouse_press': None, 'button': 1} self._vispy_canvas.events = <vispy.util.event.EmitterGroup object at 0x7fef3ade89a0> self._vispy_canvas = <VispyCanvas (PyQt5) at 0x7fef3ae26e20> 217 self._vispy_mouse_data['last_event'] = ev 218 return ev

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/vispy/util/event.py:453, in EventEmitter.call(self=, *args=(), **kwargs={'button': 1, 'buttons': [], 'last_event': , 'last_mouse_press': None, 'modifiers': (<Key 'Control'>,), 'native': , 'pos': (222, 578), 'press_event': }) 450 if self._emitting > 1: 451 raise RuntimeError('EventEmitter loop detected!') --> 453 self._invoke_callback(cb, event) event = <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=False is_dragging=True last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[222 578] press_event=MouseEvent source=None sources=[] time=1695040930.669733 type=mouse_move> self = <vispy.util.event.EventEmitter object at 0x7fef3ade8a90> cb = <bound method QtViewer.on_mouse_move of <napari._qt.qt_viewer.QtViewer object at 0x7fef3ae1a040>> 454 if event.blocked: 455 break

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/vispy/util/event.py:471, in EventEmitter._invoke_callback(self=, cb=<bound method QtViewer.on_mouse_move of >, event=) 469 cb(event) 470 except Exception: --> 471 _handle_exception(self.ignore_callback_errors, self = <vispy.util.event.EventEmitter object at 0x7fef3ade8a90> cb = <bound method QtViewer.on_mouse_move of <napari._qt.qt_viewer.QtViewer object at 0x7fef3ae1a040>> event = <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=False is_dragging=True last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[222 578] press_event=MouseEvent source=None sources=[] time=1695040930.669733 type=mouse_move> (cb, event) = (<bound method QtViewer.on_mouse_move of <napari._qt.qt_viewer.QtViewer object at 0x7fef3ae1a040>>, <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=False is_dragging=True last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[222 578] press_event=MouseEvent source=None sources=[] time=1695040930.669733 type=mouse_move>) 472 self.print_callback_errors, 473 self, cb_event=(cb, event))

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/vispy/util/event.py:469, in EventEmitter._invoke_callback(self=, cb=<bound method QtViewer.on_mouse_move of >, event=) 467 def _invoke_callback(self, cb, event): 468 try: --> 469 cb(event) cb = <bound method QtViewer.on_mouse_move of <napari._qt.qt_viewer.QtViewer object at 0x7fef3ae1a040>> event = <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=False is_dragging=True last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[222 578] press_event=MouseEvent source=None sources=[] time=1695040930.669733 type=mouse_move> 470 except Exception: 471 _handle_exception(self.ignore_callback_errors, 472 self.print_callback_errors, 473 self, cb_event=(cb, event))

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/napari/_qt/qt_viewer.py:1198, in QtViewer.on_mouse_move(self=, event=) 1190 def on_mouse_move(self, event): 1191 """Called whenever mouse moves over canvas. 1192 1193 Parameters (...) 1196 The vispy event that triggered this method. 1197 """ -> 1198 self._process_mouse_event(mouse_move_callbacks, event) event = <MouseEvent blocked=False button=1 buttons=[1] delta=[0. 0.] handled=False is_dragging=True last_event=MouseEvent modifiers=(<Key 'Control'>,) native=<PyQt5.QtGui.QMouseEvent object at 0x7fef106a6c10> pos=[222 578] press_event=MouseEvent source=None sources=[] time=1695040930.669733 type=mouse_move> self = <napari._qt.qt_viewer.QtViewer object at 0x7fef3ae1a040>

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/napari/_qt/qt_viewer.py:1147, in QtViewer._process_mouse_event(self=, mouse_callbacks=, event=<ReadOnlyWrapper at 0x7feeedf042c0 for MouseEvent>) 1145 layer = self.viewer.layers.selection.active 1146 if layer is not None: -> 1147 mouse_callbacks(layer, event) event = <ReadOnlyWrapper at 0x7feeedf042c0 for MouseEvent at 0x7feeedfa0850> layer = <Labels layer 'instances' at 0x7fef20edce50> mouse_callbacks = <function mouse_move_callbacks at 0x7ff09684e1f0>

File ~/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/napari/utils/interactions.py:173, in mouse_move_callbacks(obj=<Labels layer 'instances'>, event=<ReadOnlyWrapper at 0x7feeedf042c0 for MouseEvent>) 170 obj._persisted_mouse_event[gen].wrapped = event 171 try: 172 # try to advance the generator --> 173 next(gen) gen = <generator object CebraAnnWidget._cb_instance_segmentation..lyr_instances_onmousedrag at 0x7feee5e73f20> 174 except StopIteration: 175 # If done deleted the generator and stored event 176 del obj._mouse_drag_gen[func]

File ~/repos/CebraEM/cebra-ann/cebra_ann/_widget.py:927, in CebraAnnWidget._cb_instance_segmentation..lyr_instances_onmousedrag(layer=<Labels layer 'instances'>, event=<ReadOnlyWrapper at 0x7feee5e3d540 for ReadOnlyWrapper>) 925 this_labels = [] 926 else: --> 927 positions = get_disk_positions( positions = <class 'numpy.ndarray'> (16, 3) int64 brush_size = 5 event = <ReadOnlyWrapper at 0x7feee5e3d540 for ReadOnlyWrapper at 0x7feeedff6500> self = <cebra_ann._widget.CebraAnnWidget object at 0x7fef2131ee50> self.viewer = Viewer(camera=Camera(center=(0.0, 166.29326638806666, 194.6071992360609), zoom=2.542248348945979, angles=(0.0, 0.0, 90.0), perspective=0.0, mouse_pan=True, mouse_zoom=True), cursor=Cursor(position=(140.0, 297.27969395370627, 235.12252599230868), scaled=True, size=5, style=<CursorStyle.CIRCLE: 'circle'>), dims=Dims(ndim=3, ndisplay=2, last_used=0, range=((0.0, 384.0, 1.0), (0.0, 384.0, 1.0), (0.0, 384.0, 1.0)), current_step=(140, 191, 191), order=(0, 1, 2), axis_labels=('0', '1', '2')), grid=GridCanvas(stride=1, shape=(-1, -1), enabled=False), layers=[<Image layer 'raw' at 0x7feeb1a0ad90>, <Image layer 'mem' at 0x7feeb1a0ad00>, <Labels layer 'sv' at 0x7fef106ba940>, <Labels layer 'pre_merge' at 0x7fef212b4a60>, <Labels layer 'instances' at 0x7fef20edce50>, <Labels layer 'semantics_nuc' at 0x7fef0ff58760>, <Labels layer 'semantics_cyto' at 0x7fef102f7b80>, <Labels layer 'semantics_bg' at 0x7fee0c21d040>], help='use <1> for activate the label eraser, use <2> for activate the paint brush, use <3> for activate the fill bucket, use <4> for pick mode', status={'layer_base': 'instances', 'source_type': '', 'plugin': '', 'coordinates': ' [140 297 235]'}, tooltip=Tooltip(visible=False, text=''), theme='dark', title='CebraANN - /home/rheinnec/scratch/cebra_em_wfs/fo/gt/gt004', mouse_over_canvas=True, mouse_move_callbacks=[], mouse_drag_callbacks=[], mouse_double_click_callbacks=[], mouse_wheel_callbacks=[<function dims_scroll at 0x7ff06c542ee0>], _persisted_mouse_event={}, _mouse_drag_gen={}, _mouse_wheel_gen={}, keymap={'Control': <function CebraAnnWidget._add_key_bindings..ctrl_pressed at 0x7fef2132f280>, 'Control-E': <function CebraAnnWidget._add_key_bindings..ctrl_e_pressed at 0x7fef2132f310>}) np = <module 'numpy' from '/home/rheinnec/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/numpy/init.py'> layer = <Labels layer 'instances' at 0x7fef20edce50> 928 brush_size, 929 tuple((np.array(event.position) - self.viewer.layers['instances'].translate).astype(int)), 930 layer.data.shape, 931 self.viewer.dims.order 932 ) 933 this_labels = np.unique([layer.data[tuple(pos)] for pos in positions]) 935 for this_label in this_labels:

File ~/repos/CebraEM/cebra-ann/cebra_ann/_funcs.py:38, in get_disk_positions(brush_size=5, center=(12, 83, 2), shape=<class 'numpy.ndarray'> (3,) int64, dimsorder=(0, 1, 2)) 31 z, y, x = np.mgrid[ 32 np.s[int(center[0] - brush_size / 2):int(center[0] + brush_size / 2 + 1)] if zaxis != 0 else np.s[center[0]: center[0] + 1], 33 np.s_[int(center[1] - brush_size / 2):int(center[1] + brush_size / 2 + 1)] if zaxis != 1 else np.s[center[1]: center[1] + 1], 34 np.s_[int(center[2] - brush_size / 2):int(center[2] + brush_size / 2 + 1)] if zaxis != 2 else np.s[center[2]: center[2] + 1] 35 ] 37 # Mask with the structuring element to get the list of positions ---> 38 pos = np.array([z[strel > 0], y[strel > 0], x[strel > 0]]).swapaxes(0, 1) strel = <class 'numpy.ndarray'> (1, 6, 6) uint8 np = <module 'numpy' from '/home/rheinnec/miniconda3/envs/cebra-em-env02/lib/python3.9/site-packages/numpy/init.py'> z = <class 'numpy.ndarray'> (1, 6, 5) int64 y = <class 'numpy.ndarray'> (1, 6, 5) int64 x = <class 'numpy.ndarray'> (1, 6, 5) int64 40 # Remove positions that are out of upper bounds 41 pos = pos[(pos < shape).all(axis=1), :]

IndexError: boolean index did not match indexed array along dimension 2; dimension is 5 but corresponding boolean dimension is 6