Upload reactor_swapper.py
Browse files
custom_nodes/comfyui-reactor-node/scripts/reactor_swapper.py
CHANGED
|
@@ -304,10 +304,12 @@ def run_hyperswap(session, source_face, target_face, target_img):
|
|
| 304 |
|
| 305 |
# Вычисляем аффинную матрицу
|
| 306 |
M = get_affine_transform(target_landmarks_5.astype(np.float32), std_landmarks_256)
|
| 307 |
-
M_inv = cv2.invertAffineTransform(M) # Обратная для paste
|
| 308 |
logger.debug("Affine Matrix M (used for cropping):\n%s", M)
|
| 309 |
-
logger.debug("Inverse Affine Matrix M_inv (used for paste):\n%s", M_inv)
|
| 310 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 311 |
# Применяем аффинное преобразование с новой матрицей M
|
| 312 |
crop = cv2.warpAffine(target_img, M, (256, 256), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REFLECT)
|
| 313 |
|
|
@@ -338,6 +340,7 @@ def run_hyperswap(session, source_face, target_face, target_img):
|
|
| 338 |
|
| 339 |
# --- CPU FLOAT NORMALIZATION FIX ---
|
| 340 |
# предотвращает появление "синей кожи" и "шума" при работе на CPU
|
|
|
|
| 341 |
if isinstance(output, np.ndarray):
|
| 342 |
# устранение NaN и бесконечностей
|
| 343 |
output = np.nan_to_num(output, nan=0.0, posinf=255.0, neginf=0.0)
|
|
@@ -359,7 +362,7 @@ def run_hyperswap(session, source_face, target_face, target_img):
|
|
| 359 |
# (ваш код без изменений, но без старой денормализации)
|
| 360 |
output = output.transpose(1, 2, 0) # CHW -> HWC
|
| 361 |
output = output[:, :, ::-1] # RGB -> BGR (Убедитесь, что это BGR, если вход был BGR)
|
| 362 |
-
logger.debug("Output after denormalization: Min: %s | Max: %s
|
| 363 |
|
| 364 |
# Визуализация после денормализации
|
| 365 |
#### Что проверить:
|
|
@@ -368,9 +371,8 @@ def run_hyperswap(session, source_face, target_face, target_img):
|
|
| 368 |
logger.debug("Output after denormalization: Min: %s | Max: %s", output.min(), output.max())
|
| 369 |
# cv2.imshow("Output After Denormalization", output)
|
| 370 |
# cv2.waitKey(1)
|
| 371 |
-
|
| 372 |
-
#
|
| 373 |
-
return output, M_inv
|
| 374 |
|
| 375 |
def sort_by_order(face, order: str):
|
| 376 |
if order == "left-right":
|
|
|
|
| 304 |
|
| 305 |
# Вычисляем аффинную матрицу
|
| 306 |
M = get_affine_transform(target_landmarks_5.astype(np.float32), std_landmarks_256)
|
|
|
|
| 307 |
logger.debug("Affine Matrix M (used for cropping):\n%s", M)
|
|
|
|
| 308 |
|
| 309 |
+
#### Что проверить:
|
| 310 |
+
# Матрица `M` не должна содержать `NaN` или бесконечности.
|
| 311 |
+
# Если матрица нулевая или искаженная — проблема в точках `target_landmarks_5`.
|
| 312 |
+
|
| 313 |
# Применяем аффинное преобразование с новой матрицей M
|
| 314 |
crop = cv2.warpAffine(target_img, M, (256, 256), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REFLECT)
|
| 315 |
|
|
|
|
| 340 |
|
| 341 |
# --- CPU FLOAT NORMALIZATION FIX ---
|
| 342 |
# предотвращает появление "синей кожи" и "шума" при работе на CPU
|
| 343 |
+
# (адаптировано из патча patch_cpu_fix.diff)
|
| 344 |
if isinstance(output, np.ndarray):
|
| 345 |
# устранение NaN и бесконечностей
|
| 346 |
output = np.nan_to_num(output, nan=0.0, posinf=255.0, neginf=0.0)
|
|
|
|
| 362 |
# (ваш код без изменений, но без старой денормализации)
|
| 363 |
output = output.transpose(1, 2, 0) # CHW -> HWC
|
| 364 |
output = output[:, :, ::-1] # RGB -> BGR (Убедитесь, что это BGR, если вход был BGR)
|
| 365 |
+
logger.debug("Output after denormalization: Min: %s | Max: %s", output.min(), output.max())
|
| 366 |
|
| 367 |
# Визуализация после денормализации
|
| 368 |
#### Что проверить:
|
|
|
|
| 371 |
logger.debug("Output after denormalization: Min: %s | Max: %s", output.min(), output.max())
|
| 372 |
# cv2.imshow("Output After Denormalization", output)
|
| 373 |
# cv2.waitKey(1)
|
| 374 |
+
|
| 375 |
+
return output, M # Возвращаем лицо (256x256) и матрицу M
|
|
|
|
| 376 |
|
| 377 |
def sort_by_order(face, order: str):
|
| 378 |
if order == "left-right":
|