1
0
Fork 0

make pipeline progress more accurate and complete

This commit is contained in:
Sean Sube 2024-01-12 23:28:52 -06:00
parent 746f2f56cd
commit 1cf8c7eff6
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
3 changed files with 16 additions and 11 deletions

View File

@ -124,12 +124,13 @@ class ChainPipeline:
callback = ChainProgress.from_progress(callback) callback = ChainProgress.from_progress(callback)
# set estimated totals # set estimated totals
steps = params.steps
if "size" in pipeline_kwargs and isinstance(pipeline_kwargs["size"], Size): if "size" in pipeline_kwargs and isinstance(pipeline_kwargs["size"], Size):
size = pipeline_kwargs["size"] size = pipeline_kwargs["size"]
steps = self.steps(params, size) else:
size = sources.size()
worker.set_totals(steps, stages=len(self.stages), tiles=0) total_steps = self.steps(params, size)
worker.set_totals(total_steps, stages=len(self.stages), tiles=0)
start = monotonic() start = monotonic()
@ -182,6 +183,7 @@ class ChainPipeline:
source_tile: List[Image.Image], source_tile: List[Image.Image],
tile_mask: Image.Image, tile_mask: Image.Image,
dims: Tuple[int, int, int], dims: Tuple[int, int, int],
progress: Tuple[int, int],
) -> List[Image.Image]: ) -> List[Image.Image]:
for _i in range(worker.retries): for _i in range(worker.retries):
try: try:
@ -203,7 +205,7 @@ class ChainPipeline:
for j, image in enumerate(tile_result.as_image()): for j, image in enumerate(tile_result.as_image()):
save_image(server, f"last-tile-{j}.png", image) save_image(server, f"last-tile-{j}.png", image)
worker.set_tiles(worker.tiles.current + 1) worker.set_tiles(current=progress[0], total=progress[1])
return tile_result return tile_result
except CancelledException as err: except CancelledException as err:

View File

@ -26,7 +26,7 @@ class TileCallback(Protocol):
""" """
def __call__( def __call__(
self, sources: List[Image.Image], mask: Image.Image, dims: Tuple[int, int, int] self, sources: List[Image.Image], mask: Image.Image, dims: Tuple[int, int, int], progress: Tuple[int, int]
) -> StageResult: ) -> StageResult:
""" """
Run this stage against a single tile. Run this stage against a single tile.
@ -268,11 +268,13 @@ def process_tile_stack(
tiles: List[Tuple[int, int, Image.Image]] = [] tiles: List[Tuple[int, int, Image.Image]] = []
tile_coords = tile_generator(width, height, tile, overlap) tile_coords = tile_generator(width, height, tile, overlap)
single_tile = len(tile_coords) == 1
total_tiles = len(tile_coords)
single_tile = total_tiles == 1
for counter, (left, top) in enumerate(tile_coords): for counter, (left, top) in enumerate(tile_coords):
logger.info( logger.info(
"processing tile %s of %s, %sx%s", counter, len(tile_coords), left, top "processing tile %s of %s, %sx%s", counter, total_tiles, left, top
) )
right = left + tile right = left + tile
@ -341,8 +343,9 @@ def process_tile_stack(
tile_mask = mask.crop((left, top, right, bottom)) tile_mask = mask.crop((left, top, right, bottom))
for image_filter in filters: for image_filter in filters:
tile_stack = image_filter(tile_stack, tile_mask, (left, top, tile)) tile_stack = image_filter(tile_stack, tile_mask, (left, top, tile), (counter, total_tiles))
# TODO: this should be inverted to extract them from the result
if isinstance(tile_stack, list): if isinstance(tile_stack, list):
tile_stack = StageResult.from_images(tile_stack, metadata=stack.metadata) tile_stack = StageResult.from_images(tile_stack, metadata=stack.metadata)

View File

@ -189,9 +189,9 @@ class WorkerContext:
self.tiles = self.tiles.update(current) self.tiles = self.tiles.update(current)
def set_totals(self, steps: int, stages: int = 0, tiles: int = 0) -> None: def set_totals(self, steps: int, stages: int = 0, tiles: int = 0) -> None:
self.steps.total = steps self.steps = Progress(0, steps)
self.stages.total = stages self.stages.total = Progress(0, stages)
self.tiles.total = tiles self.tiles.total = Progress(0, tiles)
def finish(self) -> None: def finish(self) -> None:
if self.job is None: if self.job is None: