Source code for wsinfer.qupath
from __future__ import annotations
import json
import sys
from pathlib import Path
try:
from paquo.images import QuPathPathObjectHierarchy
from paquo.projects import QuPathProject
from paquo.projects import QuPathProjectImageEntry
except Exception:
HAS_PAQUO = False
[docs]
def add_image_and_geojson(
qupath_proj: QuPathProject,
*,
image_path: Path | str,
geojson_path: Path | str,
) -> None:
with open(geojson_path) as f:
try:
geojson_features = json.load(f)["features"]
except Exception as e:
print(f"Unable to find features key:: {e}")
entry = qupath_proj.add_image(image_path)
if not isinstance(entry, QuPathProjectImageEntry):
print("!!!!!!!!!!!!!!!!!!!!!")
print(
"Runtime error, please contact developer, explaining that the entry when"
" adding an image returns a list of image entry objects."
)
return
try:
hierarchy: QuPathPathObjectHierarchy = entry.hierarchy
hierarchy.load_geojson(geojson_features)
except Exception as e:
print(f"Failed to run load_geojson function with error:: {e}")
[docs]
def make_qupath_project(wsi_dir: Path, results_dir: Path) -> None:
if not HAS_PAQUO:
print(
"""Cannot find QuPath.
QuPath is required to use this functionality but it cannot be found.
If QuPath is installed, please use define the environment variable
PAQUO_QUPATH_DIR with the location of the QuPath installation.
If QuPath is not installed, please install it from https://qupath.github.io/."""
)
sys.exit(1)
else:
print("Found QuPath successfully!")
QUPATH_PROJECT_DIRECTORY = results_dir / "model-outputs-qupath"
csv_files = list((results_dir / "model-outputs-csv").glob("*.csv"))
slides_and_geojsons = []
for csv_file in csv_files:
file_name = csv_file.stem
json_file = results_dir / "model-outputs-geojson" / (file_name + ".json")
image_file = wsi_dir / (file_name + ".svs")
if json_file.exists() and image_file.exists():
matching_pair = (image_file, json_file)
slides_and_geojsons.append(matching_pair)
else:
print(f"Skipping CSV: {csv_file.name} (No corresponding JSON)")
with QuPathProject(QUPATH_PROJECT_DIRECTORY, mode="w") as qp:
for image_path, geojson_path in slides_and_geojsons:
try:
add_image_and_geojson(
qp, image_path=image_path, geojson_path=geojson_path
)
except Exception as e:
print(f"Failed to add image/geojson with error:: {e}")
print("Successfully created QuPath Project!")