working demo code with significant speed-up #1

Merged
foefl merged 8 commits from demo into main 2026-03-02 14:49:18 +00:00
3 changed files with 88 additions and 14 deletions
Showing only changes of commit cc664b0369 - Show all commits

View File

@ -8,17 +8,21 @@ profiler = cProfile.Profile()
PROFILE = True PROFILE = True
USE_NEW_IMPL = True USE_NEW_IMPL = True
ONLY_PREPARE = False
def main() -> None: def main() -> None:
_prepare_env.main() _prepare_env.main()
if ONLY_PREPARE:
return
if PROFILE: if PROFILE:
profiler.enable() profiler.enable()
monitor_folder_simple(use_new=USE_NEW_IMPL) monitor_folder_simple(use_new=USE_NEW_IMPL)
profiler.disable() profiler.disable()
stats = pstats.Stats(profiler).sort_stats("cumtime") stats = pstats.Stats(profiler).sort_stats("cumtime")
stats.print_stats(15) stats.print_stats(20)
else: else:
monitor_folder_simple(use_new=USE_NEW_IMPL) monitor_folder_simple(use_new=USE_NEW_IMPL)

View File

@ -1,5 +1,6 @@
import os import os
import re import re
import sys
import time import time
import traceback import traceback
from pathlib import Path from pathlib import Path
@ -146,7 +147,11 @@ def monitor_folder_simple(use_new: bool):
# Aufgabe 2: NGT und check_img von Originalordner in KI kopieren # Aufgabe 2: NGT und check_img von Originalordner in KI kopieren
# Rückgabewert: Ordner Fileserver/KI auf dem Fileserver, wo dann die Heatmaps abgelegt werden # Rückgabewert: Ordner Fileserver/KI auf dem Fileserver, wo dann die Heatmaps abgelegt werden
print("'copy_ngt_and_checkimg'...") print("'copy_ngt_and_checkimg'...")
file_ki_folder, result = preparation.copy_ngt_and_checkimg() if use_new:
file_ki_folder, result = preparation.copy_ngt_and_checkimg_new()
else:
file_ki_folder, result = preparation.copy_ngt_and_checkimg()
if result: # d. h. Fehler ist aufgetreten if result: # d. h. Fehler ist aufgetreten
continue # zu nächstem neuen folder springen continue # zu nächstem neuen folder springen
@ -157,6 +162,8 @@ def monitor_folder_simple(use_new: bool):
else: else:
preparation.change_image_to_yellow() preparation.change_image_to_yellow()
# sys.exit(0)
# Aufgabe 4: AOI-Bilder in RGB überführen und zwischenspeichern # Aufgabe 4: AOI-Bilder in RGB überführen und zwischenspeichern
# wir erhalten hier den Speicherort sowie ggf. Fehlermeldungen zurück # wir erhalten hier den Speicherort sowie ggf. Fehlermeldungen zurück
print("'create_rgb_images_and_patches'...") print("'create_rgb_images_and_patches'...")

View File

@ -18,16 +18,20 @@ COLOUR_ASSIGNMENT = {"R": [255, 0, 0], "G": [0, 255, 0], "B": [0, 0, 0]}
class Preparation: class Preparation:
def __init__(self, folder): def __init__(self, folder):
self.folder_path = ( # der aktuelle Ordner mit neuen AOI-Bilddateien auf dem KI-Rechner
folder # der aktuelle Ordner mit neuen AOI-Bilddateien auf dem KI-Rechner self.folder_path = folder
)
self.visper = Path(self.folder_path).parts[-4] self.path = Path(self.folder_path)
self.original_data_path = ( # ?? verify existence --> fail early?
Path(config.STORING_PATH)
/ self.visper self.visper = self.path.parts[-4]
/ Path(self.folder_path).parent.parent.name # self.original_data_path = (
/ Path(self.folder_path).parent.name # Path(config.STORING_PATH)
) # Pfad zu Fileserver/KI/... # / self.visper
# / Path(self.folder_path).parents[1].name
# / Path(self.folder_path).parent.name
# ) # Pfad zu Fileserver/KI/...
self.original_data_path = Path(config.STORING_PATH).joinpath(*self.path.parts[-4:-1])
print(f"[{self.visper}] {Path(self.folder_path).name} Vorbereitung gestartet...") print(f"[{self.visper}] {Path(self.folder_path).name} Vorbereitung gestartet...")
@ -46,7 +50,6 @@ class Preparation:
folders_to_copy.append(entry.path) folders_to_copy.append(entry.path)
for src in folders_to_copy: for src in folders_to_copy:
# TODO duplicate -> "self.original_data_path"
dst = ( dst = (
Path(config.STORING_PATH) Path(config.STORING_PATH)
/ self.visper / self.visper
@ -70,6 +73,59 @@ class Preparation:
no = tb[-1].lineno no = tb[-1].lineno
return None, f"Fehlermeldung: {e}, {no}" return None, f"Fehlermeldung: {e}, {no}"
def copy_ngt_and_checkimg_new(self):
try:
# extract last level name because we need to copy all folders containing this name
# target_name = os.path.basename(self.folder_path)
# target_name = self.path.name
# base_path = self.path.parent
# ?? Warum kopieren wir nicht gleich den ganzen Ordner? --> Das Ergebnis der unten stehenden
# ?? Operation ist eine Liste, in der nur der Name des Ordners (Päckchen-Ebene) steht, die also eigentlich
# ?? immer nur einen Eintrag enthält --> self.path
# Einzige Ausnahme: mehr als 10 Einträge/Päckchen, dann enthalten die Päckchen 10-19 auch den Namen des
# ersten Päckchens
# Annahme hier: Es soll nur die Daten des entsprechenden Päckchens kopiert werden
# folders_to_copy = []
# with os.scandir(base_path) as entries:
# for entry in entries:
# if entry.is_dir() and target_name in entry.name:
# folders_to_copy.append(entry.path)
# for src in folders_to_copy:
# # duplicate -> self.original_data_path
# dst = (
# Path(config.STORING_PATH)
# / self.visper
# / Path(self.folder_path).parent.parent.name
# / Path(self.folder_path).parent.name
# / Path(src).name
# )
# copytree(src, dst, dirs_exist_ok=True)
src = self.path
dst = self.original_data_path / self.path.name
copytree(src, dst, dirs_exist_ok=True)
# ?? Soll hier der Pfad mit den kopierten Originaldaten zurückgegeben werden?
# Das ist aktuell nicht der Fall, da die letzten Pfadkomponenten als absolute Pfade das
# Ergebnis komplett überschreiben
# return Path(config.STORING_PATH) / self.visper / Path(
# self.folder_path
# ).parent.parent / Path(self.folder_path).parent, None
return self.original_data_path, None
except FileExistsError:
return (
None,
f"Fehlermeldung: Ordner {Path(self.folder_path).parts[-1]} existiert bereits.",
)
except Exception as e:
tb = traceback.extract_tb(e.__traceback__)
no = tb[-1].lineno
return None, f"Fehlermeldung: {e}, {no}"
# --------------------------- Dritte Aufgabe: check_img auf dem Fileserver auf Gelb ("Work in Progress") ändern -------------------------- # --------------------------- Dritte Aufgabe: check_img auf dem Fileserver auf Gelb ("Work in Progress") ändern --------------------------
def change_image_to_yellow(self): def change_image_to_yellow(self):
# first we define for R, G and B which coour has to be adapted # first we define for R, G and B which coour has to be adapted
@ -108,7 +164,14 @@ class Preparation:
return img return img
def change_image_to_yellow_new(self): def change_image_to_yellow_new(self):
base_path = Path(self.folder_path).parent # ?? Hier sind wir nicht mehr auf Ebene des Päckchens, sondern im übergeordneteten Bereich. Ist das
# ?? richtig so? Beim Kopieren waren wir nur auf Päckchen-Ebene unterwegs.
# Wenn jetzt neue Instanzen dieser Klasse mit anderen Päckchen desselben Basisordners erstellt werden, werden
# die Berechnungen an dieser Stelle immer erneut durchgeführt, auch für die anderen Päckchen, egal ob bereits
# durchgeführt oder durch Nutzer abgewählt
# Annahme hier: Es sollen nur Dateien des aktuellen Päckchens bearbeitet werden.
base_path = self.path
# base_path = Path(self.folder_path).parent
# iterate over all 'checkimg' folders recursively # iterate over all 'checkimg' folders recursively
# !! check needed # !! check needed