第二章:AI模型

欢迎回来🐻‍❄️

第一章:渲染器用户界面(前端)中,我们了解了Upscayl的"面孔"——您看到的按钮、菜单和图像。您点击按钮选择图像,选择一些选项,然后点击"Upscayl"。但这些"选项"是什么,特别是关于AI模型的那个?

本章将全面介绍这些神奇的AI模型。可以将它们视为Upscayl背后的"智能"或"艺术家的特殊画笔",让模糊照片变得清晰美丽。

AI模型解决了什么问题?

想象一下,有一张模糊的小照片,想要打印得很大,但它看起来只是像素化的。或者您有一幅旧画想要增强,但又不想让它看起来像照片。这就是AI模型的用武之地!

AI模型解决的主要问题是**智能重建图像中缺失的细节**。

当放大一张小图像时,没有足够的信息使其变得更大更清晰。AI模型填补这些空白,使图像看起来始终是高分辨率的。它们通过从数百万个示例中学习来实现这一点。

核心用例:为图像选择正确的"风格"

就像画家可能会为不同类型的艺术使用不同的画笔或风格(如油画、水彩或素描)一样,Upscayl的AI模型提供了各种图像增强的"风格"。

  • 假设想放大一张人物照片。可能需要一个专注于真实皮肤纹理和锐利特征的模型。

  • 但如果放大的是数字绘画,可能更喜欢一个能保留清晰线条和鲜艳色彩而不会添加太多照片般噪点的模型。

问题是,一种"风格"并不适合所有情况。AI模型允许为特定图像选择最佳的"艺术家"

什么是AI模型?

从本质上讲,Upscayl中的AI模型是专门的数据文件

它们就像是超级智能的图像增强食谱或指南。每个模型都包含大量学习到的模式和规则。

  • 将它们视为"机器人艺术家":想象Upscayl是一个机器人艺术家。这些AI模型是这个机器人艺术家学习的不同"绘画风格"或"技巧"。
  • 基于大量数据训练:每个模型都通过查看无数对模糊小图像及其完美高分辨率版本进行"训练"。通过这种训练,模型学习如何将低质量图像转换为高质量图像。它学习诸如"当我看到这个模糊边缘时,它可能意味着一条锐利的线"或"这个斑驳区域应该变成光滑的皮肤"等内容。
  • 特定效果:因为它们学习不同的内容,每个模型都擅长实现特定类型的放大效果。有些适合一般照片,有些擅长数字艺术,还有些优先考虑锐度。

当您在Upscayl中选择一个模型时,实际上是在告诉机器人艺术家:“用这种绘画风格让我的照片看起来惊艳”

为什么有不同的AI模型?

如前所述,不同的图像受益于不同的放大方法。以下是Upscayl提供多种模型的原因:

模型名称 主要用途/风格 最适合
upscayl-standard-4x 通用,平衡增强 日常照片,多样化内容
high-fidelity-4x 追求高度准确和详细的结果 需要保留细节的图像
remacri-4x 适合真实照片,处理噪点效果好 照片,特别是有颗粒感的照片
ultramix-balanced-4x 混合多种技术,实现平衡效果 通用,全能型
digital-art-4x 专为插图和数字绘画设计 卡通、绘画、图形
upscayl-lite-4x 轻量模型,处理速度快,适合基本放大 快速放大,硬件性能较低时
ultrasharp-4x 优先考虑锐度,有时会引入伪影 需要非常锐利边缘的图像,特定用途

可以在Upscayl的代码中看到这些模型的定义:

在这里插入图片描述

export type ModelId = keyof typeof MODELS; // 定义模型ID的类型

这个MODELS列表帮助Upscayl跟踪所有内置的AI模型。每个条目都有一个唯一的id,供应用程序内部使用

如何在Upscayl中使用AI模型

在这里插入图片描述

得益于渲染器用户界面(前端),在Upscayl中使用AI模型非常简单

  1. 选择图像:如第一章所述,首先选择要放大的图像。
  2. 选择AI模型:在Upscayl窗口的侧面(Sidebar组件),会看到一个专门用于选择AI模型的按钮或下拉菜单。
    • 点击它会打开可用模型的列表。
    • 会看到每个模型的简短描述和通常的"前后"对比,帮助您做决定。
    • 可以选择一个内置模型,甚至可以添加自己的自定义模型(稍后会详细介绍)。
  3. 开始放大:选择所需的模型(以及其他设置如放大倍数)后,点击"Upscayl"按钮。

在这里的选择直接告诉Upscayl应用哪种"绘画风格"以获得最佳效果。

内部机制:Upscayl如何管理AI模型

现在,让我们深入了解Upscayl如何知道使用哪个模型以及如何处理您的选择。

模型选择的旅程

当您与Upscayl的渲染器用户界面(前端)交互以选择AI模型并开始放大时,以下是选择经历的旅程:

在这里插入图片描述

前端只是一个信使(如第一章所述)。它收集您的选择并将其传递给Electron主进程命令,然后由后者指导实际的放大二进制文件(upscayl-bin)使用特定的模型文件。

代码解析:如何处理模型

让我们看看实现这一功能的关键代码部分。

  1. 在UI中选择模型:
    前端中的SelectModelDialog组件是您选择模型的地方。当点击一个模型时,会调用handleModelSelect函数:

    // renderer/components/sidebar/upscayl-tab/select-model-dialog.tsx
    const SelectModelDialog = () => {
      const [selectedModelId, setSelectedModelId] = useAtom(selectedModelIdAtom); // 管理当前选定的模型
    
      const handleModelSelect = (model: ModelId | string) => {
        setSelectedModelId(model); // 更新应用程序状态中的选定模型
        setOpen(false); // 关闭模型选择对话框
        // ... 跟踪选择以进行分析 ...
      };
    
      return (
        <Dialog open={open} onOpenChange={setOpen}>
          <DialogTrigger asChild>
            <button className="btn btn-primary justify-start border-border">
              {/* 显示当前选定模型的名称 */}
              {selectedModelId in MODELS ? t(`APP.MODEL_SELECTION.MODELS.${MODELS[selectedModelId]?.id}.NAME` as any) : selectedModelId}
            </button>
          </DialogTrigger>
          <DialogContent className="z-50 sm:max-w-lg">
            {/* ... 显示所有模型选项的代码 ... */}
            {Object.entries(MODELS).map((modelData) => {
              const modelId = modelData[0] as ModelId;
              return (
                <button
                  key={modelId}
                  onClick={() => handleModelSelect(modelId)} // 点击时调用handleModelSelect
                >
                  {/* ... 模型详情如名称、描述和对比图像 ... */}
                </button>
              );
            })}
            {/* ... 自定义模型也列在这里 ... */}
          </DialogContent>
        </Dialog>
      );
    };
    

    selectedModelIdAtom(使用名为Jotai的状态管理库)跟踪您选择的模型。当调用handleModelSelect时,它会更新这个selectedModelId,UI(特别是显示当前模型的按钮)会自动更新以反映您的选择。

  2. 内置模型与自定义模型:
    Upscayl预装了几个模型,但也允许您添加自己的模型

在这里插入图片描述

内置模型位置:这些模型存储在应用程序的资源中。Upscayl确切知道在哪里找到它们:

        // electron/utils/get-resource-paths.ts
        import { join, dirname, resolve } from "path";
        import { app } from "electron";
        import isDev from "electron-is-dev";

        const appRootDir = app.getAppPath(); // 这是应用程序文件的根目录

        const modelsPath = isDev
          ? resolve(join(appRootDir, "resources", "models")) // 开发环境中,模型在这里
          : resolve(join(dirname(appRootDir), "models")); // 在完成的应用程序中,模型在这里

        export { modelsPath }; // 这个变量保存模型文件的存储路径
        ```
        这个`modelsPath`变量告诉应用程序在哪里查找构成每个AI模型的模型文件(如`.param``.bin`文件)。

    *   **检测自定义模型**:==当您选择一个自定义模型文件夹时,Upscayl会扫描它以查找有效的模型文件==。

        ```typescript
        // electron/utils/get-models.ts
        import fs from "fs"; // Node.js模块,用于文件系统操作
        import logit from "./logit";

        const getModels = async (folderPath: string | undefined) => {
          let models: string[] = []; // 存储检测到的模型名称的列表
          let isValid = false;

          if (!folderPath) { /* ... 错误处理 ... */ return null; }

          fs.readdirSync(folderPath).forEach((file) => {
            // 检查文件是否是AI模型的一部分(.param或.bin文件)
            if (file.endsWith(".param") || file.endsWith(".bin")) {
              isValid = true;
              const modelName = file.substring(0, file.lastIndexOf(".")); // 获取不带扩展名的名称
              if (!models.includes(modelName)) {
                models.push(modelName); // 将唯一的模型名称添加到列表
              }
            }
          });

          if (!isValid) { /* ... 错误处理 ... */ return null; }
          logit("🔎 检测到的自定义模型: ", models);
          return models; // 返回自定义模型名称列表
        };

        export default getModels;

getModels函数读取选定文件夹中的所有文件。
它查找以.param.bin结尾的文件,这些是构成Upscayl AI模型的两类主要文件。如果找到它们,它会提取它们的名称并将其添加到可用自定义模型列表中。

  1. 理解模型放大倍数(2x、4x):
    您可能会注意到像upscayl-standard-4x这样的模型名称。
    4x表示该模型设计用于将图像放大到原始大小的4倍。Upscayl有一种聪明的方法从模型名称中推断出这一点

    // common/check-model-scale.ts
    /**
     * 根据模型名称获取模型的放大倍数
     * @param model 模型名称
     * @returns 模型的初始放大倍数(如"4")
     */
    export default function getModelScale(model: string) {
      const modelName = model.toLowerCase();
      let initialScale = "4"; // 如果未指定,默认为4x
    
      if (modelName.includes("x2") || modelName.includes("2x")) {
        initialScale = "2"; // 如果名称中包含"x2"或"2x",则为2x模型
      } else if (modelName.includes("x3") || modelName.includes("3x")) {
        initialScale = "3"; // 如果名称中包含"x3"或"3x",则为3x模型
      } else {
        initialScale = "4"; // 否则,假定为4x
      }
      return initialScale;
    }
    

    这个函数帮助Upscayl根据您选择的模型自动设置初始放大倍数

结论

AI模型是Upscayl魔力的核心"智能"。它们是专门的"绘画风格"数据文件,像一个机器人艺术家一样,经过训练能够熟练地重建缺失的细节并放大图像。

通过选择正确的模型,可以指导Upscayl按照想要的方式增强图像,将模糊的原图变成高分辨率杰作

在下一章中,我们将连接用户界面和这些强大AI模型之间的点。我们将探索**Electron主进程命令**,它作为Upscayl的中央"大脑"或"协调者",接收选择并协调整个放大过程!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐