Astridkraft commited on
Commit
5eb4d07
·
verified ·
1 Parent(s): 9940b7d

Update sam_module.py

Browse files
Files changed (1) hide show
  1. sam_module.py +67 -15
sam_module.py CHANGED
@@ -853,6 +853,18 @@ def create_sam_mask(self, image, bbox_coords, mode):
853
  print(f" • Konfidenz-Score: {confidence_score:.3f}")
854
  print(f" • GESAMTSCORE: {score:.3f}")
855
 
 
 
 
 
 
 
 
 
 
 
 
 
856
 
857
  # ============================================================
858
  # THRESHOLD-BESTIMMUNG
@@ -870,6 +882,32 @@ def create_sam_mask(self, image, bbox_coords, mode):
870
 
871
  print(f" 🎯 Gesichts-Threshold: {dynamic_threshold:.3f}")
872
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
873
  # ============================================================
874
  # POSTPROCESSING
875
  # ============================================================
@@ -939,10 +977,23 @@ def create_sam_mask(self, image, bbox_coords, mode):
939
  # ABSCHLIESSENDE STATISTIK
940
  # ============================================================
941
 
 
 
 
 
 
 
 
 
942
  original_face_area = original_bbox_size[0] * original_bbox_size[1]
943
  coverage_ratio = white_pixels / original_face_area if original_face_area > 0 else 0
944
  print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
945
-
 
 
 
 
 
946
  # Warnungen basierend auf Abdeckung
947
  if coverage_ratio < 0.7:
948
  print(f" ⚠️ WARNUNG: Geringe Gesichtsabdeckung ({coverage_ratio:.1%})")
@@ -951,29 +1002,30 @@ def create_sam_mask(self, image, bbox_coords, mode):
951
  elif 0.8 <= coverage_ratio <= 1.2:
952
  print(f" ✅ OPTIMALE Gesichtsabdeckung ({coverage_ratio:.1%})")
953
 
954
-
955
 
956
  # Zurück zu PIL Image
957
  mask = Image.fromarray(mask_array).convert("L")
958
- raw_mask = Image.fromarray(raw_mask_array).convert("L")
 
 
959
 
960
  print("#" * 80)
961
  print(f"✅ SAM 2 SEGMENTIERUNG ABGESCHLOSSEN")
962
  print(f"📐 Finale Maskengröße: {mask.size}")
963
  print(f"🎛️ Verwendeter Modus: {mode}")
964
 
965
- # ============================================================
966
- # FINALE AUSGABE FÜR GESICHTSMODUS
967
- # ============================================================
968
- if crop_size is not None:
969
- print(f"👤 Bei face_only_change: Crop={crop_size}×{crop_size}px, Heuristik-Score={best_score:.3f}")
970
- print(f"👤 Kopfabdeckung: {coverage_ratio:.1%} der BBox")
971
-
972
- print(f" DEBUG NACHHER - Min/Max: {mask_array.min()}/{mask_array.max()}, Typ: {mask_array.dtype}")
973
- print("#" * 80)
974
-
975
- return mask, raw_mask
976
-
977
  # ============================================================
978
  # UNBEKANNTER MODUS
979
  # ============================================================
 
853
  print(f" • Konfidenz-Score: {confidence_score:.3f}")
854
  print(f" • GESAMTSCORE: {score:.3f}")
855
 
856
+ if score > best_score:
857
+ best_score = score
858
+ best_mask_idx = i
859
+ print(f" 🏆 Neue beste Maske: Nr. {i+1} mit Score {score:.3f}")
860
+
861
+ print(f"✅ Beste Maske ausgewählt: Nr. {best_mask_idx+1} mit Score {best_score:.3f}")
862
+
863
+ # Beste Maske verwenden
864
+ mask_np = all_masks[best_mask_idx]
865
+ max_val = mask_np.max()
866
+ print(f"🔍 Maximaler SAM-Konfidenzwert der besten Maske: {max_val:.3f}")
867
+
868
 
869
  # ============================================================
870
  # THRESHOLD-BESTIMMUNG
 
882
 
883
  print(f" 🎯 Gesichts-Threshold: {dynamic_threshold:.3f}")
884
 
885
+ # Binärmaske erstellen
886
+ print("🐛 DEBUG THRESHOLD:")
887
+ print(f" mask_np Min/Max: {mask_np.min():.3f}/{mask_np.max():.3f}")
888
+ print(f" dynamic_threshold: {dynamic_threshold:.3f}")
889
+
890
+ mask_array = (mask_np > dynamic_threshold).astype(np.uint8) * 255
891
+
892
+ print(f"🚨 DEBUG BINÄRMASKE:")
893
+ print(f" mask_array Min/Max: {mask_array.min()}/{mask_array.max()}")
894
+ print(f" Weiße Pixel in mask_array: {np.sum(mask_array > 0)}")
895
+ print(f" Anteil weiße Pixel: {np.sum(mask_array > 0) / mask_array.size:.1%}")
896
+
897
+ # Fallback wenn Maske leer
898
+ if mask_array.max() == 0:
899
+ print("⚠️ KRITISCH: Binärmaske ist leer! Erzwinge Testmaske (BBox).")
900
+ print(f" 🚨 BBox für Fallback: x1={x1}, y1={y1}, x2={x2}, y2={y2}")
901
+
902
+ test_mask = np.zeros((image.height, image.width), dtype=np.uint8)
903
+ cv2.rectangle(test_mask, (x1, y1), (x2, y2), 255, -1)
904
+
905
+ mask_array = test_mask
906
+ print(f"🐛 DEBUG ERZWUNGENE MASKE: Weiße Pixel: {np.sum(mask_array > 0)}")
907
+
908
+ # Rohmaske speichern
909
+ raw_mask_array = mask_array.copy()
910
+
911
  # ============================================================
912
  # POSTPROCESSING
913
  # ============================================================
 
977
  # ABSCHLIESSENDE STATISTIK
978
  # ============================================================
979
 
980
+ print("📊 FINALE MASKEN-STATISTIK")
981
+
982
+ # Weiße Pixel zählen
983
+ white_pixels = np.sum(mask_array > 0)
984
+ total_pixels = mask_array.size
985
+ white_ratio = white_pixels / total_pixels * 100
986
+
987
+ # Original-BBox Fläche (vor Crop)
988
  original_face_area = original_bbox_size[0] * original_bbox_size[1]
989
  coverage_ratio = white_pixels / original_face_area if original_face_area > 0 else 0
990
  print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
991
+
992
+ print(f" Weiße Pixel (Veränderungsbereich): {white_pixels:,} ({white_ratio:.1f}%)")
993
+ print(f" Schwarze Pixel (Erhaltungsbereich): {total_pixels-white_pixels:,} ({100-white_ratio:.1f}%)")
994
+ print(f" Gesamtpixel: {total_pixels:,}")
995
+ print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
996
+
997
  # Warnungen basierend auf Abdeckung
998
  if coverage_ratio < 0.7:
999
  print(f" ⚠️ WARNUNG: Geringe Gesichtsabdeckung ({coverage_ratio:.1%})")
 
1002
  elif 0.8 <= coverage_ratio <= 1.2:
1003
  print(f" ✅ OPTIMALE Gesichtsabdeckung ({coverage_ratio:.1%})")
1004
 
1005
+ #===============
1006
 
1007
  # Zurück zu PIL Image
1008
  mask = Image.fromarray(mask_array).convert("L")
1009
+ raw_mask = Image.fromarray(raw_mask_array).convert("L")
1010
+
1011
+
1012
 
1013
  print("#" * 80)
1014
  print(f"✅ SAM 2 SEGMENTIERUNG ABGESCHLOSSEN")
1015
  print(f"📐 Finale Maskengröße: {mask.size}")
1016
  print(f"🎛️ Verwendeter Modus: {mode}")
1017
 
1018
+ print(f"👤 Crop={crop_size}×{crop_size}px, Heuristik-Score={best_score:.3f}")
1019
+ print(f"👤 Kopfabdeckung: {coverage_ratio:.1%} der BBox")
1020
+
1021
+ print(f"🔍 DEBUG FINALE MASKE:")
1022
+ print(f" mask_array Min/Max: {mask_array.min()}/{mask_array.max()}, Typ: {mask_array.dtype}")
1023
+ print(f" Weiße Pixel final: {np.sum(mask_array > 0)}")
1024
+
1025
+ print("#" * 80)
1026
+
1027
+ return mask, raw_mask
1028
+
 
1029
  # ============================================================
1030
  # UNBEKANNTER MODUS
1031
  # ============================================================