Update sam_module.py
Browse files- 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 |
-
#
|
| 998 |
# ============================================================
|
| 999 |
-
print("
|
| 1000 |
-
print("🔄 MASKE IMMER ZURÜCK AUF ORIGINALGRÖSSE TRANSFORMIEREN")
|
| 1001 |
|
| 1002 |
-
#
|
| 1003 |
temp_mask = Image.fromarray(mask_array).convert("L")
|
| 1004 |
print(f" Maskengröße auf Ausschnitt: {temp_mask.size}")
|
| 1005 |
|
| 1006 |
-
# Maske auf
|
| 1007 |
-
|
| 1008 |
-
print(f"
|
| 1009 |
-
|
| 1010 |
-
|
| 1011 |
-
|
| 1012 |
-
|
| 1013 |
-
|
| 1014 |
-
|
| 1015 |
-
|
| 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: {
|
| 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
|
| 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
|