bowang-lab / MedSAMSlicer

3D Slicer Plugin for Segment anything in medical images
https://www.nature.com/articles/s41467-024-44824-z
148 stars 18 forks source link

Error on Windows + Slicer 5.6.1 #24

Closed dzenanz closed 1 day ago

dzenanz commented 3 months ago

Using the latest master (dc5a85e45777da3779c0cd74a928d77d20b5031d), just switching to the module produces an error in the log:

Traceback (most recent call last):
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 256, in setup
    self.initializeParameterNode()
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 375, in initializeParameterNode
    self.setParameterNode(self.logic.getParameterNode())
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 438, in getParameterNode
    return MedSAMLiteParameterNode(super().getParameterNode())
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 138, in _initMethod
    parameter.write(self.parameterNode, parameter.default.value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 41, in write
    self.serializer.write(parameterNode, self.name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 161, in write
    self.serializer.write(parameterNode, name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 580, in write
    newLen = len(values)
TypeError: object of type 'NoneType' has no len()
Traceback (most recent call last):
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 342, in enter
    self.initializeParameterNode()
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 375, in initializeParameterNode
    self.setParameterNode(self.logic.getParameterNode())
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 438, in getParameterNode
    return MedSAMLiteParameterNode(super().getParameterNode())
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 138, in _initMethod
    parameter.write(self.parameterNode, parameter.default.value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 41, in write
    self.serializer.write(parameterNode, self.name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 161, in write
    self.serializer.write(parameterNode, name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 580, in write
    newLen = len(values)
TypeError: object of type 'NoneType' has no len()

Is this a known issue?

dzenanz commented 3 months ago

Clicking on Send Image results in:

Traceback (most recent call last):
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 239, in <lambda>
    self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage(partial=False))
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 635, in sendImage
    self.run_server()
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 600, in run_server
    self.backend = MedSAM_Interface()
NameError: name 'MedSAM_Interface' is not defined
rasakereh commented 3 months ago

Thank you for your feedback. You are using Road_To_Extension_Manager branch which was not fully ready to be run. At the moment of posting this answer to your feedback, the plugin works properly on this branch too, however, it is still under development.

dzenanz commented 3 months ago

5bd55948f45dff81a601e39fd57ba42852045325 also has problems. Just switching to the module results in:

Switch to module:  "Welcome"
Switch to module:  "MedSAMLite"
QLayout::addChildLayout: layout "" already has a parent
vtkMRMLScriptedModuleNode (000001EE5362EBF0)
  ID: vtkMRMLScriptedModuleNodeMedSAMLite
  ClassName: vtkMRMLScriptedModuleNode
  Name: MedSAMLite
  Debug: false
  MTime: 202436
  Description: (none)
  SingletonTag: MedSAMLite
  HideFromEditors: true
  Selectable: true
  Selected: false
  UndoEnabled: false
  Attributes:
    ModuleName:MedSAMLite
  ModuleName: (none)

Traceback (most recent call last):
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 255, in setup
    self.initializeParameterNode()
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 380, in initializeParameterNode
    self.setParameterNode(self.logic.getParameterNode())
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 444, in getParameterNode
    return MedSAMLiteParameterNode(super().getParameterNode())
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 138, in _initMethod
    parameter.write(self.parameterNode, parameter.default.value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 41, in write
    self.serializer.write(parameterNode, self.name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 161, in write
    self.serializer.write(parameterNode, name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 580, in write
    newLen = len(values)
TypeError: object of type 'NoneType' has no len()
vtkMRMLScriptedModuleNode (000001EE5362EBF0)
  ID: vtkMRMLScriptedModuleNodeMedSAMLite
  ClassName: vtkMRMLScriptedModuleNode
  Name: MedSAMLite
  Debug: false
  MTime: 202439
  Description: (none)
  SingletonTag: MedSAMLite
  HideFromEditors: true
  Selectable: true
  Selected: false
  UndoEnabled: false
  Attributes:
    ModuleName:MedSAMLite
  Node references:
    roiNode: (none)
    segmentationNode: (none)
  ModuleName: (none)
  roiNode: 
  segmentationNode: 

Traceback (most recent call last):
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 347, in enter
    self.initializeParameterNode()
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 380, in initializeParameterNode
    self.setParameterNode(self.logic.getParameterNode())
  File "C:/Dev/Work/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 444, in getParameterNode
    return MedSAMLiteParameterNode(super().getParameterNode())
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 138, in _initMethod
    parameter.write(self.parameterNode, parameter.default.value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\wrapper.py", line 41, in write
    self.serializer.write(parameterNode, self.name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 161, in write
    self.serializer.write(parameterNode, name, value)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\bin\Python\slicer\parameterNodeWrapper\serializers.py", line 580, in write
    newLen = len(values)
TypeError: object of type 'NoneType' has no len()

I was trying this because v0.0.6 stopped working:

Switch to module:  "Welcome"
Switch to module:  "MedSAMLite"
QLayout::addChildLayout: layout "" already has a parent
"Volume" Reader has successfully read the file "M:/Dev/Work/SoW2/Sawbones segmentation.png" "[0.05s]"
ctkSliderWidget::setSingleStep()  0 is out of bounds. 0 100 1
Terminating possible server duplicates...
Running server...
Starting new HTTP connection (1): 127.0.0.1:5555
C:\Dev\Work\MedSAMSlicer\server_essentials\tiny_vit_sam.py:662: UserWarning: Overwriting tiny_vit_5m_224 in registry with tiny_vit_sam.tiny_vit_5m_224. This is because the name being registered conflicts with an existing name. Please check if this is not expected.
  return register_model(fn_wrapper)
C:\Dev\Work\MedSAMSlicer\server_essentials\tiny_vit_sam.py:662: UserWarning: Overwriting tiny_vit_11m_224 in registry with tiny_vit_sam.tiny_vit_11m_224. This is because the name being registered conflicts with an existing name. Please check if this is not expected.
  return register_model(fn_wrapper)
C:\Dev\Work\MedSAMSlicer\server_essentials\tiny_vit_sam.py:662: UserWarning: Overwriting tiny_vit_21m_224 in registry with tiny_vit_sam.tiny_vit_21m_224. This is because the name being registered conflicts with an existing name. Please check if this is not expected.
  return register_model(fn_wrapper)
C:\Dev\Work\MedSAMSlicer\server_essentials\tiny_vit_sam.py:662: UserWarning: Overwriting tiny_vit_21m_384 in registry with tiny_vit_sam.tiny_vit_21m_384. This is because the name being registered conflicts with an existing name. Please check if this is not expected.
  return register_model(fn_wrapper)
C:\Dev\Work\MedSAMSlicer\server_essentials\tiny_vit_sam.py:662: UserWarning: Overwriting tiny_vit_21m_512 in registry with tiny_vit_sam.tiny_vit_21m_512. This is because the name being registered conflicts with an existing name. Please check if this is not expected.
  return register_model(fn_wrapper)
Starting new HTTP connection (1): 127.0.0.1:5555
INFO:     Started server process [55968]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:5555 (Press CTRL+C to quit)
Loading MedSAM lite model, a sec
MedSam lite loaded, took 0.21695470000000006
Loading MedSAM lite model, a sec
MedSam lite loaded, took 0.24234659999999986
INFO:     127.0.0.1:53376 - "POST /getServerState HTTP/1.1" 200 OK
http://127.0.0.1:5555 "POST /getServerState HTTP/1.1" 200 19
sending setImage request...
Starting new HTTP connection (1): 127.0.0.1:5555
-160 240
INFO:     127.0.0.1:53382 - "POST /setImage HTTP/1.1" 200 OK
http://127.0.0.1:5555 "POST /setImage HTTP/1.1" 200 4
Response from setImage: null
sending numpy array:
frame sent
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 404, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 84, in __call__
    return await self.app(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\fastapi\applications.py", line 1054, in __call__
    await super().__call__(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\applications.py", line 123, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\middleware\errors.py", line 186, in __call__
    raise exc
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
    await self.app(scope, receive, _send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\middleware\exceptions.py", line 62, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\_exception_handler.py", line 64, in wrapped_app
    raise exc
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    await app(scope, receive, sender)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\routing.py", line 762, in __call__
    await self.middleware_stack(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\routing.py", line 782, in app
    await route.handle(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\routing.py", line 297, in handle
    await self.app(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\routing.py", line 77, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\_exception_handler.py", line 64, in wrapped_app
    raise exc
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    await app(scope, receive, sender)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\routing.py", line 75, in app
    await response(scope, receive, send)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\responses.py", line 158, in __call__
    await self.background()
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\background.py", line 43, in __call__
    await task()
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\background.py", line 28, in __call__
    await run_in_threadpool(self.func, *self.args, **self.kwargs)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpool
    return await anyio.to_thread.run_sync(func, *args)
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\anyio\to_thread.py", line 56, in run_sync
    return await get_async_backend().run_sync_in_worker_thread(
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\anyio\_backends\_asyncio.py", line 2134, in run_sync_in_worker_thread
    return await future
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.1\lib\Python\Lib\site-packages\anyio\_backends\_asyncio.py", line 851, in run
    result = context.run(func, *args)
  File "C:\Dev\Work\MedSAMSlicer\server_essentials\server.py", line 224, in get_image
    H, W = arr.shape[1:]
ValueError: too many values to unpack (expected 2)
Starting new HTTP connection (1): 127.0.0.1:5555
(1, 897, 1461, 4)
wmin: -1, wmax: 256
INFO:     127.0.0.1:53386 - "POST /getProgress HTTP/1.1" 200 OK
http://127.0.0.1:5555 "POST /getProgress HTTP/1.1" 200 42
Starting new HTTP connection (1): 127.0.0.1:5555
rasakereh commented 3 months ago

Would you please try now with the latest released version? thanks!

dzenanz commented 3 months ago

My newest attempt is described in #28.

dzenanz commented 3 months ago

Re-installing PyTorch and MedSAMSlicer in Slicer 5.6.1 results in, after clicking Send Image:

Loading MedSAM lite model...
MedSam lite loaded, took 1.0566139999999962
wmin: -1, wmax: 256
Traceback (most recent call last):
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 241, in <lambda>
    self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage(partial=False))
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 662, in sendImage
    self.backend.set_image(self.image_data, -160, 240, zmin, zmax, recurrent_func=slicer.app.processEvents)
  File "m:\dev\medsamslicer\medsam\medsamlite\resources\server_essentials\medsam_interface\interface_impl.py", line 211, in set_image
    self.H, self.W = arr.shape[1:]
ValueError: too many values to unpack (expected 2)
Switch to module:  "VectorToScalarVolume"
Conversion mode is ConversionMethods.LUMINANCE
ComponentToExtract is 0
Switch to module:  "MedSAMLite"
ctkSliderWidget::setSingleStep()  0 is out of bounds. 0 100 1
wmin: -1, wmax: 256
Traceback (most recent call last):
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 241, in <lambda>
    self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage(partial=False))
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 662, in sendImage
    self.backend.set_image(self.image_data, -160, 240, zmin, zmax, recurrent_func=slicer.app.processEvents)
  File "m:\dev\medsamslicer\medsam\medsamlite\resources\server_essentials\medsam_interface\interface_impl.py", line 211, in set_image
    self.H, self.W = arr.shape[1:]
ValueError: too many values to unpack (expected 2)

Converting from RGB to grayscale does not help.

AndrewWang996 commented 2 months ago

Also facing the same issue after loading in and trying to segment a single bmp file

Traceback (most recent call last):
  File "C:/Users/AndyWang/Downloads/MedSAMSlicer-0.1/MedSAMSlicer-0.1/MedSAM/MedSAMLite/MedSAMLite.py", line 241, in <lambda>
    self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage(partial=False))
  File "C:/Users/AndyWang/Downloads/MedSAMSlicer-0.1/MedSAMSlicer-0.1/MedSAM/MedSAMLite/MedSAMLite.py", line 662, in sendImage
    self.backend.set_image(self.image_data, -160, 240, zmin, zmax, recurrent_func=slicer.app.processEvents)
  File "c:\users\andywang\downloads\medsamslicer-0.1\medsamslicer-0.1\medsam\medsamlite\resources\server_essentials\medsam_interface\interface_impl.py", line 211, in set_image
    self.H, self.W = arr.shape[1:]
ValueError: too many values to unpack (expected 2)

Any resolution to this?

dzenanz commented 1 month ago

I figured out the problem. MedSAMSlicer does not work with color images. If color image is first "sent" to the model, it enters an unrecoverable error state. If grayscale image is "sent" first after loading Slicer, then it works. Here are screenshots with both success and failure:

Screenshot 2024-08-20 14 42 04 Screenshot 2024-08-20 14 44 12
rasakereh commented 4 weeks ago

I believe the problem is not with the image being colored, but mainly the fact that it's not a 3d image rather a 2d image. Could you please confirm if i'm right?

dzenanz commented 4 weeks ago

2D is not the problem. It works with the grayscale image.

dzenanz commented 4 weeks ago

Here are both input images, the non-problematic gray and problem color image:

Screenshot 2024-06-06 16 17 00-gray Screenshot 2024-06-06 16 17 00
rasakereh commented 1 week ago

Thanks for sharing, the debug process for this issue actually revealed a few problems in the code base. They are addressed now at (the latest release)[https://github.com/bowang-lab/MedSAMSlicer/releases/tag/v0.11] along with numerous new features.

dzenanz commented 1 week ago

In-place update results in non-usable extension:

Switch to module:  "MedSAMLite"
Traceback (most recent call last):
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 242, in <lambda>
    self.ui.pbSendImage.connect('clicked(bool)', lambda: self.logic.sendImage(partial=False))
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 767, in sendImage
    self.run_server()
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 729, in run_server
    self.backend.set_engine(self.widget.ui.cmbEngine.currentText)
AttributeError: 'NoneType' object has no attribute 'set_engine'
Screenshot 2024-09-25 14 23 35

Trying to select "OpenVINO" results in a hang:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.2\lib\Python\Lib\threading.py", line 973, in _bootstrap_inner
    self.run()
  File "C:\Users\Dzenan\AppData\Local\slicer.org\Slicer 5.6.2\lib\Python\Lib\threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "M:/Dev/MedSAMSlicer/MedSAM/MedSAMLite/MedSAMLite.py", line 716, in download_model
    gdown.download_folder(url=url, output=model_path)
NameError: name 'gdown' is not defined
rasakereh commented 1 week ago

In place update is glitchy at this point. Would you download the latest release and reinstall?

dzenanz commented 1 week ago

And that means removing and reinstalling Slicer, then adding this to modules?

rasakereh commented 1 week ago

No need to remove slicer, just the module files. I'd say downloading the files in a new path would be even better

dzenanz commented 1 week ago

I have cloned this repo using git. What else is needed in addition to resetting to the new version and cleaning up the repository (removing untracked files and directories)?

rasakereh commented 1 week ago

it should be enough, did it not work?

dzenanz commented 1 week ago

It didn't, see above. Perhaps that issue is unrelated to update?

rasakereh commented 2 days ago

No, there is a problem with my dependency check. When new version has new dependencies, I have to consider them with more caution. Can you git pull again. (there are changes in the branch names and master is renamed to main now. simple pull might be erroneous. visit plugin homepage and you'll get extra instructions if necessary)

dzenanz commented 1 day ago

Thank you. It no longer crashes, and it works on color images.

Screenshot 2024-10-02 15 11 41
dzenanz commented 1 day ago

@AndrewWang996 now might be a good time to re-check this extension.