Isso costumava ser "travamento do notebook começando com a limpeza de segmentação no MacOS", mas muitas investigações descobriram o problema real, possivelmente devido a bibliotecas compartilhadas incompatíveis.
Limpe o sistema, limpe o conda.
Esta é a célula que trava:
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
...
Sim, estou tentando executá-lo agora e encontrando a mesma falha, bem aqui:
`` `shapeSeg = shapeSegList [10]
itkw.view (image = sw2vtkImage (shapeSeg),
Slicing_planes = True,
axes = True,
rotate = True,
interpolação = True)
Simplificou o problema e parece que Image :: resample é o culpado aqui. Após a reamostragem, ellipsoid_05 carrega o visualizador enquanto ellipsoid_00 faz com que o kernel trave ao tentar usar itk.view ()
Depois de testar isso, algo _pode_ estar errado com Image :: resample wrt itkwidgets.view .
Imagens experimentadas: elipsoid_1mode / segmentations / ellipsoid_00.nrrd e ellipsoid_1mode / segmentations / ellipsoid_05.nrrd
-> 00 falha ao ser plotado quando empacotado por pyvista em uma imagem vtk após a reamostragem
-> 05 funciona bem
=> _both_ funciona bem quando plotado por pyvista
Eu joguei alguns spew de depuração em Image :: resample e não vi nada fora do comum até agora).
Aqui está um caderno simples, se você quiser experimentar.
wishy_washy_resample.ipynb.zip
... e o que parece vazio quando você carrega:
... e como fica quando você o executa. Altere 05 para 00 e execute-o novamente para travar quando o itkw tentar renderizar.
Transpor ou ... A matriz que pode ser renderizada
Se você se lembra, itkwidgets pode renderizar um array numpy diretamente. Mas ele interpreta esse array como a transposição do que é passado, algo que _não_ faz quando um array vtk é usado. Portanto, normalmente transpomos o que obtemos da imagem antes de envolvê-la em um array vtk e simplesmente usamos o array vtk com itkwidgets para manter as coisas simples.
Tentei os dois esta manhã e infelizmente não fez diferença. Transposto ou não, matrizes numpy ou vtk, tudo trava ao tentar renderizar usando itkwidgets após Image.resample.
Copiar ou ... Estou me repetindo?
A matriz proveniente da imagem pode ser o problema. Talvez esteja apontando para uma memória inválida. Então, vamos criar uma cópia!
Depois de copiar o array - em order='C'
e order='F'
, transpor, modificar, ficar de cabeça para baixo ao compor as funções e pensar de forma desejosa sobre tudo isso, _ ele ainda trava toda vez_.
Isso sugere que o tamanho do array em si pode ser um problema. Uma forma de confirmar isso era chamar a resample com o mesmo espaçamento ( [1,1,2]
), _que funcionou bem_. Outra maneira era criar uma matriz numpy falsa de tamanho questionável. E...
Por favor, rufem os tambores...
apresentando ...
pela primeira vez ... (no GitHub)
Uma reprodução _shapeworks-free_!
array = np.ndarray([109, 77, 204])
itkw.view(image = array)
Então, coloque isso no seu caderno e fume *.
* fumaça implicando acidente, não defendendo a inalação real de nada, observe que esta é uma instalação para não fumantes, não é válida com nenhuma outra oferta, ... de qualquer forma, espero que alguém esteja sorrindo, porque este não é o nosso problema! Exceto que é. 😞
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 esses exemplos renderizam o visualizador itk quando o shapeworks não é importado.
Ele trava quando o shapeworks é importado.
Hmm, temos alguma interação de biblioteca conda itk / vtk vs shapeworks itk / vtk acontecendo?
Eu acho que o itkwidgets está usando outra versão do itk
A ordem de importação não é importante, mas a ordem de uso é. Isso significa que se você importar tudo, mas usar itkwidgets antes do shapeworks, ele travará quando você usar o shapeworks e vice-versa.
Como a solução para o # 1179 foi simplesmente "não use itk", proponho que resolvamos esse problema da mesma forma. A menos que haja uma opção melhor no momento, vamos remover itkwidgets de nossos notebooks.
Parece um bom plano por enquanto. É razoável remover itkwidgets dos notebooks? Para que estamos usando isso?
Estamos usando para ver as segmentações. Acho que podemos usar pyvista em vez disso
Observe que o pyvista (até onde eu sei) não respeita a meta-informação da imagem (origem, espaçamento do voxel, direção dos eixos), mas o itkwidget sim.
Observe que o pyvista (até onde eu sei) não respeita a meta-informação da imagem (origem, espaçamento do voxel, direção dos eixos), mas o itkwidget sim.
Vamos nos aprofundar nisso, mas deve haver algum respeito pela origem, uma vez que vários volumes podem ser plotados simultaneamente com locais diferentes, e esta imagem mostra que o espaçamento é usado para plotagem. Nossas funções sw2vtkImage simplesmente não o mantiveram (sei que mudei isso em algumas, mas talvez essas estejam no novo branch pybind).
Quero sugerir que lançemos e enviemos isso para a próxima versão, uma vez que tem muitos outros aprimoramentos de Python e notebook e, essencialmente, seremos forçados a reescrevê-los. Talvez apenas deixemos que sejam quebrados. É um problema conhecido em um repositório público e temos uma solução alternativa para o caso de algum usuário encontrá-lo.
(Ainda teremos de modificar o bloco de notas de introdução às segmentações para que seja concluído sem travar, o que significa simplesmente escolher uma imagem arbitrária diferente para demonstrar a renderização.)
Eu concordo. Vamos empurrar para a versão 6.1 e atualizarei as notas de versão e o resumo gráfico para tirar a ênfase das coisas do Python.
Depois de usar uma imagem arbitrária que não trava o visualizador, ela ainda trava em mais 3 lugares que usam a imagem de forma média.
@cchriste
Proponho que excluamos este bloco de notas do lançamento, exceto na documentação.
Funciona para mim. @sheryjoe ?
pyvista mostrando coordenadas lógicas
https://sci.utah.edu/~shapeworks/doc-resources/mp4s/nb-groom-resample.mp4
versus itkwidgets mostrando coordenadas físicas
https://sci.utah.edu/~shapeworks/doc-resources/mp4s/nb-groom-resample-iso.mp4
pyvista mostrando coordenadas lógicas
versus itkwidgets mostrando coordenadas físicas
Dado o problema nº 900, é difícil imaginar que o itk já tenha mostrado as coordenadas físicas.
Para esta imagem (com espaçamento z = 2):
{
dims: [93, 87, 94],
origin: [-24, -19, -21],
size: [93, 87, 188],
spacing: [1, 1, 2]
}
O visualizador itk só pode mostrar a versão fora de escala, caso contrário, ele trava.
Aqui está um único volume pyvista mostrando o elipsóide fora de escala e a versão em escala.
Eu realmente não gosto da maneira como o visualizador pyvista mostra os limites em comparação com o visualizador itk.
Mas eles estão corretos e estão mostrando as coordenadas físicas.