Files
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

103 lines
3.4 KiB
Python

#!/usr/bin/env python3
"""
Source: http://home.wlu.edu/~levys/software/kbhit.py
A Python class implementing KBHIT, the standard keyboard-interrupt poller.
Works transparently on Windows and Posix (Linux, Mac OS X). Doesn't work
with IDLE.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
"""
import os
import sys
from lib.utils import get_module_objects
# Windows
if os.name == "nt":
import msvcrt # pylint:disable=import-error
# Posix (Linux, OS X)
else:
import termios
import atexit
from select import select
# pylint:disable=possibly-used-before-assignment
class KBHit:
""" Creates a KBHit object that you can call to do various keyboard things. """
def __init__(self, is_gui=False):
self.is_gui = is_gui
if os.name == "nt" or self.is_gui or not sys.stdout.isatty():
pass
else:
# Save the terminal settings
self.file_desc = sys.stdin.fileno()
self.new_term = termios.tcgetattr(self.file_desc)
self.old_term = termios.tcgetattr(self.file_desc)
# New terminal setting unbuffered
self.new_term[3] = self.new_term[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(self.file_desc, termios.TCSAFLUSH, self.new_term)
# Support normal-terminal reset at exit
atexit.register(self.set_normal_term)
def set_normal_term(self):
""" Resets to normal terminal. On Windows this is a no-op. """
if os.name == "nt" or self.is_gui or not sys.stdout.isatty():
pass
else:
termios.tcsetattr(self.file_desc, termios.TCSAFLUSH, self.old_term)
def getch(self):
""" Returns a keyboard character after kbhit() has been called.
Should not be called in the same program as getarrow(). """
if (self.is_gui or not sys.stdout.isatty()) and os.name != "nt":
return None
if os.name == "nt":
return msvcrt.getch().decode("utf-8", errors="replace")
return sys.stdin.read(1)
def getarrow(self):
""" Returns an arrow-key code after kbhit() has been called. Codes are
0 : up
1 : right
2 : down
3 : left
Should not be called in the same program as getch(). """
if (self.is_gui or not sys.stdout.isatty()) and os.name != "nt":
return None
if os.name == "nt":
msvcrt.getch() # skip 0xE0
char = msvcrt.getch()
vals = [72, 77, 80, 75]
else:
char = sys.stdin.read(3)[2]
vals = [65, 67, 66, 68]
return vals.index(ord(char.decode("utf-8", errors="replace")))
def kbhit(self):
""" Returns True if keyboard character was hit, False otherwise. """
if (self.is_gui or not sys.stdout.isatty()) and os.name != "nt":
return None
if os.name == "nt":
return msvcrt.kbhit()
d_r, _, _ = select([sys.stdin], [], [], 0)
return d_r != []
__all__ = get_module_objects(__name__)