-
Notifications
You must be signed in to change notification settings - Fork 271
Open
Description
Hello author, first of all, thank you for your great work. Recently, I encountered some problems while using Mongolian pre trained weights to predict a batch of HE stained images of endometrial cancer. Some images showed obvious rasterization in the prediction results, and there were regular gaps between each patch. In the future, I will run the following command:
python run_infer.py --gpu=0 --nr_types=5 --batch_size=64 --model_mode=fast --model_path=hovernet_fast_monusac_type_tf2pytorch.tar --type_info_path=type_info.json --nr_inference_workers=1 --nr_post_proc_workers=8 wsi --input_dir=testWSI --output_dir=testWSIout --input_mask_dir=testWSImasks
Here is the code I used to generate the mask:
import argparse, os, json, numpy as np
from tqdm import tqdm
from PIL import Image, ImageDraw
import geopandas as gpd
import openslide
from shapely.geometry import shape, Polygon, MultiPolygon
from shapely import affinity
from rasterio import features
def geojson_to_mask(wsi_path, geo_path, out_path, level=8, use_rasterio=True):
slide = openslide.OpenSlide(wsi_path)
level = min(level, slide.level_count - 1)
w, h = slide.level_dimensions[level]
down_factor = slide.level_downsamples[level]
gdf = gpd.read_file(geo_path)
polys = [geom for geom in gdf.geometry if isinstance(geom, (Polygon, MultiPolygon))]
if not polys:
print(f'[{os.path.basename(wsi_path)}] No polygon, skip.')
return
def scale_geom(geom):
return affinity.scale(
geom,
xfact=1.0 / down_factor,
yfact=1.0 / down_factor,
origin=(0, 0)
)
scaled_polys = [scale_geom(p) for p in polys]
if use_rasterio:
mask = features.rasterize(
((g, 255) for g in scaled_polys),
out_shape=(h, w),
fill=0,
dtype=np.uint8
)
else:
img = Image.new("L", (w, h), 0)
draw = ImageDraw.Draw(img)
for g in scaled_polys:
if isinstance(g, Polygon):
draw.polygon(list(g.exterior.coords), outline=255, fill=255)
else:
for sub in g:
draw.polygon(list(sub.exterior.coords), outline=255, fill=255)
mask = np.array(img, dtype=np.uint8)
Image.fromarray(mask, mode="L").save(out_path, compress_level=1)
slide.close()
def batch_convert(wsi_dir, geojson_dir, mask_dir, level=8):
os.makedirs(mask_dir, exist_ok=True)
wsi_files = [f for f in os.listdir(wsi_dir) if f.lower().endswith(('.svs', '.tif', '.tiff', '.ndpi'))]
for fname in tqdm(wsi_files, desc="Converting"):
stem = os.path.splitext(fname)[0]
wsi = os.path.join(wsi_dir, fname)
geo = os.path.join(geojson_dir, stem + '.geojson')
out = os.path.join(mask_dir, stem + '.png')
if not os.path.exists(geo):
print(f'[WARN] {geo} not found, skip.')
continue
geojson_to_mask(wsi, geo, out, level=level)
if __name__ == "__main__":
wsi_dir = r"Z:\Zyn\PyCharmProjects\hover_net\testWSI"
geojson_dir = r"D:\Data\Temp\WSIgeojson"
mask_dir = r"Z:\Zyn\PyCharmProjects\hover_net\testWSImasks"
batch_convert(wsi_dir, geojson_dir, mask_dir, level=8)
I don't know where the problem occurred. I have searched in the problem area and no one has similar questions. Looking forward to your reply
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels