Astridkraft commited on
Commit
790df7a
·
verified ·
1 Parent(s): a786d89

Update sam_module.py

Browse files
Files changed (1) hide show
  1. sam_module.py +19 -37
sam_module.py CHANGED
@@ -994,33 +994,24 @@ def create_sam_mask(self, image, bbox_coords, mode):
994
  print(" • MORPH_OPEN (5x5) - Rauschen entfernen")
995
 
996
  # ============================================================
997
- # KRITISCH: MASKE IMMER ZURÜCK AUF ORIGINALGRÖSSE (auch bei Fallback!)
998
  # ============================================================
999
- print("-" * 60)
1000
- print("🔄 MASKE IMMER ZURÜCK AUF ORIGINALGRÖSSE TRANSFORMIEREN")
1001
 
1002
- # WICHTIG: Immer die richtigen Crop-Koordinaten verwenden
1003
  temp_mask = Image.fromarray(mask_array).convert("L")
1004
  print(f" Maskengröße auf Ausschnitt: {temp_mask.size}")
1005
 
1006
- # Maske auf ORIGINALBILDGRÖSSE bringen
1007
- final_mask = Image.new("L", original_image.size, 0)
1008
- print(f" Leere Maske in Originalgröße: {final_mask.size}")
1009
-
1010
- # Immer die gespeicherten Crop-Koordinaten verwenden
1011
- if 'crop_x1' in locals() and 'crop_y1' in locals():
1012
- final_mask.paste(temp_mask, (crop_x1, crop_y1))
1013
- print(f" Maskenposition im Original: ({crop_x1}, {crop_y1})")
1014
- else:
1015
- # Fallback: Zentrieren
1016
- x_offset = (original_image.width - temp_mask.width) // 2
1017
- y_offset = (original_image.height - temp_mask.height) // 2
1018
- final_mask.paste(temp_mask, (x_offset, y_offset))
1019
- print(f" ⚠️ Keine Crop-Koordinaten, zentriert: ({x_offset}, {y_offset})")
1020
-
1021
- mask_array = np.array(final_mask)
1022
- print(f" ✅ Maske zurück auf Originalgröße skaliert: {mask_array.shape}")
1023
-
1024
  # Bild-Referenz zurücksetzen
1025
  image = original_image
1026
  print(f" 🔄 Bild-Referenz wieder auf Original gesetzt: {image.size}")
@@ -1028,19 +1019,19 @@ def create_sam_mask(self, image, bbox_coords, mode):
1028
  # ============================================================
1029
  # ABSCHLIESSENDE STATISTIK
1030
  # ============================================================
1031
-
1032
  print("📊 FINALE MASKEN-STATISTIK")
1033
 
1034
  # Weiße Pixel zählen
1035
  white_pixels = np.sum(mask_array > 0)
1036
  total_pixels = mask_array.size
1037
- white_ratio = white_pixels / total_pixels * 100
1038
 
1039
  # Original-BBox Fläche (vor Crop)
1040
  original_bbox_width = original_bbox[2] - original_bbox[0]
1041
  original_bbox_height = original_bbox[3] - original_bbox[1]
1042
  original_face_area = original_bbox_width * original_bbox_height
1043
  coverage_ratio = white_pixels / original_face_area if original_face_area > 0 else 0
 
1044
  print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
1045
 
1046
  print(f" Weiße Pixel (Veränderungsbereich): {white_pixels:,} ({white_ratio:.1f}%)")
@@ -1054,26 +1045,17 @@ def create_sam_mask(self, image, bbox_coords, mode):
1054
  print(f" ⚠️ WARNUNG: Sehr hohe Gesichtsabdeckung ({coverage_ratio:.1%})")
1055
  elif 0.8 <= coverage_ratio <= 1.2:
1056
  print(f" ✅ OPTIMALE Gesichtsabdeckung ({coverage_ratio:.1%})")
1057
-
1058
- # Zurück zu PIL Image
1059
- mask = Image.fromarray(mask_array).convert("L")
1060
- raw_mask = Image.fromarray(raw_mask_array).convert("L")
1061
-
1062
  print("#" * 80)
1063
  print(f"✅ SAM 2 SEGMENTIERUNG ABGESCHLOSSEN")
1064
- print(f"📐 Finale Maskengröße: {mask.size}")
1065
  print(f"🎛️ Verwendeter Modus: {mode}")
1066
-
1067
  print(f"👤 Crop={crop_size}×{crop_size}px, Heuristik-Score={best_score:.3f}")
1068
  print(f"👤 Kopfabdeckung: {coverage_ratio:.1%} der BBox")
1069
-
1070
- print(f"🔍 DEBUG FINALE MASKE:")
1071
- print(f" mask_array Min/Max: {mask_array.min()}/{mask_array.max()}, Typ: {mask_array.dtype}")
1072
- print(f" Weiße Pixel final: {np.sum(mask_array > 0)}")
1073
-
1074
  print("#" * 80)
 
1075
 
1076
- return mask, raw_mask #in app.py wird mask immer auf 512x512 skaliert
1077
 
1078
  # ============================================================
1079
  # UNBEKANNTER MODUS
 
994
  print(" • MORPH_OPEN (5x5) - Rauschen entfernen")
995
 
996
  # ============================================================
997
+ # Maske und Rohmaske auf 512x512 skalieren wegen UI
998
  # ============================================================
999
+ print("🔄 MASKE IMMER ZURÜCK AUF 512x512 TRANSFORMIEREN")
 
1000
 
1001
+ # Konvertierung NumPy->Pil
1002
  temp_mask = Image.fromarray(mask_array).convert("L")
1003
  print(f" Maskengröße auf Ausschnitt: {temp_mask.size}")
1004
 
1005
+ # Maske auf 512x512 skalieren (für Inpainting)
1006
+ mask_512 = temp_mask.rezise((512,512), Image.Resampling.LANCZOS)
1007
+ print(f" Maske auf 512x512 skaliert")
1008
+
1009
+
1010
+ # raw_mask auch auf 512 skalieren (für UI-Konsistenz)
1011
+ raw_mask_512 = Image.fromarray(raw_mask_array).convert("L").resize(
1012
+ (512, 512), Image.Resampling.NEAREST
1013
+ )
1014
+
 
 
 
 
 
 
 
 
1015
  # Bild-Referenz zurücksetzen
1016
  image = original_image
1017
  print(f" 🔄 Bild-Referenz wieder auf Original gesetzt: {image.size}")
 
1019
  # ============================================================
1020
  # ABSCHLIESSENDE STATISTIK
1021
  # ============================================================
 
1022
  print("📊 FINALE MASKEN-STATISTIK")
1023
 
1024
  # Weiße Pixel zählen
1025
  white_pixels = np.sum(mask_array > 0)
1026
  total_pixels = mask_array.size
1027
+ white_ratio = white_pixels / total_pixels * 100 if total_pixels >0 else 0
1028
 
1029
  # Original-BBox Fläche (vor Crop)
1030
  original_bbox_width = original_bbox[2] - original_bbox[0]
1031
  original_bbox_height = original_bbox[3] - original_bbox[1]
1032
  original_face_area = original_bbox_width * original_bbox_height
1033
  coverage_ratio = white_pixels / original_face_area if original_face_area > 0 else 0
1034
+
1035
  print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
1036
 
1037
  print(f" Weiße Pixel (Veränderungsbereich): {white_pixels:,} ({white_ratio:.1f}%)")
 
1045
  print(f" ⚠️ WARNUNG: Sehr hohe Gesichtsabdeckung ({coverage_ratio:.1%})")
1046
  elif 0.8 <= coverage_ratio <= 1.2:
1047
  print(f" ✅ OPTIMALE Gesichtsabdeckung ({coverage_ratio:.1%})")
1048
+
 
 
 
 
1049
  print("#" * 80)
1050
  print(f"✅ SAM 2 SEGMENTIERUNG ABGESCHLOSSEN")
1051
+ print(f"📐 Finale Maskengröße: {mask_512.size}") # Immer 512×512
1052
  print(f"🎛️ Verwendeter Modus: {mode}")
 
1053
  print(f"👤 Crop={crop_size}×{crop_size}px, Heuristik-Score={best_score:.3f}")
1054
  print(f"👤 Kopfabdeckung: {coverage_ratio:.1%} der BBox")
 
 
 
 
 
1055
  print("#" * 80)
1056
+
1057
 
1058
+ return mask_512, raw_mask_512 #in app.py wird mask immer auf 512x512 skaliert
1059
 
1060
  # ============================================================
1061
  # UNBEKANNTER MODUS