Update app.py
Browse files
app.py
CHANGED
|
@@ -185,17 +185,14 @@ def create_face_mask(image, bbox_coords, mode):
|
|
| 185 |
- padding_info: Dictionary mit Skalierungsinfo für späteres Compositing
|
| 186 |
"""
|
| 187 |
|
| 188 |
-
# Herunterskalierung von Bild und BBox/SAM-Maske auf 512x512 für ControlnetInpaint-Pipeline
|
| 189 |
-
def scale_image_and_mask_together(image,
|
| 190 |
-
if image is None or
|
| 191 |
raise ValueError("Bild oder Maske ist None")
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
if image.size != mask.size:
|
| 198 |
-
raise ValueError(f"Bild und Maske haben unterschiedliche Größen: {image.size} vs {mask.size}") #Stoppt Programm sofort mit Fehlermeldung!
|
| 199 |
|
| 200 |
#Variablen für Bildmaße
|
| 201 |
original_width, original_height = image.size
|
|
@@ -210,14 +207,16 @@ def scale_image_and_mask_together(image, mask, target_size=512, bbox_coords=None
|
|
| 210 |
|
| 211 |
# Skaliere Bild und Maske getrennt voneinander aber proportional
|
| 212 |
scaled_image = image.resize((new_width, new_height), Image.Resampling.LANCZOS)
|
| 213 |
-
|
|
|
|
| 214 |
|
| 215 |
# Auf Zielgröße padden (zentriert)
|
| 216 |
#Image.new("RGB", (target_size, target_size), (0, 0, 0)) erstellt ein neues, leeres, schwarzes Bild in der Ziel-Verarbeitungsgröße des Modells (512×512 für SD 1.5 oder 1024×1024 für SDXL)
|
| 217 |
# in das später das Bild eingefügt wird
|
| 218 |
padded_image = Image.new("RGB", (target_size, target_size), (0, 0, 0))
|
| 219 |
#Damit wird ein 512x512 Graustufenbild erstellt in das später die BBox eingefügt wird
|
| 220 |
-
|
|
|
|
| 221 |
|
| 222 |
# Zentrierte Position berechnen
|
| 223 |
# das ist der Padding-Bereich bei nicht quadratischen 512x512 Bildern damit daraus 512x512-Bilder werden
|
|
@@ -229,7 +228,8 @@ def scale_image_and_mask_together(image, mask, target_size=512, bbox_coords=None
|
|
| 229 |
padded_image.paste(scaled_image, (x_offset, y_offset))
|
| 230 |
# mit Hilfe der Offsets wird nun die herunterskalierte BBox (entweder als Rechteck oder als SAM-Maske)
|
| 231 |
# in das Graustufenbild eingefügt. Das Padding ergibt sich aus dem Graustufenbild!
|
| 232 |
-
|
|
|
|
| 233 |
|
| 234 |
# hiermit wird die (transformierte BBox)= skalierte BBox + Padding berechnet.
|
| 235 |
scaled_bbox = None
|
|
@@ -261,8 +261,9 @@ def scale_image_and_mask_together(image, mask, target_size=512, bbox_coords=None
|
|
| 261 |
|
| 262 |
print(f"📦 Padding hinzugefügt: Offsets ({x_offset}, {y_offset})")
|
| 263 |
print(f"BBox gespeicher: {bbox_coords}, Modus:{mode}")
|
|
|
|
| 264 |
|
| 265 |
-
return padded_image,
|
| 266 |
|
| 267 |
|
| 268 |
|
|
|
|
| 185 |
- padding_info: Dictionary mit Skalierungsinfo für späteres Compositing
|
| 186 |
"""
|
| 187 |
|
| 188 |
+
# Herunterskalierung von Bild und BBox/SAM-Maske und SAM-Maske-Binär auf 512x512 für ControlnetInpaint-Pipeline
|
| 189 |
+
def scale_image_and_mask_together(image, mask_inpaint, mask_composite, target_size=512, bbox_coords=None, mode=None):
|
| 190 |
+
if image is None or mask_inpaint is None or mask_composite is None:
|
| 191 |
raise ValueError("Bild oder Maske ist None")
|
| 192 |
+
|
| 193 |
+
if image.size != mask_inpaint.size or image.size != mask_composite.size:
|
| 194 |
+
raise ValueError("Bild und Masken haben unterschiedliche Größen: {image.size} vs {mask_inpaint.size}") #Stoppt Programm sofort mit Fehlermeldung!
|
| 195 |
+
|
|
|
|
|
|
|
|
|
|
| 196 |
|
| 197 |
#Variablen für Bildmaße
|
| 198 |
original_width, original_height = image.size
|
|
|
|
| 207 |
|
| 208 |
# Skaliere Bild und Maske getrennt voneinander aber proportional
|
| 209 |
scaled_image = image.resize((new_width, new_height), Image.Resampling.LANCZOS)
|
| 210 |
+
scaled_mask_inpaint = mask_inpaint.resize((new_width, new_height), Image.Resampling.NEAREST)
|
| 211 |
+
scaled_mask_composite = mask_composite.resize((new_width, new_height), Image.Resampling.NEAREST)
|
| 212 |
|
| 213 |
# Auf Zielgröße padden (zentriert)
|
| 214 |
#Image.new("RGB", (target_size, target_size), (0, 0, 0)) erstellt ein neues, leeres, schwarzes Bild in der Ziel-Verarbeitungsgröße des Modells (512×512 für SD 1.5 oder 1024×1024 für SDXL)
|
| 215 |
# in das später das Bild eingefügt wird
|
| 216 |
padded_image = Image.new("RGB", (target_size, target_size), (0, 0, 0))
|
| 217 |
#Damit wird ein 512x512 Graustufenbild erstellt in das später die BBox eingefügt wird
|
| 218 |
+
padded_mask_inpaint = Image.new("L", (target_size, target_size), 0)
|
| 219 |
+
padded_mask_composite = Image.new("L", (target_size, target_size), 0)
|
| 220 |
|
| 221 |
# Zentrierte Position berechnen
|
| 222 |
# das ist der Padding-Bereich bei nicht quadratischen 512x512 Bildern damit daraus 512x512-Bilder werden
|
|
|
|
| 228 |
padded_image.paste(scaled_image, (x_offset, y_offset))
|
| 229 |
# mit Hilfe der Offsets wird nun die herunterskalierte BBox (entweder als Rechteck oder als SAM-Maske)
|
| 230 |
# in das Graustufenbild eingefügt. Das Padding ergibt sich aus dem Graustufenbild!
|
| 231 |
+
padded_mask_inpaint.paste(scaled_mask, (x_offset, y_offset))
|
| 232 |
+
padded_mask_composite.paste(scaled_mask_composite, (x_offset, y_offset))
|
| 233 |
|
| 234 |
# hiermit wird die (transformierte BBox)= skalierte BBox + Padding berechnet.
|
| 235 |
scaled_bbox = None
|
|
|
|
| 261 |
|
| 262 |
print(f"📦 Padding hinzugefügt: Offsets ({x_offset}, {y_offset})")
|
| 263 |
print(f"BBox gespeicher: {bbox_coords}, Modus:{mode}")
|
| 264 |
+
print(f"✅ 1 Bild + 2 Masken skaliert. Inpaint-Maske binär: {np.unique(np.array(padded_mask_inpaint))}")
|
| 265 |
|
| 266 |
+
return padded_image, padded_mask_inpaint, padded_mask_composite, padding_info
|
| 267 |
|
| 268 |
|
| 269 |
|