星级打分
平均分: NAN 参与人数: 0 我的评分: 未评
本帖最后由 caiji132156 于 2025-7-11 13:24 编辑
原版代码:
在_internal\DeepFaceLab\mainscripts\Sorter.py 的类class HistSsimSubprocessor 中:
def __init__ (self , img_list ):
self .img_list = img_list
self .img_list_len = len (img_list)
slice_count = 20000
sliced_count = self .img_list_len // slice_count
if sliced_count > 12 :
sliced_count = 11.9
slice_count = int (self .img_list_len / sliced_count)
sliced_count = self .img_list_len // slice_count
self .img_chunks_list = [ self .img_list[i*slice_count : (i+1 )*slice_count] for i in range (sliced_count) ] + \
[ self .img_list[sliced_count*slice_count:] ]
self .result = []
super ().__init__ ('HistSsim' , HistSsimSubprocessor.Cli, 0 )
#override
def process_info_generator (self ):
cpu_count = len (self .img_chunks_list)
io.log_info(f'Running on { cpu_count} threads' )
for i in range (cpu_count):
yield 'CPU%d' % (i), {'i' :i}, {}
将图像列表按每份 slice_count=20000 的大小切分为多个小块,保存在 self.img_chunks_list 中;
若总块数超过 12 块,则调整分块策略以控制线程数量;
好处是使aligned图像大体上排序过渡自然,但是2万张图片要过渡自然其实没什么意义
这就是分块太粗,而导致排序效率低下。
但
如果分块太细 ,会出现块内排序准确,块间排序无序 的情况
分块越细,块越多,全局排序的连贯性越差。
排序结果会呈现“局部有序、全局无序”的特点。
例如
块 A 的最后一张图像和块 B 的第一张图像可能是最相似的一对,但由于"不在同一块中,无法正确地将他们排序在一起"
分块大一点的
好处就是:
四不像的图片会被排在每一个块的最后面,通常这些图片都是因为风格差异大所以没有和他们相似的图片才被排除在最后
坏处就是:
2w张图片才一个块一个线程,排序效率慢
我们来假设一个情景:
我们在获得一堆aligned素材的时候
为了提升些许训练速度,我们进行了去重
此时相同画面的脸减少,数据集总量变少,假设此时少于2w张
2w张一块的排序效率太慢了,我们试试细分呢?
由于我们已经进行了去重,
每对相似的图像的总数都变少了,所以每对图像处于分块边缘的概率变小了
我们此时进行细分,出现"不在同一块中,无法正确地排序在一起"的情况变少
所以特定情景下,2w一个分块的直方图排序比进行细分的直方图排序效率低下
以下是我更改过的版本:
这个代码解释起来就是:无论数据集多大,都按照逻辑处理器总数进行分块排序
比如你有12个逻辑处理器(=线程,cpu1个大核心=2个逻辑处理器),那么就将数据集分为12个
以确保你cpu是吃满的。
当数据集的总数
小于20000*你的线程数的时候,这个比原版快
等于20000*你的线程数的时候,这个和原版一样
大于20000*你的线程数的时候,这个比原版慢
当你进行去重的时候,这个效果和原版一样
没有去重的时候,效果比原版乱一点,我自己用的时候没有什么实际上的感觉
通常情况下,没人会有4W张图片的情况下不去重进行排序的,所以一般情况下,这个代码和原版一样,只是更快
小于1000张图片的情况下,这个效果比较差。
有错误请指出,看到速改