- 计算机视觉
- 媒体生成
- 深度学习
- 基础模型
【免费下载链接】stablediffusion
High-Resolution Image Synthesis with Latent Diffusion Models
Stable Diffusion v2 是本仓库(Stable Diffusion Version 2)的核心主题:一系列从零训练、持续更新的潜空间扩散模型(Latent Diffusion Models),涵盖 768×768 文本生成图像、深度条件生成、x4 超分辨率、图像修复与 Stable unCLIP 图像变体等能力。本文以仓库根目录 README.md 为主体骨架,结合 scripts/txt2img.py、scripts/img2img.py 等推理脚本与configs/stable-diffusion/下的完整配置,逐项讲解环境搭建、命令行采样、核心参数含义、底层架构与配置原理,帮助你直接复现并深入理解这套模型体系的每一个推理入口。
一、模型家族与版本演进
README 以 News 时间线记录了 v2 系列模型的关键里程碑,理解这些版本差异是正确选择权重与配置文件的前提。
1.1 v2.0:从零训练的起点(2022-11-24)
- Stable Diffusion 2.0-v:768×768 分辨率,U-Net 参数量与 1.5 相同,但文本编码器换成了 OpenCLIP-ViT/H,并且是从零训练。它是所谓的v-prediction模型(参见 arXiv:2202.00512),即模型预测的不是噪声本身,而是速度分量
v。 - Stable Diffusion 2.0-base:512×512 分辨率,标准的噪声预测(noise-prediction)模型,2.0-v 在其基础上微调而来。
- 同时发布了三类下游模型:x4 潜空间文本引导超分辨率模型、深度引导扩散模型(基于 MiDaS 单目深度估计,用于保持结构的 img2img 与形状条件合成)、文本引导图像修复模型(由 2.0-base 微调)。
1.2 v2.1:更宽松的过滤策略(2022-12-07)
- Stable Diffusion 2.1-v(768×768)与Stable Diffusion 2.1-base(512×512),参数量与架构与 2.0 完全一致,只是在 LAION-5B 数据集更宽松的 NSFW 过滤子集上微调。
- 一个重要的推理细节:当未安装
xformers时,模型的注意力操作默认以全精度(fp32)计算。若希望启用 fp16(在 v2.1 模型上,原生注意力模块可能引发数值不稳定),需以环境变量方式运行脚本:
ATTN_PRECISION=fp16 python <thescript.py>1.3 Stable unCLIP 2.1(2023-03-24)
基于 SD2.1-768 微调的新模型,支持图像变体(image variations)与混合操作(原理见Hierarchical Text-Conditional Image Generation with CLIP Latents,本文第九节也会展开。
1.4 v2 的架构定位
README 明确给出 v2 的定义性配置:下采样因子 8 的自编码器(AutoencoderKL)+ 865M 参数的 U-Net + OpenCLIP ViT-H/14 文本编码器,SD 2-v 模型输出 768×768 像素图像。文本编码器取penultimate(倒数第二层)嵌入作为条件,这一点在 configs/stable-diffusion/v2-inference-v.yaml 的cond_stage_config中写为layer: "penultimate",对应 ldm/modules/encoders/modules.py 中FrozenOpenCLIPEmbedder的实现。
仓库在 8 组无分类器引导尺度(1.5、2.0、3.0、4.0、5.0、6.0、7.0、8.0)与 50 步 DDIM 采样下评估了各 checkpoint 的相对提升,结果见下图:
二、环境准备与依赖安装
2.1 基础依赖
README 给出的安装路径是直接复用已有的 latent diffusion 环境,核心命令如下:
conda install pytorch==1.12.1 torchvision==0.13.1 -c pytorch pip install transformers==4.19.2 diffusers invisible-watermark pip install -e .对照仓库根目录的 environment.yaml 可以看到完整的推荐环境:python=3.8.5、cudatoolkit=11.3、pytorch=1.12.1、torchvision=0.13.1、transformers==4.19.2、open_clip_torch==2.0.2、invisible-watermark>=0.1.5、streamlit==1.12.1、omegaconf==2.1.1、pytorch-lightning==1.4.2等。其中invisible-watermark用于给输出打不可见水印,streamlit与streamlit-drawable-canvas用于 Web Demo,open_clip_torch提供 v2 所需的 OpenCLIP 文本编码器。
2.2 xformers 高效注意力
README 强烈推荐安装 xformers 以获得 GPU 上的效率与速度提升(官方在 A100 + CUDA 11.4 上测试)。安装需要较新的nvcc与gcc/g++:
export CUDA_HOME=/usr/local/cuda-11.4 conda install -c nvidia/label/cuda-11.4.0 cuda-nvcc conda install -c conda-forge gcc conda install -c conda-forge gxx_linux-64==9.5.0然后编译安装(编译最长约 30 分钟):
cd .. git clone https://github.com/facebookresearch/xformers.git cd xformers git submodule update --init --recursive pip install -r requirements.txt pip install -e . cd ../stablediffusion安装成功后,代码会自动将 U-Net 与自编码器中的自注意力、交叉注意力层切换为 memory efficient attention 实现。这一机制可以从 scripts/txt2img.py 的采样流程中得到印证:整个推理在torch.no_grad()下执行,注意力精度行为受环境变量与依赖共同决定。
三、Text-to-Image 文本生成图像
3.1 权重与配置准备
首先下载SD2.1-v与SD2.1-base权重。仓库提供了两套推理配置:
- configs/stable-diffusion/v2-inference-v.yaml:SD2-v(768px,v-prediction);
- configs/stable-diffusion/v2-inference.yaml:SD2-base(512px,标准噪声预测)。
3.2 采样命令
从SD2.1-v模型采样:
python scripts/txt2img.py --prompt "a professional photograph of an astronaut riding a horse" --ckpt <path/to/768model.ckpt/> --config configs/stable-diffusion/v2-inference-v.yaml --H 768 --W 768从 base 模型采样:
python scripts/txt2img.py --prompt "a professional photograph of an astronaut riding a horse" --ckpt <path/to/model.ckpt/> --config <path/to/config.yaml/>默认使用DDIM 采样器(arXiv:2010.02502),以 50 步渲染 768×768 图像。经验上,v 系列模型可以配合更高的引导尺度使用。下面两张是 README 展示的 txt2img 示例输出:
3.3 命令行参数全解
scripts/txt2img.py 中的parse_args()提供了完整的采样控制项,整理如下:
| 参数 | 默认值 | 含义 |
|---|---|---|
--prompt | "a professional photograph of an astronaut riding a triceratops" | 渲染用的提示词 |
--outdir | outputs/txt2img-samples | 结果输出目录 |
--steps | 50 | DDIM 采样步数 |
--plms | False(flag) | 改用 PLMS 采样(arXiv:2202.09778) |
--dpm | False(flag) | 改用 DPM-Solver(2) 采样器(arXiv:2206.00927) |
--fixed_code | False(flag) | 所有样本使用相同的起始噪声码,便于对照 |
--ddim_eta | 0.0 | DDIM 的 eta 值,0.0对应确定性采样 |
--n_iter | 3 | 重复采样轮数 |
--H/--W | 512/512 | 输出图像的高/宽(像素空间) |
--C | 4 | 潜空间通道数 |
--f | 8 | 下采样因子(通常为 8 或 16) |
--n_samples | 3 | 每个提示词生成的样本数(即 batch size) |
--n_rows | 0 | 网格图行数(默认为n_samples) |
--scale | 9.0 | 无分类器引导尺度:eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty)) |
--from-file | 无 | 从文本文件按行读取提示词 |
--config | configs/stable-diffusion/v2-inference.yaml | 构建模型的配置文件 |
--ckpt | 无 | 模型 checkpoint 路径 |
--seed | 42 | 随机种子(用于可复现采样) |
--precision | autocast | full或autocast |
--repeat | 1 | 文件中每条提示词重复的次数 |
--device | cpu | cpu或cuda |
--torchscript/--ipex/--bf16 | False(flag) | Intel CPU 优化相关,见第四节 |
采样器选择逻辑在main()中:--plms优先于--dpm,否则回退到DDIMSampler。三条采样路径分别对应 ldm/models/diffusion/ddim.py、ldm/models/diffusion/plms.py 与 ldm/models/diffusion/dpm_solver/sampler.py。输出时,脚本会把每个 batch 的样本保存为独立 PNG(samples/子目录),同时用make_grid拼接成网格图grid-XXXX.png。
3.4 推理配置逐项解析
以 configs/stable-diffusion/v2-inference-v.yaml 为例,逐项说明关键字段(注释已内嵌于配置中):
parameterization: "v":v-prediction 参数化,这是 2.0-v / 2.1-v 与 base 模型(该行缺失,即噪声预测)的核心区别;linear_start: 0.00085/linear_end: 0.0120:扩散噪声调度表的边界值;timesteps: 1000为总扩散步数;image_size: 64:潜空间特征图尺寸(512 ÷ 8 = 64,768 分辨率时相应为 96);channels: 4:潜空间通道数(即上面的--C);conditioning_key: crossattn:使用交叉注意力注入文本条件;scale_factor: 0.18215:潜空间缩放因子,在get_first_stage_encoding阶段对编码结果做缩放;use_ema: False:这是推理专用配置的关键。README 明确说明:所有版本的推理配置都设计为配合EMA-only checkpoint使用,因此必须保持use_ema=False,否则代码会尝试从非 EMA 权重切换到 EMA 权重而报错;unet_config:UNetModel,model_channels: 320、channel_mult: [1,2,4,4]、num_res_blocks: 2、attention_resolutions: [4,2,1]、num_head_channels: 64,并开启use_spatial_transformer: True、use_linear_in_transformer: True、transformer_depth: 1,context_dim: 1024与 OpenCLIP 倒数第二层嵌入维度对齐;first_stage_config:AutoencoderKL,embed_dim: 4、z_channels: 4、resolution: 256、ch: 128、ch_mult: [1,2,4,4]——即下采样因子 8 的自编码器;cond_stage_config:FrozenOpenCLIPEmbedder,freeze: True、layer: "penultimate"。
值得注意的是,scripts/txt2img.py 在 TorchScript 路径中构造的上下文张量形状为(2, 77, 1024),印证了文本侧按 77 token 截断、嵌入维度 1024 的约定。
3.5 不可见水印
txt2img.py 在保存每张图片前调用put_watermark(),将字节串"SDV2"通过dwtDct算法编码进图像(imwatermark.WatermarkEncoder)。配套的验证脚本是 scripts/tests/test_watermark.py,它用WatermarkDecoder('bytes', 136)解码并打印水印内容,可用来确认输出确实为机器生成:
python scripts/tests/test_watermark.py <path-to-image>四、Intel CPU 上的推理优化(IPEX)
如果你计划在 Intel CPU 上运行 Text-to-Image,README 提供了基于 TorchScript + Intel® Extension for PyTorch*(IPEX)的优化路径:将算子内存布局优化为 Channel Last、利用机器上最先进的指令集、优化算子实现等。
4.1 依赖安装
apt-get install numactl libjemalloc-dev pip install intel-openmp pip install intel_extension_for_pytorch -f https://software.intel.com/ipex-whl-stable官方在Ubuntu 20.04上验证过该路径。对应的推理配置位于 configs/stable-diffusion/intel/,与 GPU 配置的关键差异是use_checkpoint: False、use_fp16: False(bf16 版额外增加use_bf16: True)。
4.2 fp32 采样命令
从SD2.1-v模型采样(--ninstance指定并发实例数):
MALLOC_CONF=oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000 python -m intel_extension_for_pytorch.cpu.launch --ninstance <number of an instance> --enable_jemalloc scripts/txt2img.py --prompt "a corgi is playing guitar, oil on canvas" --ckpt <path/to/768model.ckpt/> --config configs/stable-diffusion/intel/v2-inference-v-fp32.yaml --H 768 --W 768 --precision full --device cpu --torchscript --ipexbase 模型同理,使用 configs/stable-diffusion/intel/v2-inference-fp32.yaml:
MALLOC_CONF=oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000 python -m intel_extension_for_pytorch.cpu.launch --ninstance <number of an instance> --enable_jemalloc scripts/txt2img.py --prompt "a corgi is playing guitar, oil on canvas" --ckpt <path/to/model.ckpt/> --config configs/stable-diffusion/intel/v2-inference-fp32.yaml --n_samples 1 --n_iter 4 --precision full --device cpu --torchscript --ipex4.3 bf16 采样命令
若 CPU 支持bfloat16,可用 bf16 获得额外性能提升:
# SD2.1-v MALLOC_CONF=oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000 python -m intel_extension_for_pytorch.cpu.launch --ninstance <number of an instance> --enable_jemalloc scripts/txt2img.py --prompt "a corgi is playing guitar, oil on canvas" --ckpt <path/to/768model.ckpt/> --config configs/stable-diffusion/intel/v2-inference-v-bf16.yaml --H 768 --W 768 --precision full --device cpu --torchscript --ipex --bf16 # SD2.1-base MALLOC_CONF=oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000 python -m intel_extension_for_pytorch.cpu.launch --ninstance <number of an instance> --enable_jemalloc scripts/txt2img.py --prompt "a corgi is playing guitar, oil on canvas" --ckpt <path/to/model.ckpt/> --config configs/stable-diffusion/intel/v2-inference-bf16.yaml --precision full --device cpu --torchscript --ipex --bf16从源码角度看,scripts/txt2img.py 中--bf16仅在torchscript+ipex组合下受支持;若 bf16 配置搭配 fp16 权重或反之,脚本会抛出明确的 ValueError,提示使用configs/stable-diffusion/intel/下对应的 bf16/fp32 配置。
五、深度条件生成(Depth-Conditional Stable Diffusion)
经典的 img2img 会引入相对初始图像较明显的语义变化。如果希望保持形状结构,README 提供了深度条件模型:由 MiDaS 推断单目深度,再以(相对)深度输出作为扩散模型的条件。
5.1 准备与运行
下载 depth-conditional stable diffusion 模型权重,以及dpt_hybridMiDaS 模型权重,将后者放入midas_models文件夹,然后运行 Gradio Demo:
python scripts/gradio/depth2img.py configs/stable-diffusion/v2-midas-inference.yaml <path-to-ckpt>或 Streamlit Demo:
streamlit run scripts/streamlit/depth2img.py configs/stable-diffusion/v2-midas-inference.yaml <path-to-ckpt>该方法可直接用于 base 模型自己生成的样本。以 assets/stable-samples/depth2img/old_man.png 为例:depth2img.py先让 MiDaS 推断单目深度,再让扩散模型以该(相对)深度为条件重绘。该模型尤其适合写实风格;当强度达到最大值 1.0 时,模型会丢弃所有像素级信息,只依赖文本提示与推断出的单目深度。仓库给出了完整的端到端演示动图:
5.2 配置要点
configs/stable-diffusion/v2-midas-inference.yaml 中,模型目标为LatentDepth2ImageDiffusion,conditioning_key: hybrid;新增depth_stage_config指定MiDaSInference且model_type: "dpt_hybrid";U-Net 的in_channels变为5(4 通道潜变量 + 1 通道深度图),这正是"深度条件"在架构上的直接体现。
六、经典 img2img
img2img本质上是 SDEdit 的一个应用(作者 Chenlin Meng 来自斯坦福 AI Lab)。命令:
python scripts/img2img.py --prompt "A fantasy landscape, trending on artstation" --init-img <path-to-img.jpg> --strength 0.8 --ckpt <path/to/model.ckpt>并相应调整 checkpoint 与 config 路径。
从 scripts/img2img.py 的源码可看清其工作原理:
load_img()先把输入图缩放到 64 的整数倍(w - w % 64),归一化到[-1, 1];model.encode_first_stage()将图像编码到潜空间,再经get_first_stage_encoding()缩放得到init_latent;t_enc = int(strength * ddim_steps)——--strength决定加噪步数占比,取值必须在[0.0, 1.0],1.0对应初始图像信息的完全破坏;sampler.stochastic_encode()对潜变量加噪到t_enc,再由sampler.decode()在文本条件下逐步去噪;- 输出同样经过
"SDV2"不可见水印。
img2img.py的其余参数与txt2img.py基本一致(--scale默认 9.0、--ddim_steps默认 50、--ddim_eta默认 0.0、--seed默认 42),但它只使用DDIMSampler。你可以在 assets/stable-samples/img2img/ 看到官方提供的 img2img 与超分辨率示例输入/输出。
七、x4 文本引导超分辨率
下载 x4 upscaler 权重后,运行 Gradio Demo:
python scripts/gradio/superresolution.py configs/stable-diffusion/x4-upscaling.yaml <path-to-checkpoint>或 Streamlit Demo:
streamlit run scripts/streamlit/superresolution.py -- configs/stable-diffusion/x4-upscaling.yaml <path-to-checkpoint>该模型既可用于真实输入,也可用于模型合成图。对合成图,README 建议设置更高的noise_level,例如noise_level=100。
配置 configs/stable-diffusion/x4-upscaling.yaml 的技术要点:
- 目标类
LatentUpscaleDiffusion,low_scale_key: "lr",parameterization: "v",image_size: 128,scale_factor: 0.08333; low_scale_config使用ImageConcatWithNoiseAugmentation,其max_noise_level: 350定义了注入噪声的强度上限——这就是 GUI 中noise_level滑杆的物理含义;- U-Net
in_channels: 7(4 通道潜变量 + 低分辨率图通道 + 噪声级条件),num_classes: 1000用于噪声级时间步条件,model_channels: 256、channel_mult: [1,2,2,4]、disable_self_attentions: [True,True,True,False]。
示例输出见 assets/stable-samples/upscaling/(如merged-dog.png、sampled-bear-x4.png、snow-leopard-x4.png)。
八、文本引导图像修复(Inpainting)
下载 SD 2.0-inpainting checkpoint后运行:
python scripts/gradio/inpainting.py configs/stable-diffusion/v2-inpainting-inference.yaml <path-to-checkpoint>或:
streamlit run scripts/streamlit/inpainting.py -- configs/stable-diffusion/v2-inpainting-inference.yaml <path-to-checkpoint>该 Demo 添加了不可见水印(源自 RunwayML 仓库 的做法),但两者与对应的 checkpoints/configs 可以互换使用。示例效果:
从 scripts/gradio/inpainting.py 与 configs/stable-diffusion/v2-inpainting-inference.yaml 可以确认其实现:
- 目标类为
LatentInpaintDiffusion,conditioning_key: hybrid; - U-Net
in_channels: 9,对应"4 通道原图潜变量 + 4 通道遮罩图潜变量 + 1 通道二值遮罩"的拼接输入; - 前端把遮罩二值化(
mask[mask < 0.5] = 0,mask[mask >= 0.5] = 1),并构造masked_image = image * (mask < 0.5)传入模型; - 配置中附带的
data段展示了训练时的数据管线(LAION tar 分片 +AddMask后处理,mode: "512train-large"、p_drop: 0.25),可作为理解该模型训练机制的参考,推理时无需理会。
九、Stable unCLIP:图像变体与 Stable Karlo
doc/UNCLIP.MD 是 README 中 unCLIP 条目的完整展开。unCLIP 是 OpenAI DALL·E 2 背后的方法:训练模型反转 CLIP 图像嵌入。Stable Diffusion 2.1 微调后可以额外接受一个 CLIP ViT-L/14 图像嵌入,从而既能做图像变体,也能与文本到图像的嵌入先验组合成完整的 768×768 文本到图像模型。
9.1 图像变体
两个模型(基于 OpenAI CLIP-L 与 OpenCLIP-H 图像嵌入训练)从 https://huggingface.co/stabilityai/stable-diffusion-2-1-unclip 的提示)。变体效果示例:
9.2 Diffusers 集成
unCLIP 变体已集成进 🧨 diffusers 库,可用StableUnCLIPImg2ImgPipeline直接使用:
#pip install git+https://github.com/huggingface/diffusers.git transformers accelerate import requests import torch from PIL import Image from io import BytesIO from diffusers import StableUnCLIPImg2ImgPipeline #Start the StableUnCLIP Image variations pipeline pipe = StableUnCLIPImg2ImgPipeline.from_pretrained( "stabilityai/stable-diffusion-2-1-unclip", torch_dtype=torch.float16, variation="fp16" ) pipe = pipe.to("cuda") #Get image from URL url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/tarsila_do_amaral.png" response = requests.get(url) init_image = Image.open(BytesIO(response.content)).convert("RGB") #Pipe to make the variation images = pipe(init_image).images images[0].save("tarsila_variation.png")9.3 Streamlit UI 与 noise_level
也可以直接启动本仓库自带的 Streamlit 脚本:
streamlit run scripts/streamlit/stableunclip.py它支持同时用 CLIP-L 与 OpenCLIP-H 两个模型做图像变体。两个模型都接受noise_level参数,指定添加到 CLIP 嵌入上的高斯噪声量,用于增大输出方差:
9.4 Stable Karlo:与 KARLO 组合
KakaoBrain 开源的 Karlo 是 unCLIP 的大规模复现。Stable Karlo即 Karlo CLIP 图像嵌入先验与 Stable Diffusion v2.1-768 的组合。运行前先下载 KARLO checkpoint:
mkdir -p checkpoints/karlo_models cd checkpoints/karlo_models wget https://arena.kakaocdn.net/brainrepo/models/karlo-public/v1.0.0.alpha/096db1af569b284eb76b3881534822d9/ViT-L-14.pt wget https://arena.kakaocdn.net/brainrepo/models/karlo-public/v1.0.0.alpha/0b62380a75e56f073e2844ab5199153d/ViT-L-14_stats.th wget https://arena.kakaocdn.net/brainrepo/models/karlo-public/v1.0.0.alpha/85626483eaca9f581e2a78d31ff905ca/prior-ckpt-step%3D01000000-of-01000000.ckpt cd ../../再下载微调后的 SD2.1 unCLIP-L checkpoint 并放入checkpoints文件夹,随后运行:
streamlit run scripts/streamlit/stableunclip.py在 GUI 中勾选use_karlo选项。脚本还支持采样完整的 Karlo 模型(需额外下载 64×64 decoder 与 64→256 upscaler):
cd checkpoints/karlo_models wget https://arena.kakaocdn.net/brainrepo/models/karlo-public/v1.0.0.alpha/efdf6206d8ed593961593dc029a8affa/decoder-ckpt-step%3D01000000-of-01000000.ckpt wget https://arena.kakaocdn.net/brainrepo/models/karlo-public/v1.0.0.alpha/4226b831ae0279020d134281f3c31590/improved-sr-ckpt-step%3D1.2M.ckpt cd ../../仓库中的 assets/stable-samples/stable-unclip/panda.jpg 与 ldm/modules/karlo/ 目录(含 CLIP 编码器、prior、decoder、超分模块)即为该组合路径的样例与实现。
十、使用注意事项与许可
- 通用免责声明:Stable Diffusion 属于通用的文本到图像扩散模型,会镜像训练数据中的偏见与误解。虽然训练中已努力减少露骨色情内容,但 README 明确建议:不要在没有额外安全机制与考量的情况下,将提供的权重用于服务或产品。权重是研究产物,应如此对待。训练流程、数据与预期用途详见对应的 model card。
- 权重许可:权重通过 StabilityAI。
- 代码许可:本仓库代码以 MIT License 发布。
- 引用方式:使用本模型请引用论文High-Resolution Image Synthesis with Latent Diffusion Models(Rombach 等,CVPR '22 Oral),仓库 README.md 底部提供了完整的 BibTeX 条目。
- 推理配置约束:所有推理配置均面向 EMA-only checkpoint 设计,务必保持
use_ema=False;未安装 xformers 时注意力默认全精度,v2.1 上启用 fp16 请使用ATTN_PRECISION=fp16前缀(见第一节)。
- 计算机视觉
- 媒体生成
- 深度学习
- 基础模型
【免费下载链接】stablediffusion
High-Resolution Image Synthesis with Latent Diffusion Models
相关推荐
Stable Diffusion v2高级特性:深度条件与图像修复技术
Stable Diffusion v2高级特性:深度条件与图像修复技术 本文详细解析了Stable Diffusion v2在深度条件图像生成和图像修复方面的突
计算机视觉媒体生成深度学习基础模型SQL Tabs连接配置全攻略:从本地数据库到云服务的完整连接指南
SQL Tabs连接配置全攻略:从本地数据库到云服务的完整连接指南 SQL Tabs是一款功能强大的开源数据库管理工具,支持多种数据库类型的快速连接和查询。无论
lsw与pfw:wmutils/core窗口列表工具的5个实用技巧 🪟
lsw与pfw:wmutils/core窗口列表工具的5个实用技巧 🪟 在X窗口系统中, lsw与pfw 是wmutils/core项目中两个强大的窗口列表工
桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考