Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ all = [
"uvicorn[standard]>=0.32.0",
"opencv-python-headless>=4.11.0.86",
"histomicstk>=1.3.14",
"tiatoolbox>=2.1.3",
]

dev = [
Expand All @@ -162,6 +163,9 @@ dev = [
histomicstk = [
"histomicstk>=1.3.14",
]
tiatoolbox = [
"tiatoolbox>=2.1.3",
]

[build-system]
requires = ["uv_build>=0.9.26,<0.10.0"]
Expand All @@ -171,8 +175,8 @@ build-backend = "uv_build"
url = "https://girder.github.io/large_image_wheels"

[[tool.uv.index]]
name = "pytorch-cu129"
url = "https://download.pytorch.org/whl/cu129"
name = "pytorch-cu126"
url = "https://download.pytorch.org/whl/cu126"
explicit = true

[tool.uv.build-backend]
Expand All @@ -185,11 +189,12 @@ trident = { git = "https://github.com/mahmoodlab/trident.git", rev = "adf3b7e8fd
tissue-segmentation = { git = "https://github.com/imi-bigpicture/tissue-segmentation.git", subdirectory = "tissue_segmentation", rev = "6d97a25a8255f591eb2c705611a32a5f56101a25"}
sam-2 = { git = "https://github.com/facebookresearch/sam2.git", rev = "2b90b9f5ceec907a1c18123530e92e794ad901a4" }
torch = [
{ index = "pytorch-cu129", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
{ index = "pytorch-cu126", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]
torchvision = [
{ index = "pytorch-cu129", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
{ index = "pytorch-cu126", marker = "sys_platform == 'linux' or sys_platform == 'win32'" },
]
tiatoolbox = { git = "https://github.com/TissueImageAnalytics/tiatoolbox", rev = "0482082c0934abf095b43cd60dd9b8db002755c5" }

[tool.uv]
index-strategy = "unsafe-best-match"
Expand All @@ -201,6 +206,9 @@ exclude-dependencies = [
"tensorflow-cpu",
"opencv-python", # ultralytics installs the wrong opencv package
]
override-dependencies = [
{ package = { name = "trident", version = "0.2.3" }, dependencies = ["timm>=1.0.3"] }, # It's very strict on an early timm version, while tiatoolbox requires >=1.0.3.
]

[tool.uv.extra-build-dependencies]
imagecodecs-numcodecs = ["imagecodecs", "numcodecs"]
1 change: 1 addition & 0 deletions run.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
# =============================================================================

METHODS = [
seg.TIAToolboxSegmenter(),
seg.EntropyMaskerSegmenter(mpp=20),
seg.BackgroundSubtractorMOG2Segmenter(mpp=20),
seg.FESISegmenter(mpp=20),
Expand Down
1 change: 1 addition & 0 deletions segmenteer/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
"TRIDENTHESTSegmenter": ("segmenteer.methods.dl.trident", "TRIDENTHESTSegmenter"),
"TRIDENTPathProfilerSegmenter": ("segmenteer.methods.dl.trident", "TRIDENTPathProfilerSegmenter"),
"TRIDENTCPGSegmenter": ("segmenteer.methods.dl.trident", "TRIDENTCPGSegmenter"),
"TIAToolboxSegmenter": ("segmenteer.methods.dl.tiatoolbox", "TIAToolboxSegmenter"),
}


Expand Down
6 changes: 6 additions & 0 deletions segmenteer/methods/dl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@
except ImportError:
RTLucassenSlideSegmenter = None # type: ignore[assignment]

try:
from segmenteer.methods.dl.tiatoolbox import TIAToolboxSegmenter
except ImportError:
TIAToolboxSegmenter = None

try:
from segmenteer.methods.dl.trident import (
TRIDENTGrandQCSegmenter,
Expand All @@ -46,4 +51,5 @@
"BigPictureSegmenter",
"TRIDENTPathProfilerSegmenter",
"TRIDENTCPGSegmenter",
"TIAToolboxSegmenter",
]
32 changes: 32 additions & 0 deletions segmenteer/methods/dl/tiatoolbox.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# >>> from tiatoolbox.models.engine.semantic_segmentor import SemanticSegmentor
# >>> segmentor = SemanticSegmentor(model="efficientunet-tissue_mask")
# >>> results = segmentor.run(
# ... ["/example_wsi.svs"],
# ... masks=None,
# ... auto_get_mask=False,
# ... patch_mode=False,
# ... save_dir=Path("/tissue_mask/"),
# ... output_type="annotationstore",
# ... )

from tiatoolbox.models.engine.semantic_segmentor import SemanticSegmentor

from segmenteer.core.base import PathSegmenter

class TIAToolboxSegmenter(PathSegmenter):
def name() -> str:
return "tiatoolbox"

def _segment_path(self, image_path, output_path):
segmentor = SemanticSegmentor(model="efficientunet-tissue_mask")
save_dir = output_path.parent / "output"
results = segmentor.run(
[image_path],
masks=None,
auto_get_mask=False,
patch_mode=False,
save_dir=save_dir,
output_type="dict",
device="cuda",
)
print(results)
Loading