极致的遮罩处理(二):在训练中使用FANSeg遮罩(更新)

教程发布 FANSeg,遮罩
DeepFaceLab
DeepFaceLab DeepFaceLab 2019-12-26 12:50:55
用户等级:0级

本文是遮罩系列的第二篇文章的新版修改方法,由于新版DeepFaceLab改动较大,所以另开一篇文章详细说明,(旧版遮罩修改办法:极致的遮罩处理(二):在训练中使用FANSeg遮罩,这篇文章主要是承接极致的遮罩处理(一):DeepFaceLab手动遮罩编辑。没看过的可以先补一下课。


第一步:

打开_internal\DeepFaceLab\main.py文件,找到
p.set_defaults (func=process_dev_apply_celebamaskhq)

在下面加上:

    def process_extract_fanseg(arguments):
        os_utils.set_process_lowest_prio()
        from mainscripts import Extractor
        Extractor.extract_fanseg( arguments.input_dir,
                                  device_args={'cpu_only'  : arguments.cpu_only,
                                               'multi_gpu' : arguments.multi_gpu,
                                              }
                                )

    p = subparsers.add_parser( "extract_fanseg", help="Extract fanseg mask from faces.")
    p.add_argument('--input-dir', required=True, action=fixPathAction, dest="input_dir", help="Input directory. A directory containing the files you wish to process.")
    p.add_argument('--multi-gpu', action="store_true", dest="multi_gpu", default=False, help="Enables multi GPU.")
    p.add_argument('--cpu-only', action="store_true", dest="cpu_only", default=False, help="Extract on CPU.")
    p.set_defaults (func=process_extract_fanseg)
第二步:

由于作者修改了函数接口,还需要修改_internal\DeepFaceLab\mainscripts\Extractor.py文件,找到这个文件的第98行,在TernausNet函数256前面添加字符串参数”FANSeg”:

Image

第三步:

_internal\DeepFaceLab\mainscripts\Extractor.py文件最下面加上如下代码:

#unused in end user workflow
def extract_fanseg(input_dir, device_args={} ):
    multi_gpu = device_args.get('multi_gpu', False)
    cpu_only = device_args.get('cpu_only', False)
    
    input_path = Path(input_dir)
    if not input_path.exists():
        raise ValueError('Input directory not found. Please ensure it exists.')
    
    paths_to_extract = []
    for filename in Path_utils.get_image_paths(input_path) :
        filepath = Path(filename)
        if filepath.suffix == '.png':
            dflimg = DFLPNG.load( str(filepath) )
        elif filepath.suffix == '.jpg':
            dflimg = DFLJPG.load ( str(filepath) )
        else:
            dflimg = None

        if dflimg is not None:
            paths_to_extract.append (filepath)
    
    paths_to_extract_len = len(paths_to_extract)
    if paths_to_extract_len > 0:
        io.log_info ("Performing extract fanseg for %d files..." % (paths_to_extract_len) )
        data = ExtractSubprocessor ([ ExtractSubprocessor.Data(filename) for filename in paths_to_extract ], 'fanseg', multi_gpu=multi_gpu, cpu_only=cpu_only).run()

#unused in end user workflow
def extract_umd_csv(input_file_csv, 
                    image_size=256,
                    face_type='full_face',
                    device_args={} ):
                    
    #extract faces from umdfaces.io dataset csv file with pitch,yaw,roll info.
    multi_gpu = device_args.get('multi_gpu', False)
    cpu_only = device_args.get('cpu_only', False)
    face_type = FaceType.fromString(face_type)
    
    input_file_csv_path = Path(input_file_csv)
    if not input_file_csv_path.exists():
        raise ValueError('input_file_csv not found. Please ensure it exists.')
    
    input_file_csv_root_path = input_file_csv_path.parent
    output_path = input_file_csv_path.parent / ('aligned_' + input_file_csv_path.name)
    
    io.log_info("Output dir is %s." % (str(output_path)) )
    
    if output_path.exists():
        output_images_paths = Path_utils.get_image_paths(output_path)
        if len(output_images_paths) > 0:
            io.input_bool("WARNING !!! \n %s contains files! \n They will be deleted. \n Press enter to continue." % (str(output_path)), False )
            for filename in output_images_paths:
                Path(filename).unlink()
    else:
        output_path.mkdir(parents=True, exist_ok=True)
        
    try:
        with open( str(input_file_csv_path), 'r') as f:
            csv_file = f.read()
    except Exception as e:
        io.log_err("Unable to open or read file " + str(input_file_csv_path) + ": " + str(e) )
        return
        
    strings = csv_file.split('\n')        
    keys = strings[0].split(',')
    keys_len = len(keys)
    csv_data = []
    for i in range(1, len(strings)):
        values = strings[i].split(',')
        if keys_len != len(values):
            io.log_err("Wrong string in csv file, skipping.")
            continue
            
        csv_data += [ { keys[n] : values[n] for n in range(keys_len) } ]
    
    data = []
    for d in csv_data:
        filename = input_file_csv_root_path / d['FILE']
        
        pitch, yaw, roll = float(d['PITCH']), float(d['YAW']), float(d['ROLL']) 
        if pitch < -90 or pitch > 90 or yaw < -90 or yaw > 90 or roll < -90 or roll > 90:
            continue
            
        pitch_yaw_roll = pitch/90.0, yaw/90.0, roll/90.0
        
        x,y,w,h = float(d['FACE_X']), float(d['FACE_Y']), float(d['FACE_WIDTH']), float(d['FACE_HEIGHT'])

        data += [ ExtractSubprocessor.Data(filename=filename, rects=[ [x,y,x+w,y+h] ], pitch_yaw_roll=pitch_yaw_roll) ]
        
    images_found = len(data)
    faces_detected = 0
    if len(data) > 0:
        io.log_info ("Performing 2nd pass from csv file...")
        data = ExtractSubprocessor (data, 'landmarks', multi_gpu=multi_gpu, cpu_only=cpu_only).run()
        
        io.log_info ('Performing 3rd pass...')
        data = ExtractSubprocessor (data, 'final', image_size, face_type, None, multi_gpu=multi_gpu, cpu_only=cpu_only, manual=False, final_output_path=output_path).run()
        faces_detected += sum([d.faces_detected for d in data])
        
        
    io.log_info ('-------------------------')
    io.log_info ('Images found:        %d' % (images_found) )
    io.log_info ('Faces detected:      %d' % (faces_detected) )
    io.log_info ('-------------------------')
第四步:

如果你使用的是2019.12.23版,你还需要修改_internal\DeepFaceLab\mainscripts\MaskEditorTool.py文件,找到该文件的524和535行:

ie_polys=ed.get_ie_polys().dump(), eyebrows_expand_mod=eyebrows_expand_mod )
修改为
 ie_polys=ed.get_ie_polys(), eyebrows_expand_mod=eyebrows_expand_mod )
,ie_polys=ed.get_ie_polys().dump(),eyebrows_expand_mod=eyebrows_expand_mod )
修改为
,ie_polys=ed.get_ie_polys(),eyebrows_expand_mod=eyebrows_expand_mod )
第五步:
建立一个批处理文件,运行这个批处理文件后,data_dst\aligned里面的头像就都用FANSeg编辑一遍了,内容为下:
@echo off
call _internal\setenv.bat

"%PYTHON_EXECUTABLE%" "%DFL_ROOT%\main.py" extract_fanseg ^
    --input-dir "%WORKSPACE%\data_dst\aligned"  
    
pause
处理以后,可以再用遮罩编辑工具查看,会发现遮罩的样式发生了改变,眉毛部分处理的非常圆滑,脸部边缘识别准确,大部分手的遮挡也处理的很好。


极致的遮罩处理(二):在训练中使用FANSeg遮罩
极致的遮罩处理(二):在训练中使用FANSeg遮罩
极致的遮罩处理(二):在训练中使用FANSeg遮罩


如果不想自己动手可以用我们编辑修改好的文件直接使用:(已经下载的用户直接覆盖到新版即可,因为新版没有更新相关的代码。)


FANSeg_20191226


相关阅读:

楼主签名:
回帖
回复列表

版块列表

本站热帖
01 AI换脸第三步:DeepFaceLab使用教程(1.安装及分解视频) 8746
02 AI换脸第三步:DeepFaceLab使用教程(2.训练及合成) 8656
03 2GB显存畅玩 DeepFaceLab更新至2020.01.08 8344
04 P100真香:DeepFaceColab详细教程 5470
05 DeepFaceLab不同模型的参数含义 4887
06 AI换脸第二步:选择合适的DeepFaceLab版本 4878
07 选择合适的模型 H64 -H128 -DF -SAE -SAEHD 4795
08 SAEHD不香吗?谈谈SAE与SAEHD 4694
09 图像无损放大工具 Topaz Gigapixel AI v4.4.4 破解版 4679
10 一天学会AI换脸:DeepFaceLab 新手导航 4671
11 极致的遮罩处理(一):DeepFaceLab手动遮罩编辑。 4628
12 DeOldify – 一个强大的AI修复老照片(视频)项目 4439
13 AI换脸第一步:给你的电脑安装适当的显卡驱动 4071
14 合成必修课:7) convert 合成合成如何从“人皮面具”变成“真实脸部” 3714
15 DeepFaceLab H256模型免费下载 3665
16 DeepFaceLab新手基础知识:训练期间如何更改参数值? 3616
17 “增之一分则太长,减之一分则太短”,精细的调整取脸框大小,不做提脸的“登徒子” 3590
18 云盘版DeepFaceColab 在你的云盘训练模型 3572
19 DeepFaceLab更新至2019.12.29 3562
20 不做无用功 Google Colab掉线自动重连“助手” 3476