Update controlnet_module.py
Browse files- 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:
|