def test_callable_data(self): def fn(*x): raise ValueError(x) # 1D test tiler = Tiler(data_shape=(100, ), tile_shape=(10, )) for i in range(tiler.n_tiles): with self.assertRaises(ValueError) as cm: tiler.get_tile(fn, i) np.testing.assert_equal( cm.exception.args[0], (*tiler.get_tile_bbox_position(i)[0], *tiler.tile_shape)) # 2D test tiler = Tiler(data_shape=(100, 100), tile_shape=(10, 20)) for i in range(tiler.n_tiles): with self.assertRaises(ValueError) as cm: tiler.get_tile(fn, i) np.testing.assert_equal( cm.exception.args[0], (*tiler.get_tile_bbox_position(i)[0], *tiler.tile_shape)) # 3D test tiler = Tiler(data_shape=(100, 100, 100), tile_shape=(10, 20, 50)) for i in range(tiler.n_tiles): with self.assertRaises(ValueError) as cm: tiler.get_tile(fn, i) np.testing.assert_equal( cm.exception.args[0], (*tiler.get_tile_bbox_position(i)[0], *tiler.tile_shape)) # channel dimension test tiler = Tiler(data_shape=(100, 100, 3), tile_shape=(10, 20, 3), channel_dimension=2) for i in range(tiler.n_tiles): with self.assertRaises(ValueError) as cm: tiler.get_tile(fn, i) np.testing.assert_equal( cm.exception.args[0], (*tiler.get_tile_bbox_position(i, with_channel_dim=True)[0], *tiler.tile_shape))
return img print('Loading and processing tiles') imgs = [] for i, img in tqdm(tiler.iterate(reader_func), total=len(tiler)): imgs.append(preprocess(img)) masks, flows, styles, diams = model.eval( imgs, diameter=diameter, channels=channels) # Process shapes print('Converting masks to shapes') geoms = [] for tile_idx, mask in tqdm(enumerate(masks), total=len(masks)): x_offset, y_offset, _ = tiler.get_tile_bbox_position(tile_idx)[0] for i in range(mask.max()): m = (mask == i+1).astype(np.uint8) c, hier = cv2.findContours(m, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) c = max(c, key=cv2.contourArea).squeeze() c[:, 0] = c[:, 0] + x_offset/downsample c[:, 1] = c[:, 1] + y_offset/downsample new_poly = Polygon(c) # Try to fix invalid geoms if new_poly.is_valid: geoms.append(new_poly) else: geoms.append(new_poly.buffer(0)) # an auxiliary dictionary to get the original indices
def test_tile_bbox_position(self): tile_size = 10 tiler = Tiler(data_shape=self.data.shape, tile_shape=(tile_size, )) tiler2 = Tiler(data_shape=(3, ) + self.data.shape, tile_shape=( 3, tile_size, ), channel_dimension=0) with self.assertRaises(IndexError): tiler.get_tile_bbox_position(-1) with self.assertRaises(IndexError): tiler.get_tile_bbox_position(len(tiler)) tile_id = 0 np.testing.assert_equal(([0], [10]), tiler.get_tile_bbox_position(tile_id)) np.testing.assert_equal(([0], [10]), tiler.get_tile_bbox_position(tile_id, True)) np.testing.assert_equal(([0], [10]), tiler2.get_tile_bbox_position(tile_id)) np.testing.assert_equal(([0, 0], [3, 10]), tiler2.get_tile_bbox_position(tile_id, True)) tile_id = len(tiler) - 1 np.testing.assert_equal(([90], [100]), tiler.get_tile_bbox_position(tile_id)) np.testing.assert_equal(([90], [100]), tiler.get_tile_bbox_position(tile_id, True)) np.testing.assert_equal(([90], [100]), tiler2.get_tile_bbox_position(tile_id)) np.testing.assert_equal(([0, 90], [3, 100]), tiler2.get_tile_bbox_position(tile_id, True))