Shapeworks: renderizar volúmenes de algunas resoluciones se bloquea cuando se usa itkwidgets.view después de usar shapeworks en un cuaderno

Creado en 23 mar. 2021  ·  22Comentarios  ·  Fuente: SCIInstitute/ShapeWorks

Esto solía ser "bloqueos de notebooks para comenzar con la preparación-segmentaciones en MacOS", pero mucha investigación ha descubierto el problema real, posiblemente debido a bibliotecas compartidas incompatibles.

Sistema limpio, conda limpia.

Esta es la celda que falla:

shapeSeg = shapeSegList[10]
itkw.view( image          = sw2vtkImage(shapeSeg),
           slicing_planes = True,
           axes           = True,
           rotate         = True,
           interpolation  = True)
Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x000000014b76fff3
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Segmentation fault: 11
Termination Reason:    Namespace SIGNAL, Code 0xb
Terminating Process:   exc handler [0]

VM Regions Near 0x14b76fff3:
    MALLOC_LARGE           000000014b50a000-000000014b769000 [ 2428K] rw-/rwx SM=PRV  
--> 
    MALLOC_LARGE           000000014b770000-000000014d863000 [ 32.9M] rw-/rwx SM=PRV  

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_platform.dylib        0x00007fff564c85e6 _platform_memmove$VARIANT$Nehalem + 486
1   libvnl.dylib                    0x000000010ae40e6b vnl_vector<double>::operator=(vnl_vector<double> const&) + 139
2   _ITKCommonPython.so             0x000000014ec0d18b vnl_vector<double>::operator=(vnl_vector<double>&&) + 65
3   _ITKCommonPython.so             0x000000014eadec9d 0x14de03000 + 13483165
4   _ITKCommonPython.so             0x000000014e869165 0x14de03000 + 10903909
5   _ITKCommonPython.so             0x000000014ec611a7 itk::ProcessObject::UpdateOutputInformation() + 339
6   _ITKCommonPython.so             0x000000014e47d8fe 0x14de03000 + 6793470
7   _ITKImageGridPython.so          0x00000001538b5619 itk::ProcessObject::UpdateOutputInformation() + 117
8   _ITKImageGridPython.so          0x00000001538b5ebc itk::ProcessObject::UpdateLargestPossibleRegion() + 18
9   _ITKCommonPython.so             0x000000014e10726b 0x14de03000 + 3162731
10  python                          0x00000001044c8843 _PyMethodDef_RawFastCallKeywords + 131
11  python                          0x00000001044c81d6 _PyObject_FastCallKeywords + 598
12  python                          0x0000000104600bb7 call_function + 455
...
bug

Todos 22 comentarios

Sí, estoy tratando de ejecutarlo ahora y tengo el mismo bloqueo, aquí mismo:
`` `shapeSeg = shapeSegList [10]
itkw.view (imagen = sw2vtkImage (shapeSeg),
slicing_planes = Verdadero,
ejes = Verdadero,
rotar = Verdadero,
interpolación = Verdadero)

Simplificó el problema y parece que Image :: resample es el culpable aquí. Después de volver a muestrear, ellipsoid_05 carga el visor mientras que ellipsoid_00 hace que el kernel se bloquee al intentar usar itk.view ()

Screen Shot 2021-03-24 at 11 02 20 PM

Screen Shot 2021-03-24 at 11 01 06 PM

Después de probar con esto, algo _ puede_ estar mal con Image :: resample wrt itkwidgets.view .
Imágenes probadas: ellipsoid_1mode / segmentations / ellipsoid_00.nrrd y ellipsoid_1mode / segmentations / ellipsoid_05.nrrd
-> 00 no se puede trazar cuando pyvista lo envuelve en una imagen vtk después de volver a muestrear
-> 05 funciona bien
=> _ambos_ funcionan bien cuando son graficados por pyvista
Lancé un poco de depuración en Image :: volver a muestrear y no vi nada fuera de lo común hasta ahora).

Aquí tienes un cuaderno sencillo si quieres experimentar.
wishy_washy_resample.ipynb.zip

... y cómo se ve vacío cuando lo carga:
Screen Shot 2021-03-24 at 7 59 23 PM

... y cómo se ve cuando lo ejecuta. Cambie el 05 a 00 y ejecútelo nuevamente para que se bloquee cuando itkw intente renderizar.
Screen Shot 2021-03-24 at 7 55 29 PM

Transponer o ... la matriz que podría renderizarse
Si recuerda, itkwidgets puede representar una matriz numpy directamente. Pero interpreta esa matriz como la transposición de lo que se pasa, algo que _no_ hace cuando se usa una matriz vtk. Por lo tanto, normalmente transponemos lo que obtenemos de la imagen antes de envolverla en una matriz vtk, y simplemente usamos la matriz vtk con itkwidgets para simplificar las cosas.

Probé ambos esta mañana y desafortunadamente no hace ninguna diferencia. Transpuesto o no, matrices numpy o vtk, todo se bloquea cuando se intenta renderizar usando itkwidgets después de Image.resample.

Copiar o ... ¿Me estoy repitiendo?
La matriz que proviene de la imagen puede ser el problema. Tal vez esté apuntando a una memoria inválida. ¡Así que creemos una copia!
Después de copiar la matriz, tanto en order='C' como en order='F' , transponer, modificar, ponerme de cabeza mientras compongo las funciones y pensar con ilusión en todo ello, _todavía falla cada vez_.

Esto sugirió que el tamaño de la matriz en sí podría ser un problema. Una forma de confirmar esto fue llamar a remuestrear con el mismo espaciado ( [1,1,2] ), que funcionó bien. Otra forma era crear una matriz de números falsos de dicho tamaño cuestionable. Y...
Redoble de tambores por favor...
presentación...
por primera vez en la historia ... (en GitHub)
¡Una reproducción _shapeworks-free_!

array = np.ndarray([109, 77, 204])
itkw.view(image = array)

Así que pon eso en tu cuaderno y fúmalo *.

* humo que implica choque, no aboga por la inhalación real de nada, tenga en cuenta que esta es una instalación para no fumadores, no es válida con ninguna otra oferta, ... de todos modos, espero que alguien esté sonriendo, ¡porque este no es nuestro problema! Excepto que lo es. 😞

array = np.ndarray([109, 77, 204])
itkw.view(image = array)
array = np.ndarray([109, 109, 204])
itkw.view(image = array)



md5-047f51858ff0a12b3bec85f300fc2efa



array = np.ndarray([109, 109, 109])
itkw.view(image = array)

Todos estos ejemplos renderizan el visor itk cuando no se importan shapeworks.
Se bloquea cuando se importa shapeworks.

Hmm, ¿tenemos alguna interacción de biblioteca conda itk / vtk vs shapeworks itk / vtk?

Supongo que itkwidgets está usando otra versión de itk.

El orden de importación no es importante, pero el orden de uso sí lo es. Esto significa que si importa todo, pero usa itkwidgets antes de shapeworks, se bloquea cuando usa shapeworks y viceversa.

Dado que la solución al # 1179 fue simplemente "no lo use", propongo que resolvamos este problema de la misma manera. A menos que haya una opción mejor en este momento, eliminemos itkwidgets de nuestros cuadernos.

Suena como un buen plan por ahora. ¿Es razonable eliminar itkwidgets de los portátiles? ¿Para qué lo estamos usando?

Lo estamos usando para ver las segmentaciones. Creo que podemos usar pyvista en su lugar

Tenga en cuenta que pyvista (que yo sepa) no respeta la metainformación de la imagen (origen, espaciado de vóxeles, dirección de ejes), pero itkwidget sí.

Tenga en cuenta que pyvista (que yo sepa) no respeta la metainformación de la imagen (origen, espaciado de vóxeles, dirección de ejes), pero itkwidget sí.

Profundizaremos en esto, pero debe haber cierto respeto por el origen, ya que se pueden trazar múltiples volúmenes simultáneamente con diferentes ubicaciones, y esta imagen muestra que el espaciado se usa para trazar. Nuestras funciones sw2vtkImage simplemente no la mantuvieron (sé que cambié esto en algunos, pero tal vez estén en la nueva rama pybind).

Screen Shot 2021-03-26 at 1 34 32 PM

Quiero sugerir que publiquemos y llevemos esto a la próxima versión, ya que esa tiene muchas otras mejoras de Python y notebooks, y esencialmente nos veremos obligados a reescribirlas. Quizás simplemente dejamos que se rompan. Es un problema conocido en un repositorio público y tenemos una solución en caso de que algún usuario se encuentre con él.

(Todavía necesitaremos modificar el cuaderno de introducción a las segmentaciones para que se complete sin fallar, lo que simplemente significa elegir una imagen arbitraria diferente para demostrar la representación).

Estoy de acuerdo. Llevemos esto a la versión 6.1 y actualizaré las notas de la versión y el resumen gráfico para restar importancia a las cosas de Python.

Después de usar una imagen arbitraria que no bloquea al espectador, aún falla en 3 lugares más que usan la imagen de forma media.
@cchriste

Propongo que excluyamos este portátil del lanzamiento excepto en la documentación.

Funciona para mi. @sheryjoe ?

pyvista mostrando coordenadas lógicas
versus itkwidgets que muestran coordenadas físicas

Dado el número 900, es difícil imaginar que Itk haya mostrado alguna vez coordenadas físicas.

Para esta imagen (con z-spacing = 2):

{
    dims: [93, 87, 94],
    origin: [-24, -19, -21],
    size: [93, 87, 188],
    spacing: [1, 1, 2]
}

El visor de itk solo puede mostrar la versión sin escala, ya que de lo contrario se bloquea.
Screen Shot 2021-03-30 at 3 57 34 PM

Aquí hay un solo volumen de pyvista que muestra tanto el elipsoide sin escala como la versión a escala.
Screen Shot 2021-03-30 at 3 56 20 PM

Realmente no me gusta la forma en que el visor de pyvista muestra límites en comparación con el visor de itk.
Pero son correctos y muestran coordenadas físicas.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

akenmorris picture akenmorris  ·  32Comentarios

cchriste picture cchriste  ·  3Comentarios

akenmorris picture akenmorris  ·  16Comentarios

iyerkrithika21 picture iyerkrithika21  ·  12Comentarios

jadie1 picture jadie1  ·  8Comentarios