[Perf] Bilder werden 2-3x pro Bild dekodiert in analyze_folder #22

Closed
opened 2026-05-27 12:21:05 +02:00 by ferdi2go · 1 comment
Owner

Problem

analyzer.py:10-33 und analyzer.py:58-89:

Pro Bild laufen unabhaengige Decodes:

  • is_blurry(path) -> cv2.imread()
  • _mean_brightness(path) -> Image.open().convert("L")
  • find_duplicates() -> imagehash.phash(Image.open(path))

Bei 500 Bildern: 1500+ Dekodierungen statt 500.

Fix

Pro Bild einmal dekodieren, dann alle Operationen auf demselben Array:

with Image.open(path) as pil:
    pil_rgb = pil.convert("RGB")
gray = np.array(pil_rgb.convert("L"))
blur = cv2.Laplacian(gray, cv2.CV_64F).var()
brightness = float(gray.mean())
phash = imagehash.phash(pil_rgb)
## Problem `analyzer.py:10-33` und `analyzer.py:58-89`: Pro Bild laufen unabhaengige Decodes: - `is_blurry(path)` -> `cv2.imread()` - `_mean_brightness(path)` -> `Image.open().convert("L")` - `find_duplicates()` -> `imagehash.phash(Image.open(path))` Bei 500 Bildern: 1500+ Dekodierungen statt 500. ## Fix Pro Bild einmal dekodieren, dann alle Operationen auf demselben Array: ```python with Image.open(path) as pil: pil_rgb = pil.convert("RGB") gray = np.array(pil_rgb.convert("L")) blur = cv2.Laplacian(gray, cv2.CV_64F).var() brightness = float(gray.mean()) phash = imagehash.phash(pil_rgb) ```
ferdi2go added the priority: highmaintenance labels 2026-05-27 12:21:05 +02:00
Author
Owner

Fix umgesetzt in analyzer.py:analyze_folder:

  • Phase 1 lädt jedes Bild einmal mit Image.open(path) und berechnet daraus alles:

    • gray_arr (numpy L-Konvertierung)
    • blur via Laplacian-Variance auf gray_arr
    • mean_b als gray_arr.mean()
    • phash auf RGB-Variante
  • pHash wird im phash_cache gespeichert

  • Phase 3 ruft find_duplicates(paths, threshold, hash_cache=phash_cache) auf - kein zweiter Decode

  • find_duplicates akzeptiert jetzt optionalen hash_cache-Parameter

  • Die alten is_blurry/is_overexposed/is_underexposed/_mean_brightness bleiben fuer API-Kompatibilitaet, werden aber von analyze_folder nicht mehr genutzt

Vorher: 3 Decodes pro Bild in Phase 1 + 1 in Phase 3 = 4 Decodes
Nachher: 1 Decode pro Bild fuer alle Metriken

Funktionstest mit 5 Bildern (overexposed/underexposed/grey + 1 exakte Kopie + 1 perceptual dup): alle Detektionen korrekt, Laufzeit 0,26 s.

Fix umgesetzt in `analyzer.py:analyze_folder`: - Phase 1 lädt jedes Bild **einmal** mit `Image.open(path)` und berechnet daraus alles: - `gray_arr` (numpy L-Konvertierung) - `blur` via Laplacian-Variance auf `gray_arr` - `mean_b` als `gray_arr.mean()` - `phash` auf RGB-Variante - pHash wird im `phash_cache` gespeichert - Phase 3 ruft `find_duplicates(paths, threshold, hash_cache=phash_cache)` auf - kein zweiter Decode - `find_duplicates` akzeptiert jetzt optionalen `hash_cache`-Parameter - Die alten `is_blurry`/`is_overexposed`/`is_underexposed`/`_mean_brightness` bleiben fuer API-Kompatibilitaet, werden aber von `analyze_folder` nicht mehr genutzt **Vorher:** 3 Decodes pro Bild in Phase 1 + 1 in Phase 3 = 4 Decodes **Nachher:** 1 Decode pro Bild fuer alle Metriken Funktionstest mit 5 Bildern (overexposed/underexposed/grey + 1 exakte Kopie + 1 perceptual dup): alle Detektionen korrekt, Laufzeit 0,26 s.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ferdi2go/OnlyFrames#22