make pipeline progress more accurate and complete
This commit is contained in:
parent
746f2f56cd
commit
1cf8c7eff6
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue