Files
faceswap/lib/align/thumbnails.py
T
torzdf 837bc2d51d Faceswap 3 (#1516)
* 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
2025-12-21 02:45:11 +00:00

86 lines
3.0 KiB
Python

#!/usr/bin/env python3
""" Handles the generation of thumbnail jpgs for storing inside an alignments file/png header """
from __future__ import annotations
import logging
import typing as T
import numpy as np
from lib.logger import parse_class_init
from lib.utils import get_module_objects
if T.TYPE_CHECKING:
from lib import align
logger = logging.getLogger(__name__)
class Thumbnails():
""" Thumbnail images stored in the alignments file.
The thumbnails are stored as low resolution (64px), low quality jpg in the alignments file
and are used for the Manual Alignments tool.
Parameters
----------
alignments: :class:'~lib.align.alignments.Alignments`
The parent alignments class that these thumbs belong to
"""
def __init__(self, alignments: align.alignments.Alignments) -> None:
logger.debug(parse_class_init(locals()))
self._alignments_dict = alignments.data
self._frame_list = list(sorted(self._alignments_dict))
logger.debug("Initialized %s", self.__class__.__name__)
@property
def has_thumbnails(self) -> bool:
""" bool: ``True`` if all faces in the alignments file contain thumbnail images
otherwise ``False``. """
retval = all(np.any(T.cast(np.ndarray, face.get("thumb")))
for frame in self._alignments_dict.values()
for face in frame["faces"])
logger.trace(retval) # type:ignore[attr-defined]
return retval
def get_thumbnail_by_index(self, frame_index: int, face_index: int) -> np.ndarray:
""" Obtain a jpg thumbnail from the given frame index for the given face index
Parameters
----------
frame_index: int
The frame index that contains the thumbnail
face_index: int
The face index within the frame to retrieve the thumbnail for
Returns
-------
:class:`numpy.ndarray`
The encoded jpg thumbnail
"""
retval = self._alignments_dict[self._frame_list[frame_index]]["faces"][face_index]["thumb"]
assert retval is not None
logger.trace( # type:ignore[attr-defined]
"frame index: %s, face_index: %s, thumb shape: %s",
frame_index, face_index, retval.shape)
return retval
def add_thumbnail(self, frame: str, face_index: int, thumb: np.ndarray) -> None:
""" Add a thumbnail for the given face index for the given frame.
Parameters
----------
frame: str
The name of the frame to add the thumbnail for
face_index: int
The face index within the given frame to add the thumbnail for
thumb: :class:`numpy.ndarray`
The encoded jpg thumbnail at 64px to add to the alignments file
"""
logger.debug("frame: %s, face_index: %s, thumb shape: %s thumb dtype: %s",
frame, face_index, thumb.shape, thumb.dtype)
self._alignments_dict[frame]["faces"][face_index]["thumb"] = thumb
__all__ = get_module_objects(__name__)