deepfacelab中文网

 找回密码
 立即注册(仅限QQ邮箱)
楼主: wtxx8888

20250128 DeepFaceLab_MVEfork_合体版

  [复制链接]

0

主题

14

帖子

1921

积分

初级丹圣

Rank: 8Rank: 8

积分
1921
发表于 2025-10-9 20:02:48 | 显示全部楼层
wtxx8888 发表于 2025-10-9 18:18
这个大小经过测试的,再大,会经常无法显示完全,比如网上直接扒的预览图名,就会显示不完(名字太长)。 ...



因为你档案加密了,所以我没法改动,以下是在原版中验证可以运行的代码


# 新增改进的标签函数
    def improved_label_face_filename(self, image, filename):
        """
        改进的文件名标签函数
        - 字体更大
        - 去除扩展名
        - 智能颜色选择
        """
        import cv2
        import numpy as np
        
        # 确保 image 是 numpy 数组而不是 UMat
        if hasattr(image, 'get'):  # 如果是 UMat
            image = image.get()
        
        h, w = image.shape[:2]
        
        # 去除文件扩展名
        filename_without_ext = Path(filename).stem
        
        # 计算字体大小 - 基于图像高度,调大字体
        font_scale = h / 200  # 从原来的 400 改为 200,字体更大
        
        # 字体厚度
        thickness = max(2, int(font_scale * 2))  # 增加厚度
        
        # 获取左下角区域的颜色信息用于智能颜色选择
        bottom_left_region = image[max(0, h-50):h, 0:min(w, 200)]  # 左下角区域
        
        # 计算区域的平均颜色
        if bottom_left_region.size > 0:
            avg_color = np.mean(bottom_left_region, axis=(0, 1))
            # 计算亮度 (使用加权平均)
            brightness = 0.299 * avg_color[0] + 0.587 * avg_color[1] + 0.114 * avg_color[2]
        else:
            brightness = 0.5
        
        # 根据平均亮度选择文字颜色和背景颜色
        if brightness > 0.6:
            text_color = (0, 0, 0)  # 亮背景用黑色字
            bg_color = (0.8, 0.8, 0.8)  # 浅灰背景
        elif brightness < 0.4:
            text_color = (1, 1, 1)  # 暗背景用白色字
            bg_color = (0.2, 0.2, 0.2)  # 深灰背景
        else:
            # 中等亮度区域,使用对比色
            if brightness > 0.5:
                text_color = (0, 0, 0)  # 黑色文字
                bg_color = (0.9, 0.9, 0.9)  # 更亮的背景
            else:
                text_color = (1, 1, 1)  # 白色文字
                bg_color = (0.1, 0.1, 0.1)  # 更暗的背景
        
        # 添加文字背景增强可读性
        text_size, _ = cv2.getTextSize(filename_without_ext, cv2.FONT_HERSHEY_SIMPLEX, font_scale, thickness)
        
        # 文字位置 - 左下角
        padding = 10
        text_x = padding
        text_y = h - padding
        
        # 背景区域尺寸
        bg_height = text_size[1] + padding * 2
        bg_width = text_size[0] + padding * 2
        
        # 确保背景区域在图像范围内
        bg_x1 = max(0, text_x - padding // 2)
        bg_y1 = max(0, text_y - text_size[1] - padding)
        bg_x2 = min(w, bg_x1 + bg_width)
        bg_y2 = min(h, bg_y1 + bg_height)
        
        # 创建背景区域
        if bg_y1 < bg_y2 and bg_x1 < bg_x2:
            bg_roi = image[bg_y1:bg_y2, bg_x1:bg_x2]
            
            # 创建半透明背景
            alpha = 0.7  # 背景透明度
            bg_roi[:] = bg_roi * (1 - alpha) + np.array(bg_color) * alpha
        
        # 添加文字 - 确保返回的是 numpy 数组
        result_image = cv2.putText(image.copy(), filename_without_ext, (text_x, text_y),
                           cv2.FONT_HERSHEY_SIMPLEX, font_scale, text_color, thickness, cv2.LINE_AA)
        
        # 确保返回的是 numpy 数组
        if hasattr(result_image, 'get'):  # 如果是 UMat
            result_image = result_image.get()
        
        return result_image

    #override
    def on_initialize_options(self):
        # ... 其余代码保持不变 ...

回复 支持 反对

使用道具 举报

15

主题

3547

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
19528

真我风采勋章万事如意节日勋章

 楼主| 发表于 2025-10-9 20:08:36 | 显示全部楼层
本帖最后由 wtxx8888 于 2025-10-9 20:37 编辑
forumphp 发表于 2025-10-9 20:02
因为你档案加密了,所以我没法改动,以下是在原版中验证可以运行的代码

。。。我知道怎么改,新版这里加密,是因为,可能被人挂广告。(有验证,不允许替换文件)
如果你势必想改,只能用前一个版本,前版本的这里,可以自己改参数值。(有注释,哪个是管字体大小的)
(但前版本,是不支持512遮罩的。。。为个字体,放弃512遮罩,个人觉得属于 因小失大)
另提一嘴,你这代码,是不支持中文的,意思是,文件名的中文(日文,韩文等),是无法显示的。。。(CV2库,不支持显示中文)

回复 支持 反对

使用道具 举报

15

主题

3547

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
19528

真我风采勋章万事如意节日勋章

 楼主| 发表于 2025-10-9 20:45:07 | 显示全部楼层
本帖最后由 wtxx8888 于 2025-10-9 20:55 编辑
forumphp 发表于 2025-10-9 20:02
因为你档案加密了,所以我没法改动,以下是在原版中验证可以运行的代码

对了,有个办法,可以让你,看到大点的文字。
就是,把预览图的排数增多。图像会变小,对应的,文字就会变得大些。
3排或4排的预览,文字绝对会看清楚。(还小,就增加排数。文字默认值,是4排为基准,设置的)

3排时的文字大小,不大可能,还看不清楚把?:
2025-10-09_205222.png
回复 支持 反对

使用道具 举报

0

主题

14

帖子

1921

积分

初级丹圣

Rank: 8Rank: 8

积分
1921
发表于 2025-10-9 21:15:58 | 显示全部楼层
wtxx8888 发表于 2025-10-9 20:45
对了,有个办法,可以让你,看到大点的文字。
就是,把预览图的排数增多。图像会变小,对应的,文字就会变 ...

解法在下一楼的说明
回复 支持 反对

使用道具 举报

0

主题

14

帖子

1921

积分

初级丹圣

Rank: 8Rank: 8

积分
1921
发表于 2025-10-9 21:17:06 | 显示全部楼层
pasanonic 发表于 2025-10-9 19:39
模型分辨率不同  坐标不一样
label_face.py 里可以改 位置和大小

.\DeepFaceLab\utils\label_face.py
这个方法最简单,以下修改后的代码,储存成label_face.py
将档案拷贝到.\DeepFaceLab\utils\
记得将原来的label_face.py先备份好
各版本包含魔改版都适用,不支持中文图档名会乱码


import cv2
import numpy as np
"""不支持中文档名,不然转换为 PIL 问题更大
base_font_scale = 0.3
基础字体大小系数
数值越大,基础字体越大,在33行调整常规 0.3 根据需要自行调整
当前设置为0.3,属于中等的大小
font_scale = base_font_scale * (width / 128)
动态计算最终字体大小
width / 128:以128像素宽度为基准进行比例缩放
如果图像宽度=128px,字体大小=0.4
如果图像宽度=256px,字体大小=0.8
如果图像宽度=64px,字体大小=0.2
font_scale = max(0.3, min(font_scale, 1.0))
限制字体大小范围在0.3到1.0之间
min(font_scale, 1.0):防止字体过大,最大1.0
max(0.3, ...):防止字体过小,最小0.3
thickness = max(1, int(font_scale * 2))
文字粗细也基于字体大小调整
厚度 = 字体大小 × 2
至少为1像素,确保文字可见
"""

def label_face_filename(face, filename):
    # 1. 去除文件扩展名
    filename_without_ext = filename.rsplit('.', 1)[0] if '.' in filename else filename

    # 根据图像大小自动调整字体
    height, width = face.shape[:2]

    # ========== 文字大小调整段落开始 ==========
    # 计算合适的字体大小 - 基于图像尺寸自动调整
    base_font_scale = 0.3  # 基础字体大小系数,控制整体字体大小基准
    font_scale = base_font_scale * (width / 128)  # 基于128px宽度进行比例调整
    # 限制字体大小范围,确保不会太小或太大
    font_scale = max(0.3, min(font_scale, 1.0))  # 字体大小限制在0.3到1.0之间
    # ========== 文字大小调整段落结束 ==========

    font = cv2.FONT_HERSHEY_SIMPLEX
    # 文字粗细也基于字体大小调整
    thickness = max(1, int(font_scale * 2))  # 厚度 = 字体大小 × 2,至少为1

    # 计算文字位置和尺寸
    text_size = cv2.getTextSize(filename_without_ext, font, font_scale, thickness)[0]
    org = (5, height - 10)

    # 确保文字不会超出图像范围
    if org[0] + text_size[0] > width:
        org = (max(0, width - text_size[0] - 5), org[1])

    face = face.copy()

    # 3. 智能选择文字颜色 - 分析左下角区域的颜色
    # 定义左下角区域(文字背景区域)
    bg_region = face[org[1] - text_size[1] - 5rg[1] + 5,
                     org[0] - 5rg[0] + text_size[0] + 5]

    if bg_region.size > 0:
        # 计算区域的平均颜色
        avg_color = np.mean(bg_region, axis=(0, 1))

        # 计算颜色的亮度 (使用加权平均)
        brightness = 0.299 * avg_color[2] + 0.587 * avg_color[1] + 0.114 * avg_color[0]

        # 根据背景亮度选择文字颜色
        if brightness > 128:  # 背景较亮,使用深色文字
            text_color = (0, 0, 0)  # 黑色
            bg_color = (255, 255, 255)  # 白色背景
        else:  # 背景较暗,使用浅色文字
            text_color = (255, 255, 255)  # 白色
            bg_color = (0, 0, 0)  # 黑色背景
    else:
        # 默认颜色
        text_color = (255, 255, 255)
        bg_color = (0, 0, 0)

    # 绘制背景矩形(带透明度)
    overlay = face.copy()
    cv2.rectangle(overlay,
                 (org[0] - 3, org[1] - text_size[1] - 3),
                 (org[0] + text_size[0] + 3, org[1] + 3),
                 bg_color, -1)

    # 添加半透明效果
    alpha = 0.7  # 背景透明度
    cv2.addWeighted(overlay, alpha, face, 1 - alpha, 0, face)

    # 添加文字
    cv2.putText(face, filename_without_ext, org, font, font_scale, text_color, thickness, cv2.LINE_AA)

    return face

label_face.rar

1.59 KB, 下载次数: 1

回复 支持 反对

使用道具 举报

15

主题

3547

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
19528

真我风采勋章万事如意节日勋章

 楼主| 发表于 2025-10-9 21:40:36 | 显示全部楼层
本帖最后由 wtxx8888 于 2025-10-9 22:45 编辑
forumphp 发表于 2025-10-9 21:15
解法在下一楼的说明

其他 及2024-1001的早期版本,是开源的,自行随便 更改此文件。。。
回复 支持 反对

使用道具 举报

0

主题

14

帖子

1921

积分

初级丹圣

Rank: 8Rank: 8

积分
1921
发表于 2025-10-10 00:56:41 | 显示全部楼层
wtxx8888 发表于 2025-10-9 20:08
。。。我知道怎么改,新版这里加密,是因为,可能被人挂广告。(有验证,不允许替换文件)
如果你势必想改 ...

"""
这种方式可以处理中文等其它语言不会乱码
确保图像数据是uint8类型
如果PIL处理失败,自动回退到OpenCV方案
处理float32和float64数据类型
在try块内导入PIL,避免没有安装时崩溃
即使PIL有问题,代码也能正常工作,只是中文会显示为英文或乱码。如果确实需要中文支持,请确保安装了Pillow:
pip install Pillow
"""
import cv2
import numpy as np

def label_face_filename(face, filename):
    # 1. 去除文件扩展名
    filename_without_ext = filename.rsplit('.', 1)[0] if '.' in filename else filename

    # 确保图像数据类型是uint8
    if face.dtype != np.uint8:
        if face.dtype == np.float32 or face.dtype == np.float64:
            # 如果是float类型,假设范围是0-1,转换为0-255
            face = (face * 255).astype(np.uint8)
        else:
            # 其他类型直接转换
            face = face.astype(np.uint8)

    # 根据图像大小自动调整
    height, width = face.shape[:2]

    face = face.copy()

    # 尝试使用PIL处理中文,如果失败则回退到OpenCV
    try:
        from PIL import Image, ImageDraw, ImageFont

        # 将OpenCV图像转换为PIL图像 (BGR to RGB)
        pil_image = Image.fromarray(cv2.cvtColor(face, cv2.COLOR_BGR2RGB))
        draw = ImageDraw.Draw(pil_image)

        # 尝试加载中文字体
        try:
            font_paths = [
                "C:/Windows/Fonts/simhei.ttf",  # Windows 黑体
                "C:/Windows/Fonts/simsun.ttc",  # Windows 宋体
                "/System/Library/Fonts/PingFang.ttc",  # macOS
                "/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf",  # Linux
                "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",  # Linux 文泉驿
            ]

            font_size = max(12, int(height * 0.08))
            font = None

            for font_path in font_paths:
                try:
                    font = ImageFont.truetype(font_path, font_size)
                    break
                except:
                    continue

            if font is None:
                font = ImageFont.load_default()

        except Exception as e:
            font = ImageFont.load_default()
            font_size = 12

        # 计算文字位置和尺寸
        try:
            bbox = draw.textbbox((0, 0), filename_without_ext, font=font)
            text_width = bbox[2] - bbox[0]
            text_height = bbox[3] - bbox[1]
        except:
            text_width, text_height = draw.textsize(filename_without_ext, font=font)

        # 文字位置
        x = 5
        y = height - text_height - 5

        if x + text_width > width:
            x = max(0, width - text_width - 5)

        # 智能选择文字颜色
        bg_region_x1 = max(0, x - 3)
        bg_region_y1 = max(0, y - 3)
        bg_region_x2 = min(width, x + text_width + 3)
        bg_region_y2 = min(height, y + text_height + 3)

        bg_region = face[bg_region_y1:bg_region_y2, bg_region_x1:bg_region_x2]

        if bg_region.size > 0:
            avg_color = np.mean(bg_region, axis=(0, 1))
            brightness = 0.299 * avg_color[2] + 0.587 * avg_color[1] + 0.114 * avg_color[0]

            if brightness > 128:
                text_color = (0, 0, 0)
                bg_color = (255, 255, 255)
            else:
                text_color = (255, 255, 255)
                bg_color = (0, 0, 0)
        else:
            text_color = (255, 255, 255)
            bg_color = (0, 0, 0)

        # 绘制半透明背景
        bg_image = Image.new('RGB', (width, height), bg_color)
        pil_image = Image.blend(pil_image, bg_image, alpha=0.6)

        # 重新创建draw对象
        draw = ImageDraw.Draw(pil_image)
        draw.text((x, y), filename_without_ext, fill=text_color, font=font)

        # 转换回OpenCV格式
        face_labeled = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

        return face_labeled

    except Exception as e:
        # 如果PIL处理失败,回退到OpenCV的英文显示
        print(f"IL处理失败,使用OpenCV回退方案: {e}")
        return label_face_filename_fallback(face, filename_without_ext)

def label_face_filename_fallback(face, filename):
    """OpenCV回退方案,只支持英文"""
    # 确保图像数据类型是uint8
    if face.dtype != np.uint8:
        if face.dtype == np.float32 or face.dtype == np.float64:
            face = (face * 255).astype(np.uint8)
        else:
            face = face.astype(np.uint8)

    height, width = face.shape[:2]

    # 计算合适的字体大小
    base_font_scale = 0.4
    font_scale = base_font_scale * (width / 128)
    font_scale = max(0.3, min(font_scale, 1.0))

    font = cv2.FONT_HERSHEY_SIMPLEX
    thickness = max(1, int(font_scale * 2))

    # 计算文字位置
    text_size = cv2.getTextSize(filename, font, font_scale, thickness)[0]
    org = (5, height - 10)

    if org[0] + text_size[0] > width:
        org = (max(0, width - text_size[0] - 5), org[1])

    face = face.copy()

    # 智能选择文字颜色
    bg_region = face[org[1] - text_size[1] - 5rg[1] + 5,
                     org[0] - 5rg[0] + text_size[0] + 5]

    if bg_region.size > 0:
        avg_color = np.mean(bg_region, axis=(0, 1))
        brightness = 0.299 * avg_color[2] + 0.587 * avg_color[1] + 0.114 * avg_color[0]

        if brightness > 128:
            text_color = (0, 0, 0)
            bg_color = (255, 255, 255)
        else:
            text_color = (255, 255, 255)
            bg_color = (0, 0, 0)
    else:
        text_color = (255, 255, 255)
        bg_color = (0, 0, 0)

    # 绘制背景
    overlay = face.copy()
    cv2.rectangle(overlay,
                 (org[0] - 3, org[1] - text_size[1] - 3),
                 (org[0] + text_size[0] + 3, org[1] + 3),
                 bg_color, -1)

    alpha = 0.7
    cv2.addWeighted(overlay, alpha, face, 1 - alpha, 0, face)

    # 添加文字
    cv2.putText(face, filename, org, font, font_scale, text_color, thickness, cv2.LINE_AA)

    return face

回复 支持 反对

使用道具 举报

15

主题

3547

帖子

1万

积分

高级丹圣

Rank: 13Rank: 13Rank: 13Rank: 13

积分
19528

真我风采勋章万事如意节日勋章

 楼主| 发表于 2025-10-10 03:37:06 | 显示全部楼层
本帖最后由 wtxx8888 于 2025-10-10 03:38 编辑
forumphp 发表于 2025-10-10 00:56
"""
这种方式可以处理中文等其它语言不会乱码
确保图像数据是uint8类型

都说了,你自己随便改 开源的版本。
我又不是,不会写这部分 和不知道哪个管字体。。。
自认有能力,我前面开源的版本,可以改出任何 你想要的。。。
回复 支持 反对

使用道具 举报

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

GMT+8, 2025-10-19 02:34 , Processed in 0.103531 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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