mirror of
https://github.com/deepfakes/faceswap.git
synced 2026-10-18 14:34:30 +08:00
837bc2d51d
* FaceSwap 3 (#1515) * Update extract pipeline * Update requirements + setup for nvidia * Remove allow-growth option * tf.keras to keras updates * lib.model.losses - Port + fix all loss functions for Keras3 * lib.model - port initializers, layers. normalization to Keras3 * lib.model.autoclip to Keras 3 * Update mixed precision layer storage * model file to .keras format * Restructure nn_blocks to initialize layers in __init__ * Tensorboard - Trainer: Add Torch compatible Tensorboard callbacks - GUI event reader remove TF dependency * Loss logging - Flush TB logs on save - Replace TB live iterator for GUI * Backup models on total loss drop rather than per side * Update all models to Keras3 Compat * Remove lib.model.session * Update clip ViT to Keras 3 * plugins.extract.mask.unet-dfl - Fix for Keras3/Torch backend * Port AdaBelief to Keras 3 * setup.py: - Add --dev flag for dev tool install * Fix Keras 3 syntax * Fix LR Finder for Keras 3 * Fix mixed precision switching for Keras 3 * Add more optimizers + open up config setting * train: Remove updating FS1 weights to FS2 models * Alignments: Remove support for legacy .json files * tools.model: - Remove TF Saved Format saving - Fix Backup/Restore + Nan-Scan * Fix inference model creation for Keras 3 * Preview tool: Fix for Keras3 * setup.py: Configure keras backend * train: Migration of FS2 models to FS3 * Training: Default coverage to 100% * Remove DirectML backend * Update setup for MacOS * GUI: Force line reading to UTF-8 * Remove redundant Tensorflow references * Remove redundant code * Legacy model loading: Fix TFLamdaOp scalar ops and DepthwiseConv2D * Add vertical offset option for training * Github actions: Add more python versions * Add python version to workflow names * Github workflow: Exclude Python 3.12 for macOS * Implement custom training loop * Fs3 - Add RTX5xxx and ROCm 6.1-6.4 support (#1511) * setup.py: Add Cuda/ROCm version select options * bump minimum python version to 3.11 * Switch from setup.cgf to pyproject.toml * Documentation: Update all docs to use automodapi * Allow sysinfo to run with missing packages + correctly install tk under Linux * Bugfix: dot naming convention in clip models * lib.config: Centralise globally rather than passing as object - Add torch DataParallel for multi-gpu training - GUI: Group switches together when generating cli args - CLI: Remove deprecated multi-character argparse args - Refactor: - Centralise tensorboard reading/writing + unit tests - Create trainer plugin interfaces + add original + distributed * Update installers
106 lines
4.1 KiB
Python
106 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
|
""" Tests for Faceswap Normalization.
|
|
|
|
Adapted from Keras tests.
|
|
"""
|
|
from itertools import product
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from keras import device, regularizers, models, layers
|
|
|
|
from lib.model import normalization
|
|
from lib.utils import get_backend
|
|
|
|
from tests.lib.model.layers_test import layer_test
|
|
|
|
|
|
@pytest.mark.parametrize('dummy', [None], ids=[get_backend().upper()])
|
|
def test_instance_normalization(dummy): # pylint:disable=unused-argument
|
|
""" Basic test for instance normalization. """
|
|
layer_test(normalization.InstanceNormalization,
|
|
kwargs={'epsilon': 0.1,
|
|
'gamma_regularizer': regularizers.l2(0.01),
|
|
'beta_regularizer': regularizers.l2(0.01)},
|
|
input_shape=(3, 4, 2))
|
|
layer_test(normalization.InstanceNormalization,
|
|
kwargs={'epsilon': 0.1,
|
|
'axis': 1},
|
|
input_shape=(1, 4, 1))
|
|
layer_test(normalization.InstanceNormalization,
|
|
kwargs={'gamma_initializer': 'ones',
|
|
'beta_initializer': 'ones'},
|
|
input_shape=(3, 4, 2, 4))
|
|
layer_test(normalization.InstanceNormalization,
|
|
kwargs={'epsilon': 0.1,
|
|
'axis': 1,
|
|
'scale': False,
|
|
'center': False},
|
|
input_shape=(3, 4, 2, 4))
|
|
|
|
|
|
@pytest.mark.parametrize('dummy', [None], ids=[get_backend().upper()])
|
|
def test_group_normalization(dummy): # pylint:disable=unused-argument
|
|
""" Basic test for instance normalization. """
|
|
layer_test(normalization.GroupNormalization,
|
|
kwargs={'epsilon': 0.1,
|
|
'gamma_regularizer': regularizers.l2(0.01),
|
|
'beta_regularizer': regularizers.l2(0.01)},
|
|
input_shape=(4, 3, 4, 128))
|
|
layer_test(normalization.GroupNormalization,
|
|
kwargs={'epsilon': 0.1,
|
|
'axis': 1},
|
|
input_shape=(4, 1, 4, 256))
|
|
layer_test(normalization.GroupNormalization,
|
|
kwargs={'gamma_init': 'ones',
|
|
'beta_init': 'ones'},
|
|
input_shape=(4, 64))
|
|
layer_test(normalization.GroupNormalization,
|
|
kwargs={'epsilon': 0.1,
|
|
'axis': 1,
|
|
'group': 16},
|
|
input_shape=(3, 64))
|
|
|
|
|
|
_PARAMS_NORM = ["center", "scale"]
|
|
_VALUES_NORM = list(product([True, False], repeat=len(_PARAMS_NORM)))
|
|
_IDS = [f"{'|'.join([_PARAMS_NORM[idx] for idx, b in enumerate(v) if b])}[{get_backend().upper()}]"
|
|
for v in _VALUES_NORM]
|
|
|
|
|
|
@pytest.mark.parametrize(_PARAMS_NORM, _VALUES_NORM, ids=_IDS)
|
|
def test_adain_normalization(center, scale):
|
|
""" Basic test for Ada Instance Normalization. """
|
|
with device("cpu"):
|
|
norm = normalization.AdaInstanceNormalization(center=center, scale=scale)
|
|
shapes = [(4, 8, 8, 1280), (4, 1, 1, 1280), (4, 1, 1, 1280)]
|
|
norm.build(shapes)
|
|
expected_output_shape = norm.compute_output_shape(shapes)
|
|
inputs = [layers.Input(shape=shapes[0][1:]),
|
|
layers.Input(shape=shapes[1][1:]),
|
|
layers.Input(shape=shapes[2][1:])]
|
|
model = models.Model(inputs, norm(inputs))
|
|
data = [10 * np.random.random(shape) for shape in shapes]
|
|
|
|
actual_output = model.predict(data, verbose=0)
|
|
actual_output_shape = actual_output.shape
|
|
|
|
for expected_dim, actual_dim in zip(expected_output_shape,
|
|
actual_output_shape):
|
|
if expected_dim is not None:
|
|
assert expected_dim == actual_dim
|
|
|
|
|
|
_PARAMS = ["partial", "bias"]
|
|
_VALUES = [(0.0, False), (0.25, False), (0.5, True), (0.75, False), (1.0, True)] # type:ignore
|
|
_IDS = [f"partial={v[0]}|bias={v[1]}[{get_backend().upper()}]" for v in _VALUES]
|
|
|
|
|
|
@pytest.mark.parametrize(_PARAMS, _VALUES, ids=_IDS)
|
|
def test_rms_normalization(partial, bias): # pylint:disable=unused-argument
|
|
""" Basic test for RMS Layer normalization. """
|
|
layer_test(normalization.RMSNormalization,
|
|
kwargs={"partial": partial, "bias": bias},
|
|
input_shape=(4, 512))
|