mirror of
https://github.com/iperov/DeepFaceLab.git
synced 2025-07-06 04:52:13 -07:00
Pixel loss may help to enhance fine details and stabilize face color. Use it only if quality does not improve over time. SAE: previous SAE model will not work with this update. Greatly decreased chance of model collapse. Increased model accuracy. Residual blocks now default and this option has been removed. Improved 'learn mask'. Added masked preview (switch by space key) Converter: fixed rct/lct in seamless mode added mask mode (6) learned*FAN-prd*FAN-dst added mask editor, its created for refining dataset for FANSeg model, and not for production, but you can spend your time and test it in regular fakes with face obstructions
129 lines
4.3 KiB
Python
129 lines
4.3 KiB
Python
import cv2
|
|
from pathlib import Path
|
|
from utils import Path_utils
|
|
from utils.DFLPNG import DFLPNG
|
|
from utils.DFLJPG import DFLJPG
|
|
from utils.cv2_utils import *
|
|
from facelib import LandmarksProcessor
|
|
from interact import interact as io
|
|
|
|
def convert_png_to_jpg_file (filepath):
|
|
filepath = Path(filepath)
|
|
|
|
if filepath.suffix != '.png':
|
|
return
|
|
|
|
dflpng = DFLPNG.load (str(filepath) )
|
|
if dflpng is None:
|
|
io.log_err ("%s is not a dfl image file" % (filepath.name) )
|
|
return
|
|
|
|
dfl_dict = dflpng.getDFLDictData()
|
|
|
|
img = cv2_imread (str(filepath))
|
|
new_filepath = str(filepath.parent / (filepath.stem + '.jpg'))
|
|
cv2_imwrite ( new_filepath, img, [int(cv2.IMWRITE_JPEG_QUALITY), 85])
|
|
|
|
DFLJPG.embed_data( new_filepath,
|
|
face_type=dfl_dict.get('face_type', None),
|
|
landmarks=dfl_dict.get('landmarks', None),
|
|
ie_polys=dfl_dict.get('ie_polys', None),
|
|
source_filename=dfl_dict.get('source_filename', None),
|
|
source_rect=dfl_dict.get('source_rect', None),
|
|
source_landmarks=dfl_dict.get('source_landmarks', None) )
|
|
|
|
filepath.unlink()
|
|
|
|
def convert_png_to_jpg_folder (input_path):
|
|
input_path = Path(input_path)
|
|
|
|
io.log_info ("Converting PNG to JPG...\r\n")
|
|
|
|
for filepath in io.progress_bar_generator( Path_utils.get_image_paths(input_path), "Converting"):
|
|
filepath = Path(filepath)
|
|
convert_png_to_jpg_file(filepath)
|
|
|
|
def add_landmarks_debug_images(input_path):
|
|
io.log_info ("Adding landmarks debug images...")
|
|
|
|
for filepath in io.progress_bar_generator( Path_utils.get_image_paths(input_path), "Processing"):
|
|
filepath = Path(filepath)
|
|
|
|
img = cv2_imread(str(filepath))
|
|
|
|
if filepath.suffix == '.png':
|
|
dflimg = DFLPNG.load( str(filepath) )
|
|
elif filepath.suffix == '.jpg':
|
|
dflimg = DFLJPG.load ( str(filepath) )
|
|
else:
|
|
dflimg = None
|
|
|
|
if dflimg is None:
|
|
io.log_err ("%s is not a dfl image file" % (filepath.name) )
|
|
continue
|
|
|
|
if img is not None:
|
|
face_landmarks = dflimg.get_landmarks()
|
|
LandmarksProcessor.draw_landmarks(img, face_landmarks, transparent_mask=True, ie_polys=dflimg.get_ie_polys() )
|
|
|
|
output_file = '{}{}'.format( str(Path(str(input_path)) / filepath.stem), '_debug.jpg')
|
|
cv2_imwrite(output_file, img, [int(cv2.IMWRITE_JPEG_QUALITY), 50] )
|
|
|
|
def recover_original_aligned_filename(input_path):
|
|
io.log_info ("Recovering original aligned filename...")
|
|
|
|
files = []
|
|
for filepath in io.progress_bar_generator( Path_utils.get_image_paths(input_path), "Processing"):
|
|
filepath = Path(filepath)
|
|
|
|
if filepath.suffix == '.png':
|
|
dflimg = DFLPNG.load( str(filepath) )
|
|
elif filepath.suffix == '.jpg':
|
|
dflimg = DFLJPG.load ( str(filepath) )
|
|
else:
|
|
dflimg = None
|
|
|
|
if dflimg is None:
|
|
io.log_err ("%s is not a dfl image file" % (filepath.name) )
|
|
continue
|
|
|
|
files += [ [filepath, None, dflimg.get_source_filename(), False] ]
|
|
|
|
files_len = len(files)
|
|
for i in io.progress_bar_generator( range(files_len), "Sorting" ):
|
|
fp, _, sf, converted = files[i]
|
|
|
|
if converted:
|
|
continue
|
|
|
|
sf_stem = Path(sf).stem
|
|
|
|
files[i][1] = fp.parent / ( sf_stem + '_0' + fp.suffix )
|
|
files[i][3] = True
|
|
c = 1
|
|
|
|
for j in range(i+1, files_len):
|
|
fp_j, _, sf_j, converted_j = files[j]
|
|
if converted_j:
|
|
continue
|
|
|
|
if sf_j == sf:
|
|
files[j][1] = fp_j.parent / ( sf_stem + ('_%d' % (c)) + fp_j.suffix )
|
|
files[j][3] = True
|
|
c += 1
|
|
|
|
for file in io.progress_bar_generator( files, "Renaming", leave=False ):
|
|
fs, _, _, _ = file
|
|
dst = fs.parent / ( fs.stem + '_tmp' + fs.suffix )
|
|
try:
|
|
fs.rename (dst)
|
|
except:
|
|
io.log_err ('fail to rename %s' % (fs.name) )
|
|
|
|
for file in io.progress_bar_generator( files, "Renaming" ):
|
|
fs, fd, _, _ = file
|
|
fs = fs.parent / ( fs.stem + '_tmp' + fs.suffix )
|
|
try:
|
|
fs.rename (fd)
|
|
except:
|
|
io.log_err ('fail to rename %s' % (fs.name) )
|