用ControlNet+Inpaint实现stable diffusion模特换衣

在这里插入图片描述

用ControlNet+Inpaint实现stable diffusion模特换衣

  • ControlNet 训练与架构详解
    • ControlNet 的架构
    • 用于文本到图像扩散的 ControlNet
    • 训练过程
    • Zero卷积层的作用解释
  • inpaint
    • Inpaint Anything 的重要性
    • Inpaint Anything 的功能概述

在现代计算机视觉领域,稳定扩散(Stable Diffusion)技术已经成为图像修复的重要工具之一。然而,虽然稳定扩散能够有效地填补图像中的缺失区域,但是对于用户来说,对修复过程进行更精准的控制往往是一项挑战。

为了解决这一问题,我们引入了ControlNet,这是一种专门设计用于在大型预训练文本到图像扩散模型中引入空间调节控制的神经网络架构。通过结合ControlNet与稳定扩散技术,我们实现了一种全新的图像修复方法,使用户能够通过各种条件输入来精确控制修复过程,例如Canny边缘、霍夫线、用户涂鸦、人体关键点、分割图、形状法线和深度等。本研究不仅证明了ControlNet在小型和大型数据集上的稳健性,还展示了其在图像修复领域的巨大潜力,为更广泛的图像处理应用提供了全新的可能性。

在这里插入图片描述
ControlNet 是一种神经网络架构,可以通过空间局部化、特定于任务的图像条件增强大型预训练文本到图像扩散模型。我们首先介绍下ControlNet的基本结构,

然后后面描述如何将ControlNet应用到图像扩散模型Stable Diffusion,以及Inpaint的方法

ControlNet 训练与架构详解

ControlNet 的架构

ControlNet 将附加条件注入到神经网络的块中。具体来说,ControlNet 的设计目的是在预训练模型的基础上,添加可训练的副本,以便处理新的控制信息(如草图、边缘图等)。这种设计可以保留预训练模型的优点,同时增强模型的多样性和灵活性。

核心概念

  • 网络块:指一组神经层的组合,形成神经网络的一个单元,例如 ResNet 块、Conv-BN-ReLU 块、多头注意力块等。
  • 锁定参数:冻结预训练模型的参数,使其保持稳定,并将其复制为可训练的副本。
  • 零卷积:使用 1×1 卷积层,其权重和偏置初始化为零,确保初始训练时无有害噪声影响。

控制模块的添加

  1. 预训练块:

假设 F ( ⋅ ; Θ ) F(·;\Theta) F(⋅;Θ)是一个具有参数 Θ \Theta Θ的预训练神经块,将输入特征图 x x x转换为输出特征图 y y y

y = F ( x ; Θ ) y=F(x;\Theta) y=F(x;Θ)

  1. ControlNet 模块
    锁定原始块的参数 Θ \Theta Θ,并克隆为可训练副本 Θ c \Theta_c Θc

可训练副本接受外部条件向量 c c c作为输入

  1. 计算过程

ControlNet 的完整计算如下:
y c = F ( x ; Θ ) + Z ( F ( x + Z ( c ; Θ z 1 ) ; Z c ) ; Θ z 2 ) y_c = F(x;\Theta)+\Zeta(F(x+\Zeta(c;\Theta_{z1});\Zeta_c);\Theta_{z2}) yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Zc);Θz2)

其中, Z ( ⋅ ; ⋅ ) \Zeta(·;·) Z(⋅;⋅)是零卷积层, Θ z 1 \Theta_{z1} Θz1 Θ z 2 \Theta _{z2} Θz2是其参数。

  1. 零卷积的初始状态
    初始训练步骤中,零卷积的权重和偏置均为零,因此计算结果也是零,使得:
    y c = y y_c = y yc=y

用于文本到图像扩散的 ControlNet

在这里插入图片描述

架构

  • Stable Diffusion:采用 U-Net 结构,包含编码器、中间块和解码器。
  • 编码器和解码器:每个包含 12 个块,总共有 25 个块。
  • ViT(视觉变换器):在主块中包含多个交叉注意力和自注意力机制。

ControlNet 的集成

  • 位置:ControlNet 结构应用于 U-Net 的每个编码器级别,共创建 12 个编码块和 1 个中间块的可训练副本。
  • 分辨率:12 个编码块有 4 种分辨率,分别为 64×64, 32×32, 16×16 和 8×8,每种分辨率重复 3 次。

效率

  • 计算效率:冻结的参数无需计算梯度,因此训练更高效。
  • 资源消耗:与不使用 ControlNet 优化的 Stable Diffusion 相比,使用 ControlNet 优化只增加约 23% 的 GPU 内存和 34% 的时间。

训练过程

训练步骤

  1. 数据准备

将输入图像逐渐添加噪声,生成噪声图像 z t z_t zt

条件包括时间步长 t t t、文本提示 c t c_t ct以及特定任务的条件 c f c_f cf

  1. 损失函数
    目标是预测添加到噪声图像中的噪声 ϵ \epsilon ϵ

L = E z 0 , t , c t , c f , ϵ ∼ N ( 0 , 1 ) [ ∣ ∣ ϵ − ϵ θ ( z t , t , c t , c f ) ∣ ∣ 2 2 ] L = E_{z_0,t,c_t,c_f,\epsilon \sim N(0,1)}[||\epsilon - \epsilon_\theta(z_t,t,c_t,c_f)||_2^2] L=Ez0,t,ct,cf,ϵN(0,1)[∣∣ϵϵθ(zt,t,ct,cf)22]

  1. 随机替换文本提示

训练过程中,随机将 50% 的文本提示替换为空字符串,以增强 ControlNet 直接识别输入调节图像语义的能力。

Zero卷积层的作用解释

在ControlNet架构中,zero卷积层起到了关键作用。具体来说,零卷积层的权重和偏置均初始化为零,这在模型的训练过程中起到了保护和稳定作用。以下是对每个zero卷积层作用的详细解释:

  1. 初始稳定性和保护作用

初始训练时刚开始的训练,前面迭代的时候,零卷积层确保新加入的可训练网络块不会干扰预训练模型的输出。这是通过将零卷积层的权重和偏置初始化为零实现的。在训练初期,由于这些层的计算结果为零,新的可训练副本不会对模型的输出产生任何影响,从而保护了模型的稳定性。

Z ( c ; Θ z 1 ) = 0  和  Z ( c ; Θ z 2 ) = 0 \Zeta(c;\Theta_{z1}) = 0 \space和\space\Zeta(c;\Theta_{z2}) = 0 Z(c;Θz1)=0  Z(c;Θz2)=0

因此,初始输出为:
y c = F ( x ; Θ ) y_c = F(x;\Theta) yc=F(x;Θ)

在初始阶段,输出仅依赖于原始预训练模型,而不会受到新条件的噪声干扰。

  1. 渐进学习和控制注入

随着训练的进行,zero卷积层逐渐学习到新的条件信息,并将其注入到模型中。这使得可训练副本能够逐步学习并适应新的控制信息,如草图、边缘图等。

具体来说,两个zero卷积层 Z ( c ; Θ z 1 ) \Zeta(c;\Theta_{z1}) Z(c;Θz1) Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) \Zeta(F(x+\Zeta(c;\Theta_{z1});\Theta_c);\Theta_{z2}) Z(F(x+Z(c;Θz1);Θc);Θz2)

分别在两个不同的阶段起作用:

  • 第一阶段

Z ( c ; Θ z 1 ) \Zeta(c;\Theta_{z1}) Z(c;Θz1)

这个零卷积层接受外部条件向量 c c c,并将其转换为一个中间表示。

  • 第二阶段

Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) \Zeta(F(x+\Zeta(c;\Theta_{z1});\Theta_c);\Theta_{z2}) Z(F(x+Z(c;Θz1);Θc);Θz2)

这个零卷积层接受经过第一阶段处理的输出,并进一步处理,最终将新条件信息注入到模型输出中。

随着训练的进行,这些卷积层的参数会被更新,从而使模型逐渐学习到如何在输出中包含新的控制信息。

  1. 消除初始训练步骤中的噪声

零卷积层的设计确保在训练的初始阶段,不会有随机噪声影响网络的隐藏状态。这样,初始模型能够完全依赖于预训练模型的稳定性,并在此基础上逐步学习新的控制信息。

整个过程是有监督的,因为模型在训练过程中使用了成对的条件输入和目标输出图像。通过监督学习,模型逐渐学会在给定特定条件下生成相应的图像。具体步骤如下:

  1. 输入-输出对:提供(条件输入 c i c_i ci ,目标输出 y t a r g e t y_ {target} ytarget)对。
  2. Forward Pass:通过ControlNet计算生成图像 y c y_c yc
  3. Loss Calculation:计算生成图像与目标输出之间的损失。
  4. backpropagation:根据损失更新模型参数。

通过这种有监督学习方法,ControlNet能够逐步学会在给定各种条件(如草图、深度图等)下,生成符合条件的图像,从而实现文本到图像生成的精确控制。

inpaint

论文标题:Inpaint Anything: Segment Anything Meets Image Inpainting
论文地址:https://arxiv.org/abs/2304.06790
github地址:https://github.com/geekyutao/Inpaint-Anything/tree/main

在这里插入图片描述
inpaint的作用:用户可以通过点击来选择图像中的任何对象。借助强大的视觉模型,例如,SAM、LaMa和稳定扩散(SD),Inpaint Anything能够平滑地移除对象(即,删除任何东西)。此外,在用户输入文本的提示下,Insaint Anything可以用任何期望的内容填充对象(即,填充任何东西)或任意替换它的背景(即,替换任何东西)。

Inpaint Anything 的重要性

当前图像修复的进展

目前,最先进的图像修复方法,如 LaMa、Repaint、MAT、ZITS等,已经取得了显著的进步。这些方法能够成功修复大面积区域,处理复杂的重复结构,并能够很好地适应高分辨率图像。然而,这些方法通常需要对每个掩码进行精细注释,这对于训练和推理至关重要。

Segment Anything Model (SAM) 的应用潜力

Segment Anything Model (SAM) 是一个强大的分割基础模型,能够根据点或框等输入提示生成高质量的对象蒙版,并且可以为图像中的所有对象生成全面且准确的蒙版。然而,SAM 的掩模分割预测功能在图像修复领域尚未得到充分利用。

现有方法的局限

现有的修复方法只能使用上下文填充被移除的区域。人工智能生成内容(AIGC)模型为创作开辟了新的机会,有可能满足大量需求,帮助用户生成他们所需的新内容。

综合解决方案的优势

通过结合 SAM、最先进的图像修复器和AIGC 模型的优势,论文提供了一个强大且用户友好的管道,来解决更常见的修复相关问题,如对象移除、新内容填充、背景替换等。这一综合方法不仅提高了图像修复的效果,还大大简化了用户操作,使得图像修复变得更加高效和便捷。

在这里插入图片描述在这里插入图片描述

Inpaint Anything 的功能概述

删除任何内容填充任何内容替换任何内容删除任何3D删除任何视频
- 点击一个对象- 点击一个对象- 点击一个对象- 单击源视图的第一个视图中的对象- 点击视频第一帧中的对象
- 分割模型SAM将对象分割出来- SAM将目标分割出来- SAM将目标分割出来- SAM将对象分割出来(使用三个可能的掩码)- SAM将对象分割出来(使用三个可能的掩码)
- 修复模型填补“窟窿”- 输入文字提示- 输入文字提示- 选择一个掩码- 选择一个掩码
- 文本提示引导的修复模型根据文本填充“洞”- 文本提示引导的修复模型根据文本替换背景- 利用OSTrack等跟踪模型对这些视图中的目标进行跟踪- 利用OSTrack等跟踪模型对视频中的目标进行跟踪
- SAM根据跟踪结果在每个源视图中分割出目标
- 利用LaMa等修补模型对每个源视图中的对象进行修补
- 利用NeRF等新的视图合成模型合成出不含物体的场景的新视图

填充内容代码如下 :fill_anything.py

import cv2
import sys
import argparse
import numpy as np
import torch
from pathlib import Path
from matplotlib import pyplot as plt
from typing import Any, Dict, List

from sam_segment import predict_masks_with_sam
from stable_diffusion_inpaint import fill_img_with_sd
from utils import load_img_to_array, save_array_to_img, dilate_mask, \
    show_mask, show_points, get_clicked_point


def setup_args(parser):
    parser.add_argument(
        "--input_img", type=str, required=True,
        help="Path to a single input img",
    )
    parser.add_argument(
        "--coords_type", type=str, required=True,
        default="key_in", choices=["click", "key_in"], 
        help="The way to select coords",
    )
    parser.add_argument(
        "--point_coords", type=float, nargs='+', required=True,
        help="The coordinate of the point prompt, [coord_W coord_H].",
    )
    parser.add_argument(
        "--point_labels", type=int, nargs='+', required=True,
        help="The labels of the point prompt, 1 or 0.",
    )
    parser.add_argument(
        "--text_prompt", type=str, required=True,
        help="Text prompt",
    )
    parser.add_argument(
        "--dilate_kernel_size", type=int, default=None,
        help="Dilate kernel size. Default: None",
    )
    parser.add_argument(
        "--output_dir", type=str, required=True,
        help="Output path to the directory with results.",
    )
    parser.add_argument(
        "--sam_model_type", type=str,
        default="vit_h", choices=['vit_h', 'vit_l', 'vit_b', 'vit_t'],
        help="The type of sam model to load. Default: 'vit_h"
    )
    parser.add_argument(
        "--sam_ckpt", type=str, required=True,
        help="The path to the SAM checkpoint to use for mask generation.",
    )
    parser.add_argument(
        "--seed", type=int,
        help="Specify seed for reproducibility.",
    )
    parser.add_argument(
        "--deterministic", action="store_true",
        help="Use deterministic algorithms for reproducibility.",
    )


if __name__ == "__main__":
    """Example usage:
    python fill_anything.py \
        --input_img FA_demo/FA1_dog.png \
        --coords_type key_in \
        --point_coords 750 500 \
        --point_labels 1 \
        --text_prompt "a teddy bear on a bench" \
        --dilate_kernel_size 15 \
        --output_dir ./results \
        --sam_model_type "vit_h" \
        --sam_ckpt sam_vit_h_4b8939.pth 
    """
    parser = argparse.ArgumentParser()
    setup_args(parser)
    args = parser.parse_args(sys.argv[1:])
    device = "cuda" if torch.cuda.is_available() else "cpu"

    if args.coords_type == "click":
        latest_coords = get_clicked_point(args.input_img)
    elif args.coords_type == "key_in":
        latest_coords = args.point_coords
    img = load_img_to_array(args.input_img)

    masks, _, _ = predict_masks_with_sam(
        img,
        [latest_coords],
        args.point_labels,
        model_type=args.sam_model_type,
        ckpt_p=args.sam_ckpt,
        device=device,
    )
    masks = masks.astype(np.uint8) * 255

    # dilate mask to avoid unmasked edge effect
    if args.dilate_kernel_size is not None:
        masks = [dilate_mask(mask, args.dilate_kernel_size) for mask in masks]

    # visualize the segmentation results
    img_stem = Path(args.input_img).stem
    out_dir = Path(args.output_dir) / img_stem
    out_dir.mkdir(parents=True, exist_ok=True)
    for idx, mask in enumerate(masks):
        # path to the results
        mask_p = out_dir / f"mask_{idx}.png"
        img_points_p = out_dir / f"with_points.png"
        img_mask_p = out_dir / f"with_{Path(mask_p).name}"

        # save the mask
        save_array_to_img(mask, mask_p)

        # save the pointed and masked image
        dpi = plt.rcParams['figure.dpi']
        height, width = img.shape[:2]
        plt.figure(figsize=(width/dpi/0.77, height/dpi/0.77))
        plt.imshow(img)
        plt.axis('off')
        show_points(plt.gca(), [latest_coords], args.point_labels,
                    size=(width*0.04)**2)
        plt.savefig(img_points_p, bbox_inches='tight', pad_inches=0)
        show_mask(plt.gca(), mask, random_color=False)
        plt.savefig(img_mask_p, bbox_inches='tight', pad_inches=0)
        plt.close()

    # fill the masked image
    for idx, mask in enumerate(masks):
        if args.seed is not None:
            torch.manual_seed(args.seed)
        mask_p = out_dir / f"mask_{idx}.png"
        img_filled_p = out_dir / f"filled_with_{Path(mask_p).name}"
        img_filled = fill_img_with_sd(
            img, mask, args.text_prompt, device=device)
        save_array_to_img(img_filled, img_filled_p)

上面代码以SAM 模型生成高质量的对象分割掩码,stable Diffusion 模型利用这些掩码和文本提示生成新内容,填补图像中的空洞。具体步骤如下:

  • 生成掩码:SAM 根据用户提供的点坐标和标签生成对象的分割掩码。
  • 膨胀掩码:对生成的掩码进行膨胀处理,以确保边缘过渡平滑。
  • 生成新内容:Stable Diffusion 模型根据膨胀后的掩码和用户提供的文本提示生成新内容,填补图像中的空洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉(3)】

基于Python的OpenCV基础入门——图形与文字的绘制 图形与文字的绘制:画线画矩形画圆画多边形加文字 图形与文字绘制的代码实现: 图形与文字的绘制: 画线 img cv2.line(img, pt1, pt2, color, thickness) 参数: img:…

Android 构建时:Manifest merger failed : Attribute application@name value

在AndroidStudio 构建时发现此问题&#xff1a; Manifest merger failed : Attribute applicationname value解决方案&#xff1a;在主Manifest中增加replace <applicationandroid:name".MyApp"android:allowBackup"false"tools:replace"android…

儿童卧室灯品牌该如何挑选?几款专业儿童卧室灯品牌分享

近视在儿童中愈发普遍&#xff0c;许多家长开始认识到&#xff0c;除了学业成绩之外&#xff0c;孩子的视力健康同样重要。毕竟&#xff0c;学业的落后可以逐渐弥补&#xff0c;而一旦孩子近视&#xff0c;眼镜便可能成为长期伴随。因此&#xff0c;专业的护眼台灯对于每个家庭…

工作站虚拟化:RTX A5000的图形工作站实现多用户独立运行Siemens NX 设计软件

一、背景 Siemens NX 是由西门子数字工业软件&#xff08;Siemens Digital Industries Software&#xff09;开发的一款先进的集成计算机辅助设计&#xff08;CAD&#xff09;、计算机辅助制造&#xff08;CAM&#xff09;和计算机辅助工程&#xff08;CAE&#xff09;软件。它…

Python代码实现代价函数

最小二乘法 最小二乘法是一种在统计学、数学、工程学和计算机科学等领域广泛使用的优化方法。 基本原理 最小二乘法的主要目的是找到一组模型参数&#xff0c;使得根据这些参数所预测的数据与实际观测数据之间的差异&#xff08;即残差&#xff09;的平方和最小。 数学表达…

【LeetCode刷题】三数之和、四数之和

【LeetCode刷题】Day 6 题目1&#xff1a;LCR 7.三数之和思路分析&#xff1a;思路1&#xff1a;排序暴力枚举set去重思路2&#xff1a;单调性双指针细节处理去重 题目2&#xff1a;18.四数之和思路分析&#xff1a;思路1&#xff1a;排序暴力枚举set去重思路2&#xff1a;单调…

浅析智能体开发(第二部分):智能体设计模式和软件架构

大语言模型&#xff08;LLM&#xff09;驱动的智能体&#xff08;AI Agent&#xff09;展现出许多传统软件所不具备的特征。不仅与传统软件的设计理念、方法、工具和技术栈有显著的差异&#xff0c;AI原生&#xff08;AI Native&#xff09;的智能体还融入了多种新概念和技术。…

SparkSQL入门

1、SparkSQL是什么&#xff1f; 结论&#xff1a;SparkSQL 是一个即支持 SQL 又支持命令式数据处理的工具 2、SparkSQL 的适用场景&#xff1f; 结论&#xff1a;SparkSQL 适用于处理结构化数据的场景&#xff0c;而Spark 的 RDD 主要用于处理 非结构化数据 和 半结构化数据 …

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇

1. 前言 线程池这块&#xff0c;作为高频面试题&#xff0c;并且实际使用场景巨多&#xff0c;所以出了这篇文章&#xff0c;一块来研究一下线程池的实现原理&#xff0c;运行机制&#xff0c;从底层深挖&#xff0c;不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…

Leecode热题100---55:跳跃游戏(贪心算法)

题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 贪心算…

数据采集与AI分析,亮数据+通义千问助力跨境电商前行

文章目录 前言工具介绍数据采集工具亮数据Web Scraper IDE亮点 AI数据分析工具 实战电商数据采集与AI分析电商平台选取数据采集完全托管数据集自定义数据集 AI分析 价格总结 前言 随着信息技术的飞速发展&#xff0c;数据采集与AI分析在跨境电商中扮演着越来越重要的角色。通过…

Langchain:数据连接封装、缓存封装和LCEL学习和探索

&#x1f335; 目录 &#x1f335; &#x1f60b; 数据连接封装 &#x1f354; 文档加载器&#xff1a;Document Loaders 文档处理器&#xff1a;TextSplitter 向量数据库与向量检索 总结 &#x1f349; 缓存封装&#xff1a;Memory &#x1f3d6;️ 对话上下文&#xf…

urllib_post请求_百度翻译

打开百度翻译&#xff0c;并打开控制台&#xff0c;输入spider&#xff0c;然后在网络中找到对应的接口&#xff0c;可以看出&#xff0c;该url是post请求 在此案例中找到的接口为sug&#xff0c;依据为&#xff1a; 可以看到&#xff0c;传递的数据为kw : XXX&#xff0c; 所…

Hadoop3:HDFS的Fsimage和Edits文件介绍

一、概念 Fsimage文件&#xff1a;HDFS文件系统元数据的一个永久性的检查点&#xff0c;其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。 Edits文件&#xff1a;存放HDFS文件系统的所有更新操作的路径&#xff0c;文件系统客户端执行的所有写操作首先 会被记录到Ed…

移动云ECS主机:未来云计算的驱动力

文章目录 前言一、移动云云主机ECS云主机ECS产品优势云主机ECS产品功能云主机ECS应用场景 二、移动云云主机ECS选购三、移动云云主机ECS配置四、移动云云主机ECS牛刀小试五、移动云云主机ECS安装部署消息中间件RocketMQ云主机ECS安装RocketMQ云主机ECS配置RocketMQ云主机ECS启动…

如何做好云安全防护

随着云计算技术的迅猛发展和普及&#xff0c;越来越多的企业和个人选择将数据和业务应用迁移到云平台&#xff0c;以享受其带来的高效、便捷和可扩展性。然而&#xff0c;云环境的复杂性和开放性也带来了前所未有的安全挑战。如何确保云环境中的数据安全&#xff0c;成为了每一…

【Linux】lsblk 命令使用

lsblk 命令 lsblk 是一个在 Linux 系统中用来列出所有可用的块设备&#xff08;例如硬盘驱动器、固态硬盘、USB 驱动器等&#xff09;的命令行工具。它提供了关于这些设备的详细信息&#xff0c;包括它们的名称、大小、类型、挂载点等。 语法 lsblk [选项] 选项及作用 执行…

LabVIEW高温往复摩擦测试系统中PID控制

在LabVIEW开发高温往复摩擦测试系统中实现PID控制&#xff0c;需要注意以下几个方面&#xff1a; 1. 系统建模与参数确定 物理模型建立: 首先&#xff0c;需要了解被控对象的物理特性&#xff0c;包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…

PVE 虚拟机环境下删除 local-lvm分区

1、删除逻辑卷 lvremote pve/data 2、扩展逻辑卷 lvextend -l 100%FREE -r pve/root 3、 修改存储目录内容 点击 Datacenter - Storage &#xff08;1&#xff09;删除local-lvm分区 &#xff08;2&#xff09;编辑local分区&#xff0c;在内容一项中勾选所有可选项。