星级打分
平均分: 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 = []
'''
这里重置的原因是因为 inter 和 resolution 强相关,不兼容分辨率带来的变化
而编码器只要你不改编码器大小,无论什么分辨率都是一样的
而解码器可以通过学习,适应新分辨率的 inter 传递的数据
'''
if 'df' in archi.lower():
# DF 架构:重置 inter
weights_to_reset = [ f' { model_name } _inter.npy' ]
elif 'liae' in archi.lower():
# LIAE 架构:重置 inter_AB 和 inter_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( " 分辨率修改失败 " )