ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PaddleHub 文图生成实战:disco_diffusion_clip_rn50 模型安装、API 调用与 Serving 部署全解析

PaddleHub 文图生成实战:disco_diffusion_clip_rn50 模型安装、API 调用与 Serving 部署全解析 人工智能大模型微调模型推理服务【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址https://gitcode.com/gh_mirrors/pa/PaddleFormers点击查看免费下载本文以 PaddleFormers 仓库中的disco_diffusion_clip_rn50文图生成模块为主体系统讲解基于 PaddlePaddle 的 Disco DiffusionDD CLIP ResNet50文图生成模型的原理、安装步骤、命令行与 Python API 调用方式、全部生成参数的含义与调优建议以及基于 PaddleHub Serving 的在线服务部署方法。读完本文你将掌握如何用一句话 prompt 生成高质量艺术图像并能独立完成该模型的本地推理与在线服务化。一、模型基本信息与核心原理1.1 模型概览disco_diffusion_clip_rn50是 PaddleHub 提供的一个文图生成Text-to-Image模块其基本信息如下项目内容模型名称disco_diffusion_clip_rn50类别图像-文图生成网络DD CLIP ResNet50数据集-是否支持 Fine-tuning否模型大小2.8GB最新更新日期2022-08-02数据指标-该模块由两部分核心组件构成扩散模型Diffusion Model一种生成模型能够从纯噪声输入中逐步重建出原始图像负责作画多模态预训练模型 CLIP将文本与图像表示到同一个特征空间语义相近的文本与图像在该空间中的距离更近负责把关。生成过程中扩散模型从初始噪声或用户指定的初始图像出发生成候选图像CLIP 持续计算候选图像与输入文本之间的语义距离并给出引导梯度扩散模型在 CLIP 引导下迭代优化最终生成与文本描述语义一致的图像。本模块使用的 CLIP 模型结构为 ResNet50RN50。该方案对应的基础研究工作分别为扩散模型方向Diffusion Models Beat GANs on Image Synthesis与多模态表征方向Learning Transferable Visual Models From Natural Language Supervision在模块目录的 README.md 中有对应论文说明。1.2 仓库中的源码组织从仓库源码结构看本模块的工程实现分为四部分见 模块目录module.pyPaddleHub 模块入口定义DiscoDiffusionClip类封装generate_imageAPI 以及命令行runnable与 Servingserving两种执行方式reverse_diffusion/扩散模型核心实现包括runner.py生成主循环、config.py参数加载与校验、helper.py模型加载与 prompt 解析、resources/default.yml默认参数以及model/下的 UNet、高斯扩散、cutouts、噪声等实现clip/OpenAI CLIP 的 Paddle 实现源自 clip.paddle 项目用于引导扩散过程resize_right/高质量图像缩放工具库。二、环境依赖与安装2.1 环境依赖使用该模块前需要满足以下环境条件paddlepaddle 2.0.0paddlehub 2.2.0PaddleHub 的安装方式可参考 PaddleHub 安装文档此外模块自身还依赖以下 Python 包见 requirements.txtnumpy paddle_lpips0.1.2 ftfy docarray0.13.29 pyyaml regex tqdm ipywidgets其中paddle_lpips用于计算初始图像与生成图像之间的感知相似度损失docarray用于承载和操作生成结果。2.2 安装模块在满足上述依赖后通过 PaddleHub 一条命令即可安装$ hub install disco_diffusion_clip_rn50如需安装指定版本可执行$ hub install disco_diffusion_clip_rn50 1.0.0如安装过程中遇到问题可以参考仓库提供的零基础环境搭建文档零基础 Windows 安装、零基础 Linux 安装、零基础 MacOS 安装。三、模型 API 预测3.1 命令行预测安装完成后可直接通过hub run命令进行文图生成。以下命令输入一句描述性文本将图像输出到指定目录$ hub run disco_diffusion_clip_rn50 --text_prompts A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation. --output_dir disco_diffusion_clip_rn50_outhub run底层会调用module.py中run_cmd方法见 module.py该方法通过 argparse 解析所有命令行参数并逐项传入generate_image因此命令行模式下可以覆盖该 API 的全部参数例如指定随机种子、调整图像尺寸等$ hub run disco_diffusion_clip_rn50 \ --text_prompts a beautiful painting of Chinese architecture, by krenz, sunny, super wide angle, artstation. \ --seed 42 \ --width_height [512, 512] \ --steps 250 \ --clip_guidance_scale 5000 \ --output_dir my_out3.2 预测代码示例在 Python 中通过 PaddleHub 加载模块并调用generate_image即可生成图像import paddlehub as hub module hub.Module(namedisco_diffusion_clip_rn50) text_prompts [A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation.] # 生成图像默认会在 disco_diffusion_clip_rn50_out 目录保存图像 # 返回的 da 是一个 DocumentArray 对象保存了所有结果包括最终结果和迭代过程的中间结果 # 可以通过操作 DocumentArray 对象对生成的图像做后处理保存或者分析 da module.generate_image(text_promptstext_prompts, output_dir./disco_diffusion_clip_rn50_out/) # 手动将最终生成的图像保存到指定路径 da[0].save_uri_to_file(disco_diffusion_clip_rn50_out-result.png) # 展示所有的中间结果 da[0].chunks.plot_image_sprites(skip_emptyTrue, show_indexTrue, keep_aspect_ratioTrue) # 将整个生成过程保存为一个动态图 gif da[0].chunks.save_gif(disco_diffusion_clip_rn50_out-result.gif)从源码看生成过程中的每个中间结果都会被记录为Document的chunks见 runner.py因此你可以通过da[0].chunks访问完整迭代过程既能把最终结果保存为 PNG也能把全部中间帧导出为 GIF 动画直观观察噪声 → 艺术图像的演化轨迹。3.3 生成流程的源码级解析了解底层执行链路有助于更好地使用该模型。generate_image最终调用reverse_diffusion包中的create函数见 reverse_diffusion/init.py整体流程为参数装配create将用户传入的 kwargs 与resources/default.yml中的默认参数合并类型校验后封装为配置对象见 config.py模型加载加载扩散 UNet 模型512x512_diffusion_uncond_finetune_008100与辅助模型 Secondary Diffusion Model并加载启用的 CLIP 模型所有参数stop_gradient True冻结见 helper.py初始状态构造默认以随机高斯噪声为起点若指定init_image则将图像归一化到 [-1, 1]若启用perlin_init则生成 Perlin 噪声作为起点引导采样在runner.do_run中每一步迭代都通过cond_fn完成——将当前图像切分为若干 cutsoverview cuts 与 inner cuts送入 CLIP 编码得到图像嵌入与文本 prompt 的目标嵌入计算球面距离损失spherical_dist_loss再叠加 TV 损失、range 损失、饱和度损失以及可选LPIPS 初始图像一致性损失最终得到引导梯度并反传给扩散采样器runner.py采样与输出按diffusion_sampling_mode选择 DDIM 或 PLMS 采样器逐步去噪按display_rate周期性保存中间帧到输出目录最终返回包含全部结果的DocumentArray。3.4 generate_image API 详解generate_image的完整函数签名如下见 module.pydef generate_image( text_prompts, style: Optional[str] None, artist: Optional[str] None, init_image: Optional[str] None, width_height: Optional[List[int]] [1280, 768], skip_steps: Optional[int] 0, steps: Optional[int] 250, cut_ic_pow: Optional[int] 1, init_scale: Optional[int] 1000, clip_guidance_scale: Optional[int] 5000, tv_scale: Optional[int] 0, range_scale: Optional[int] 0, sat_scale: Optional[int] 0, cutn_batches: Optional[int] 4, diffusion_sampling_mode: Optional[str] ddim, perlin_init: Optional[bool] False, perlin_mode: Optional[str] mixed, seed: Optional[int] None, eta: Optional[float] 0.8, clamp_grad: Optional[bool] True, clamp_max: Optional[float] 0.05, randomize_class: Optional[bool] True, clip_denoised: Optional[bool] False, fuzzy_prompt: Optional[bool] False, rand_mag: Optional[float] 0.05, cut_overview: Optional[str] [12]*400[4]*600, cut_innercut: Optional[str] [4]*400[12]*600, cut_icgray_p: Optional[str] [0.2]*400[0]*600, display_rate: Optional[int] 10, n_batches: Optional[int] 1, batch_size: Optional[int] 1, batch_name: Optional[str] , use_gpu: Optional[bool] True, output_dir: Optional[str] disco_diffusion_clip_rn50_out):3.4.1 输入提示词与风格参数text_prompts(str)输入的语句描述想要生成的图像内容。比较有效的构造方式是一段描述性的文字内容 指定艺术家的名字例如a beautiful painting of Chinese architecture, by krenz, sunny, super wide angle, artstation.。从 helper.py 的parse_prompt实现可以看到prompt 支持以冒号分隔的权重写法如a cat:0.8权重会参与引导损失加权归一化权重之和需非零否则抛出RuntimeErrorstyle(Optional[str])指定绘画风格如watercolor、Chinese painting等。不指定时风格完全由 prompt 决定。从 module.py 可以看到指定 style 后会被自动拼接到 prompt 末尾,{style}artist(Optional[str])指定特定艺术家如Greg Rutkowski、krenz生成该艺术家的绘画风格。指定后同样会自动拼接并追加,trending on artstation后缀init_image(Optional[str])初始图像路径。提供后将用该图像替换随机噪声作为扩散起点图像会被缩放并对齐到 64 的倍数后归一化到 [-1, 1]。使用 init_image 时通常需要把skip_steps提高到总步数的 50% 左右才能保留原图的主体特征低skip_steps得到受原图启发的结果保留颜色与大致构图高skip_steps则更接近对原图的纹理微调。3.4.2 画布尺寸与随机性参数width_height(Optional[List[int]])输出图像的宽高默认[1280, 768]。宽高均需为 64 的倍数runner 中通过(size // 64) * 64自动向下取整对齐图像越大计算时间越长seed(Optional[int])随机种子。输入默认是随机高斯噪声不同种子得到不同初始输入与不同结果。指定相同种子可复现相近的输出严格来说结果相似但不完全相同。若不指定config 会随机生成一个种子并在参数报告中打印实际使用的种子值n_batches(int)生成的图像数量默认 1每个 batch 对应返回结果中的一个 Documentbatch_size(int)每个 batch 内部并行生成的图像数默认为 1。3.4.3 扩散过程核心参数质量关键steps(int)去噪总步数默认 250。步数越多细节越精细但渲染时间线性增长250–500 步之后收益递减复杂画面可适当提升到 1000 甚至更多skip_steps(int)跳过的初始去噪步数默认 0。前几步噪声极高、画面变化剧烈跳过约 10%–15% 的步数通常不影响最终效果还能显著缩短渲染时间跳过头则剩余噪声不足以生成新内容diffusion_sampling_mode(str)采样算法可选ddim默认更成熟稳定或plms更少的步数即可取得不错效果但测试较少、可能有副作用eta(float)扩散模型变量控制每个时间步混入的随机缩放噪声量0 为无噪声1.0 为更多噪声默认 0.8。eta 设为 0 时 50–75 步即可得到不错结果设为 1.0 则建议配合 250 步以上使用clip_denoised(bool)是否对去噪结果做 CLIP 裁剪默认 Falserandomize_class(bool)是否随机化类别默认 True。3.4.4 CLIP 引导强度参数clip_guidance_scale(int)CLIP 引导强度CGS默认 5000。它决定每个时间步 CLIP 把图像向 prompt 方向推动的力度是影响图像质量最重要的参数之一。CGS 一般随图像尺寸等比缩放例如从 512×512 提高到 512×768总像素增加 50%可相应把 CGS 从 5000 提高到 7500。CGS 过小则图像与文本关联弱过大则过冲导致画面失真init_scale(int)CLIP 匹配初始图像的强度默认 1000。与 CGS 互相制衡init_scale 过大则图像在扩散中几乎不变CGS 过大则初始图像信息丢失cutn_batches(int)每个时间步的切块评估批次默认 4。默认调度下每步执行 16 个 cutscutn_batches4时每步共 64 个 cuts、分 4 批串行计算从而在不增加峰值显存的前提下提升细节质量代价是渲染时间约为原来的 4 倍。关系为(调度 cuts) × cutn_batches 每时间步总 cutscut_ic_pow(int)inner cuts 边框尺寸指数默认 1。值越大边框越大、切块越小、细节越精细但过小/过多的 inner cuts 会导致整体连贯性下降甚至出现马赛克效应cut_overview / cut_innercut / cut_icgray_p(str)overview cuts、inner cuts 与 inner cut 灰度概率的调度字符串默认分别为[12]*400[4]*600、[4]*400[12]*600、[0.2]*400[0]*600。runner 中会通过eval解析为列表并按当前时间步索引取值见 runner.py实现前 400 步粗切、后 600 步细切的自适应切块调度。3.4.5 正则化与图像质量参数tv_scale(int)全变差去噪强度默认 0关闭。控制输出平滑度图像过于噪点颗粒感时可调大TV 去噪在平滑平坦区域噪声的同时能较好保留边缘range_scale(int)色彩对比度调节默认 0关闭。值越小对比度越高、色板更精简产生更鲜艳或海报化的效果值越大画面越柔和sat_scale(int)饱和度调节默认 0关闭。图像过饱和时可调大以降低饱和度clamp_grad(bool) / clamp_max(float)内部梯度限幅开关与限幅值。clamp_grad 阻止极端结果clamp_max 默认 0.05 提供更平滑柔和的色彩调高到 0.15–0.3 可带来更鲜明的对比与活力。若关闭 clamp_grad 后图像剧烈变化通常说明 clip_guidance_scale 偏高fuzzy_prompt(bool) / rand_mag(float)是否在 prompt 损失中加入多个带噪声的 prompt 以增加输出多样性默认关闭rand_mag 控制所加随机噪声的幅度。3.4.6 起始噪声与过程监控参数perlin_init(bool) / perlin_mode(str)是否使用 Perlin 噪声作为扩散起点默认 False。Perlin 噪声特性与随机噪声明显不同值得实验注意启用 perlin_init 会覆盖 init_image。perlin_mode 支持colored、gray、mixed默认混合模式见 runner.pydisplay_rate(int)每隔多少步保存并展示一次中间结果默认 10。设低如 5 或 10可尽早预览生成方向设高可减少展示开销batch_name(str)批次命名生成的 DocumentArray 会以disco_diffusion_clip_rn50-[batch_name]-[seed]命名建议使用唯一名称避免结果被覆盖。3.4.7 计算设备与输出目录use_gpu(bool)是否使用 GPU默认 True。使用 GPU 时需要正确设置CUDA_VISIBLE_DEVICES环境变量module.py中会据此调用paddle.device.set_device完成设备切换output_dir(str)输出目录默认disco_diffusion_clip_rn50_out中间过程帧progress-*.png与最终结果都会写入该目录。3.5 返回值说明generate_image返回一个DocumentArray对象ra其中包含n_batches个 Document每个 Document 的chunks中保存了迭代过程的所有中间结果每条 chunk 还带有cur_t时间步标签见 runner.py。你可以通过da[0].save_uri_to_file(...)保存最终图像通过da[0].chunks.save_gif(...)导出动态过程或通过da[0].chunks.plot_image_sprites(...)拼接展示所有中间帧对结果做灵活的保存与分析。四、PaddleHub Serving 服务部署PaddleHub Serving 可以将该模块部署为一个在线文图生成服务供其他程序通过 HTTP 调用。4.1 第一步启动 PaddleHub Serving运行如下启动命令$ hub serving start -m disco_diffusion_clip_rn50启动完成后即完成了一个文图生成在线服务 API 的部署默认端口号为8866。NOTE如使用 GPU 预测需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量否则无需设置。4.2 第二步发送预测请求服务端配置好后以下代码即可发送预测请求并获取结果。返回的预测结果在反序列化后即是上述接口声明中的 DocumentArray 类型返回后对结果的操作方式与使用generate_image接口完全相同import requests import json import cv2 import base64 from docarray import DocumentArray # 发送HTTP请求 data {text_prompts: in the morning light,Overlooking TOKYO city by greg rutkowski and thomas kinkade,Trending on artstation.} headers {Content-type: application/json} url http://127.0.0.1:8866/predict/disco_diffusion_clip_rn50 r requests.post(urlurl, headersheaders, datajson.dumps(data)) # 获取返回结果 da DocumentArray.from_base64(r.json()[results]) # 手动将最终生成的图像保存到指定路径 da[0].save_uri_to_file(disco_diffusion_clip_rn50_out-result.png) # 将生成过程保存为一个动态图gif da[0].chunks.save_gif(disco_diffusion_clip_rn50_out-result.gif)从实现角度看Serving 请求会进入module.py中标注serving的serving_method见 module.py它将请求参数透传给generate_image并把返回的 DocumentArray 通过to_base64()序列化后随 HTTP 响应返回客户端再用DocumentArray.from_base64(...)反序列化还原因此两端对结果的处理方式完全一致。五、版本与更新历史1.0.0初始发布可通过以下命令安装指定版本$ hub install disco_diffusion_clip_rn50 1.0.0六、使用建议与注意事项prompt 构造推荐遵循[主体] [细节] [场景/氛围] [艺术家/风格修饰]的结构并善用style、artist参数自动拼接prompt 支持:权重语法来调整不同元素的相对重要程度显存与速度权衡图像尺寸、steps、cutn_batches 是渲染时间的主要来源。默认 1280×768 输出在消费级 GPU 上耗时较长可先用 512×512 快速试验 prompt 效果再放大尺寸精修可复现性固定seed可复现相近结果每次运行后配置会以参数表形式打印实际使用的种子便于回放初始图像创作传入init_image并配合较高skip_steps约为总步数的一半可对已有图像进行风格重绘是扩展创作手段的有效方式模型不可微调该模块不支持 Fine-tuning表中是否支持 Fine-tuning为否使用时以推理为主。七、延伸阅读如需进一步深入本模块的实现细节可在当前仓库中继续阅读以下文件模块入口与 API 实现generate_image全参数签名、命令行与 Serving 入口生成主循环CLIP 引导梯度计算、cutouts 切块调度、采样与中间结果保存参数装配与校验默认参数合并、类型转换与参数表打印模型加载与 prompt 解析扩散模型、CLIP 模型加载与 prompt 权重解析默认参数配置全部默认超参数的权威参考CLIP Paddle 实现说明CLIP 视觉编码器的实现来源说明。赞分享人工智能大模型微调模型推理服务【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址https://gitcode.com/gh_mirrors/pa/PaddleFormers点击查看免费下载相关推荐PaddleHub w2v_sogou_target_word-bigram_dim300 中文词向量模型安装、API 调用与 Serving 部署实战PaddleHub w2v_sogou_target_word bigram_dim300 中文词向量模型安装、API 调用与 Serving 部署实战 导读人工智能大模型微调模型推理服务PaddleHub 中文词向量模型 w2v_baidu_encyclopedia_context_word-wordLR_dim300安装、API 调用与 Serving 部署实战PaddleHub 中文词向量模型 w2v_baidu_encyclopedia_context_word wordLR_dim300安装、API 调用与 S人工智能大模型微调模型推理服务PaddleHub 词嵌入实战w2v_baidu_encyclopedia_context_word-wordPosition_dim300 模型安装、API 调用与 Serving 部署指南PaddleHub 词嵌入实战w2v_baidu_encyclopedia_context_word wordPosition_dim300 模型安装、API人工智能大模型微调模型推理服务上一篇终极Brontes安装指南从2TB SSD到32GB内存的区块链分析引擎环境搭建全攻略下一篇把扫描PDF变成可搜索文档开源OCR工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表