deepfacelab中文网

 找回密码
 立即注册(仅限QQ邮箱)
查看: 94|回复: 0

DFL模型改分辨率

[复制链接]

11

主题

98

帖子

1229

积分

初级丹圣

Rank: 8Rank: 8

积分
1229
 楼主| 发表于 昨天 13:41 | 显示全部楼层 |阅读模式
星级打分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN  参与人数:0  我的评分:未评
方法:
1、修改data文件的resolution字段为你想要改的分辨率。用你们最喜欢的方法就是新建一个高分辨率相同四维的模型ae_dims e_dims d_dims mask_dims然后覆盖data文件
2、如果带t参数模型确保分辨率能被32整除,也就是下采样5次。不带t的模型要确保分辨率可被16整除,也就是下采样4次
3、重置inter,用你们最喜欢的方法就是把inter删了,inter与分辨率强相关,从解码器的输出尺寸和inter接收的尺寸不一样是不行的
4、开启模型训练,编码器和解码器的恢复过程很快,几乎是和inter同时恢复
应用:低分辨率高参模型改高分辨率模型复用、预训练模型修改
这是一个在深度学习中比较常见的做法




如果你是用户觉得这个手动操作太麻烦了,可以花费2灵石下载我做好的脚本,拖入你DFL目录就可以用




如果你是独立版本开发者,我这里提供了一个快捷脚本

@echo off
call _internal\setenv.bat
"%PYTHON_EXECUTABLE%" "%DFL_ROOT%\tools.py" modify_resolution ^
    --model-path "你的模型路径" ^
    --model-name "你的模型名称"
pause


%DFLROOT%\tools.py:
import argparse
from core import osex
from pathlib import Path
#from utils.RVFF.read_value_from_file import read_value_from_file
import os

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()


class fixPathAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, os.path.abspath(os.path.expanduser(values)))


def process_modify_resolution(arguments):
    osex.set_process_lowest_prio()
    from utils import modify_resolution
    modify_resolution.main(arguments.model_path, arguments.model_name)
p = subparsers.add_parser("modify_resolution", help="None.")
p.add_argument('--model-path', required=True, action=fixPathAction, dest="model_path",help="Input directory. A directory containing the files you wish to process.")
p.add_argument('--model-name', required=True, dest="model_name",)
p.set_defaults(func=process_modify_resolution)


if __name__ == "__main__":
    arguments = parser.parse_args()
    arguments.func(arguments)


%DFLROOT%\utils\modify_resolution.py
import os
import pickle
from pathlib import Path
#from utils.RVFF.read_value_from_file import read_value_from_file
import numpy as np


def modify_resolution(model_path, model_name):
    model_data_path = Path(model_path) / f'{model_name}_data.dat'
   
    # 检查文件是否存在
    if not model_data_path.exists():
        print(f"模型数据文件不存在: {model_data_path}")
        return False
    modified_resolution = 416 #这里输入你的分辨率
    if modified_resolution is None or modified_resolution == "":
        print("未找到modified_resolution配置,跳过修改")
        return False
   
    try:
        modified_resolution = int(modified_resolution)
        print(f"读取到modified_resolution: {modified_resolution}")
    except (ValueError, TypeError):
        print(f"modified_resolution不是有效整数: {modified_resolution}")
        return False

    try:
        with open(model_data_path, 'rb') as f:
            model_data = pickle.load(f)
    except Exception as e:
        print(f"无法读取模型数据文件: {e}")
        return False

    archi = model_data.get('options', {}).get('archi', '')
    print(f"获取到模型架构: {archi}")
    '''
   
    由于模型读取分辨率是从data读的,训练也是按照从data读到什么就怎么练
    所以这里直接改data里面的resolution字段就可以完成修改分辨率
   
    '''
    # 检查分辨率是否可以被正确地向下采样
    divisor = 32 if 't' in archi.lower() else 16
    if modified_resolution % divisor != 0:
        print(f"错误: 对于架构 {archi},分辨率必须能被{divisor}整除")
        return False

    old_resolution = model_data.get('options', {}).get('resolution', None)
    print(f"当前分辨率: {old_resolution}, 新分辨率: {modified_resolution}")
   
    model_data.setdefault('options', {})['resolution'] = modified_resolution
   

    try:
        with open(model_data_path, 'wb') as f:
            pickle.dump(model_data, f)
        print(f"模型数据文件已更新,分辨率从 {old_resolution} 修改为 {modified_resolution}")
    except Exception as e:
        print(f"无法保存模型数据文件: {e}")
        return False



    archi = model_data.get('options', {}).get('archi', '')
    print(f"获取到模型架构: {archi}")

    weights_to_reset = []
    '''
   
    这里重置的原因是因为interresolution强相关,不兼容分辨率带来的变化
    而编码器只要你不改编码器大小,无论什么分辨率都是一样的
    而解码器可以通过学习,适应新分辨率的inter传递的数据
   
    '''
    if 'df' in archi.lower():
        # DF架构:重置inter
        weights_to_reset = [f'{model_name}_inter.npy']
    elif 'liae' in archi.lower():
        # LIAE架构:重置inter_ABinter_B
        weights_to_reset = [f'{model_name}_inter_AB.npy', f'{model_name}_inter_B.npy']
    else:
        print(f"未知架构类型: {archi},跳过权重重置")
        return True

    for weight_file in weights_to_reset:
        weight_path = Path(model_path) / weight_file
        if weight_path.exists():
            try:
                # 删除权重文件,这样模型在加载时会重新初始化它们
                weight_path.unlink()
                print(f"已删除权重文件以待重新初始化: {weight_file}")
            except Exception as e:
                print(f"无法删除权重文件 {weight_file}: {e}")
                return False
        else:
            print(f"权重文件不存在,将在训练时重新初始化: {weight_file}")
    print("分辨率修改和权重重置标记完成")
    return True


def main(model_path,model_name):
    model_name  = str(model_name) + "_SAEHD"
    success = modify_resolution(model_path, model_name)
    if success:
        print("分辨率修改成功")
    else:
        print("分辨率修改失败")


回复

使用道具 举报

QQ|Archiver|手机版|deepfacelab中文网 |网站地图

GMT+8, 2026-2-15 06:22 , Processed in 0.114984 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表