def log_jaccard(im_id: str,
                cls: int,
                true_mask: np.ndarray,
                mask: np.ndarray,
                poly_mask: np.ndarray,
                true_poly: MultiPolygon,
                poly: MultiPolygon,
                valid_polygons=False):
    assert len(mask.shape) == 2
    pixel_jc = utils.mask_tp_fp_fn(mask, true_mask, 0.5)
    if valid_polygons:
        if not true_poly.is_valid:
            true_poly = utils.to_multipolygon(true_poly.buffer(0))
        if not poly.is_valid:
            poly = utils.to_multipolygon(poly.buffer(0))
        tp = true_poly.intersection(poly).area
        fn = true_poly.difference(poly).area
        fp = poly.difference(true_poly).area
        poly_jc = tp, fp, fn
    else:
        poly_jc = utils.mask_tp_fp_fn(poly_mask, true_mask, 0.5)
    logger.info(
        '{} cls-{} pixel jaccard: {:.5f}, polygon jaccard: {:.5f}'.format(
            im_id, cls, jaccard(pixel_jc), jaccard(poly_jc)))
    return pixel_jc, poly_jc
Beispiel #2
0
 def load_image(self, im_id: str) -> Image:
     logger.info('Loading {}'.format(im_id))
     im_cache = Path('im_cache')
     im_cache.mkdir(exist_ok=True)
     im_data_path = im_cache.joinpath('{}.data'.format(im_id))
     mask_path = im_cache.joinpath('{}.mask'.format(im_id))
     if im_data_path.exists():
         im_data = np.load(str(im_data_path))
     else:
         im_data = self.preprocess_image(utils.load_image(im_id))
         with im_data_path.open('wb') as f:
             np.save(f, im_data)
     pre_buffer = self.hps.pre_buffer
     if mask_path.exists() and not pre_buffer:
         mask = np.load(str(mask_path))
     else:
         im_size = im_data.shape[1:]
         poly_by_type = utils.load_polygons(im_id, im_size)
         if pre_buffer:
             structures = 2
             poly_by_type[structures] = utils.to_multipolygon(
                 poly_by_type[structures].buffer(pre_buffer))
         mask = np.array([
             utils.mask_for_polygons(im_size, poly_by_type[cls + 1])
             for cls in range(self.hps.total_classes)
         ],
                         dtype=np.uint8)
         if not pre_buffer:
             with mask_path.open('wb') as f:
                 np.save(f, mask)
     if self.hps.n_channels != im_data.shape[0]:
         im_data = im_data[:self.hps.n_channels]
     return Image(im_id, im_data, mask[self.hps.classes])
def get_polygons(im_id: str, mask: np.ndarray,
                 epsilon: float, min_area: float, fix: bool, buffer: float
                 ) -> Tuple[MultiPolygon, MultiPolygon]:
    assert len(mask.shape) == 2
    polygons = utils.mask_to_polygons(
        mask, epsilon=epsilon, min_area=min_area, fix=fix)
    if buffer:
        polygons = utils.to_multipolygon(polygons.buffer(buffer))
    x_scaler, y_scaler = utils.get_scalers(im_id, im_size=mask.shape)
    x_scaler = 1 / x_scaler
    y_scaler = 1 / y_scaler
    return polygons, shapely.affinity.scale(
        polygons, xfact=x_scaler, yfact=y_scaler, origin=(0, 0, 0))