Astridkraft commited on
Commit
74e4b35
·
verified ·
1 Parent(s): 2ca3107

Update controlnet_module.py

Browse files
Files changed (1) hide show
  1. controlnet_module.py +46 -13
controlnet_module.py CHANGED
@@ -92,16 +92,6 @@ class ControlNetProcessor:
92
  y2 = min(height, height/2 + size/2)
93
 
94
  return int(x1), int(y1), int(x2), int(y2)
95
-
96
- #def _smooth_mask(self, mask_array, blur_radius=3):
97
- # """Glättet die Maske für bessere Übergänge"""
98
- # try:
99
- # if blur_radius > 0:
100
- # mask_array = cv2.medianBlur(mask_array, blur_radius*2+1)
101
- # return mask_array
102
- # except Exception as e:
103
- # print(f"⚠️ Fehler beim Glätten der Maske: {e}")
104
- # return mask_array
105
 
106
 
107
  def create_sam_mask(self, image, bbox_coords, mode):
@@ -1079,7 +1069,7 @@ class ControlNetProcessor:
1079
  raw_mask_array = mask_array.copy()
1080
 
1081
  # ============================================================
1082
- # POSTPROCESSING
1083
  # ============================================================
1084
 
1085
  print("👤 POSTPROCESSING AUF CROP-GRÖSSE")
@@ -1111,6 +1101,44 @@ class ControlNetProcessor:
1111
  mask_array = cv2.morphologyEx(mask_array, cv2.MORPH_OPEN, kernel_open, iterations=1)
1112
  print(" • MORPH_OPEN (5x5) - Rauschen entfernen")
1113
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1114
  # ============================================================
1115
  # Maske und Rohmaske auf Originalgröße transformieren
1116
  # ============================================================
@@ -1136,7 +1164,9 @@ class ControlNetProcessor:
1136
  # ============================================================
1137
  print("📊 FINALE MASKEN-STATISTIK")
1138
 
1139
- # Weiße Pixel zählen
 
 
1140
  final_array = np.array(mask_original) # ✅ Original-Größe
1141
  white_pixels = np.sum(final_array > 0)
1142
  total_pixels = final_array.size
@@ -1149,10 +1179,13 @@ class ControlNetProcessor:
1149
  coverage_ratio = white_pixels / original_face_area if original_face_area > 0 else 0
1150
 
1151
  print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
1152
-
1153
  print(f" Weiße Pixel (Veränderungsbereich): {white_pixels:,} ({white_ratio:.1f}%)")
1154
  print(f" Schwarze Pixel (Erhaltungsbereich): {total_pixels-white_pixels:,} ({100-white_ratio:.1f}%)")
1155
  print(f" Gesamtpixel: {total_pixels:,}")
 
 
 
 
1156
 
1157
  # Warnungen basierend auf Abdeckung
1158
  if coverage_ratio < 0.7:
 
92
  y2 = min(height, height/2 + size/2)
93
 
94
  return int(x1), int(y1), int(x2), int(y2)
 
 
 
 
 
 
 
 
 
 
95
 
96
 
97
  def create_sam_mask(self, image, bbox_coords, mode):
 
1069
  raw_mask_array = mask_array.copy()
1070
 
1071
  # ============================================================
1072
+ # POSTPROCESSING auf Crop-Größe
1073
  # ============================================================
1074
 
1075
  print("👤 POSTPROCESSING AUF CROP-GRÖSSE")
 
1101
  mask_array = cv2.morphologyEx(mask_array, cv2.MORPH_OPEN, kernel_open, iterations=1)
1102
  print(" • MORPH_OPEN (5x5) - Rauschen entfernen")
1103
 
1104
+ # LEICHTER DILATE FÜR MEHR ABDECKUNG (wichtig für Gesicht!)
1105
+ print(" 🔲 Leichter Dilate für natürliche Abdeckung")
1106
+ kernel_dilate = np.ones((11, 11), np.uint8) # Größerer Kernel für Gesicht
1107
+ mask_array = cv2.dilate(mask_array, kernel_dilate, iterations=1)
1108
+
1109
+ # WEICHER GAUSSIAN BLUR FÜR NATÜRLICHE ÜBERGÄNGE
1110
+ print(" 🔷 Gaussian Blur für weiche Hautübergänge (15x15, sigma=3.0)")
1111
+ mask_array = cv2.GaussianBlur(mask_array, (15, 15), 3.0)
1112
+
1113
+ # GAMMA-KORREKTUR FÜR GLATTE, NATÜRLICHE KANTEN
1114
+ print(" 🎨 Gamma-Korrektur (0.7) für glatte Übergänge")
1115
+ mask_array_float = mask_array.astype(np.float32) / 255.0
1116
+ mask_array_float = np.clip(mask_array_float, 0.0, 1.0)
1117
+ mask_array_float = mask_array_float ** 0.7 # Stärkeres Gamma für weichere Kanten
1118
+ mask_array = (mask_array_float * 255).astype(np.uint8)
1119
+
1120
+ # NOCH EIN WEICHER BLUR FÜR EXTRA-GLÄTTE KANTEN
1121
+ print(" 💫 Finaler weicher Blur (9x9, sigma=1.5)")
1122
+ mask_array = cv2.GaussianBlur(mask_array, (9, 9), 1.5)
1123
+
1124
+ # SICHERSTELLEN, DASS MASKE NICHT ZU DÜNN IST (speziell für Gesicht!)
1125
+ print(" 📏 Prüfe Maskendichte...")
1126
+ white_pixels = np.sum(mask_array > 128)
1127
+ bbox_area = (x2 - x1) * (y2 - y1)
1128
+ coverage_ratio = white_pixels / bbox_area if bbox_area > 0 else 0
1129
+
1130
+ print(f" 📊 Aktuelle Abdeckung: {white_pixels:,}px / {bbox_area:,}px = {coverage_ratio:.1%}")
1131
+
1132
+ # Wenn Maske zu dünn (unter 90% der BBox), weiter erweitern
1133
+ if coverage_ratio < 0.9:
1134
+ print(f" ⚠️ Maske zu dünn für Gesicht (<90%)")
1135
+ print(f" 📈 Zusätzlicher Dilate...")
1136
+ kernel_extra = np.ones((15, 15), np.uint8)
1137
+ mask_array = cv2.dilate(mask_array, kernel_extra, iterations=1)
1138
+
1139
+ # Nochmal weichzeichnen
1140
+ mask_array = cv2.GaussianBlur(mask_array, (11, 11), 2.0)
1141
+
1142
  # ============================================================
1143
  # Maske und Rohmaske auf Originalgröße transformieren
1144
  # ============================================================
 
1164
  # ============================================================
1165
  print("📊 FINALE MASKEN-STATISTIK")
1166
 
1167
+ # Weiße Pixel zählen
1168
+ final_white = np.sum(mask_array > 128)
1169
+ final_coverage = final_white / bbox_area if bbox_area > 0 else 0
1170
  final_array = np.array(mask_original) # ✅ Original-Größe
1171
  white_pixels = np.sum(final_array > 0)
1172
  total_pixels = final_array.size
 
1179
  coverage_ratio = white_pixels / original_face_area if original_face_area > 0 else 0
1180
 
1181
  print(f" 👤 GESICHTSABDECKUNG: {coverage_ratio:.1%} der ursprünglichen BBox")
 
1182
  print(f" Weiße Pixel (Veränderungsbereich): {white_pixels:,} ({white_ratio:.1f}%)")
1183
  print(f" Schwarze Pixel (Erhaltungsbereich): {total_pixels-white_pixels:,} ({100-white_ratio:.1f}%)")
1184
  print(f" Gesamtpixel: {total_pixels:,}")
1185
+ print(f" • Weiße Pixel: {final_white:,}")
1186
+ print(f" • BBox-Fläche: {bbox_area:,}")
1187
+ print(f" • Abdeckung: {final_coverage:.1%}")
1188
+ print(f" • Empfohlen: >90% für natürliches Gesicht")
1189
 
1190
  # Warnungen basierend auf Abdeckung
1191
  if coverage_ratio < 0.7: