Skip to content

There are a large number of regular gaps in the predicted results #297

@XmySz

Description

@XmySz
Image 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions