
PaddleFormers 文图生成实战disco_diffusion_clip_rn50 模块原理、API 调参与服务部署全指南【免费下载链接】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 模块 为核心系统讲解该文图text-to-image生成模型的原理构成、安装方式、命令行与 Python API 两种预测途径、全部核心调参项以及基于 PaddleHub Serving 的在线服务部署方案。读完本文你将能够在本地复现输入一句自然语言 Prompt生成与之语义匹配的绘画作品的完整流程并掌握扩散模型 CLIP 双模型协同工作的底层机制。一、模块基本信息与模型原理1.1 模块概览项目说明模块名称disco_diffusion_clip_rn50类别text to image文图生成网络结构dd clip ResNet50训练数据集-是否支持 Fine-tuning否模块大小2.8GB最新更新日期2022-08-02数据指标-1.2 模型构成扩散模型 CLIP 多模态预训练模型disco_diffusion_clip_rn50 由两部分组成该说明来自 模块 README扩散模型Diffusion Model一种生成模型可以从噪声输入中重建出原始图像。在本模块中它负责从初始噪声或指定的初始图像出发逐步生成目标图像。多模态预训练模型CLIP能够将文本和图像表示在同一个特征空间语义相近的文本与图像在该空间中距离更近。本模块中 CLIP 负责引导扩散模型生成的图像语义尽可能接近输入文本的语义。整个生成过程可以概括为扩散模型在 CLIP 的引导下不断迭代生成新图像最终生成文本所描述内容的图像。从源码实现看模块的 CLIP 视觉编码器为 ResNet50ModifiedResNet结构实现在 clip/clip/model.py 中。与标准 ResNet 相比该实现有三处改动3 层 stem 卷积并使用平均池化替代最大池化对 stride 1 的卷积前置 avgpool 做抗锯齿处理最终池化层采用 QKV 注意力AttentionPool2d而非平均池化。扩散主干则采用无类别条件的 UNet 结构配置见 reverse_diffusion/helper.py 中512x512_diffusion_uncond_finetune_008100模型image_size512、num_channels256、num_res_blocks2、learn_sigmaTrue、noise_schedulelinear。更深入的理论背景可参阅论文Diffusion Models Beat GANs on Image Synthesis与Learning Transferable Visual Models From Natural Language Supervision。二、安装与环境依赖2.1 环境依赖paddlepaddle 2.0.0paddlehub 2.2.0PaddleHub 的安装方法参见 PaddleHub 安装文档。2.2 安装模块$ hub install disco_diffusion_clip_rn50如安装遇到问题可参考各平台的零基础安装指南Windows 快速开始、Linux 快速开始、Mac 快速开始。模块运行还依赖一组 Python 第三方库记录在 requirements.txt 中包括numpy、paddle_lpips0.1.2用于初始图像相似度损失、ftfy、docarray0.13.29结果容器、pyyaml、regex、tqdm、ipywidgets。注意模块首次加载时需要下载并加载扩散模型与 CLIP 模型权重约 2.8GB首次运行耗时较长。三、模型 API 预测模块提供了两种预测方式命令行预测与 Python 代码调用二者最终都汇入 module.py 中DiscoDiffusionClip.generate_image这一统一入口。3.1 命令行预测$ 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_out命令行入口由module.py中的run_cmd与add_module_config_arg/add_module_input_arg注册见 module.py除--text_prompts为必填输入外--style、--artist、--init_image、--width_height、--steps、--seed、--clip_guidance_scale、--use_gpu、--output_dir等全部进阶参数均可在命令行直接指定。3.2 Python 代码预测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.] # Output images will be saved in disco_diffusion_clip_rn50_out directory. # The returned da is a DocumentArray object, which contains all immediate and final results # You can manipulate the DocumentArray object to do post-processing and save images da module.generate_image(text_promptstext_prompts, output_dir./disco_diffusion_clip_rn50_out/) # Save final result image to a file da[0].save_uri_to_file(disco_diffusion_clip_rn50_out-result.png) # Show all immediate results da[0].chunks.plot_image_sprites(skip_emptyTrue, show_indexTrue, keep_aspect_ratioTrue) # Save the generating process as a gif da[0].chunks.save_gif(disco_diffusion_clip_rn50_out-result.gif)关键点说明返回对象generate_image返回一个DocumentArray对象包含n_batches个Document。其中每个Document都保存了迭代过程中的全部中间结果可通过da[0].chunks访问中间帧。这是基于docarray库的容器结构更多用法参见 DocumentArray 官方教程。进度图与 GIFplot_image_sprites将所有中间结果拼成雪碧图save_gif将生成过程导出为动态图。设备与结果目录generate_image内部会按use_gpu自动设置 Paddle 设备GPU 时读取CUDA_VISIBLE_DEVICES环境变量否则回退 CPU并自动创建输出目录见 module.py。3.3 API 签名与核心参数README 中给出的精简签名如下def generate_image( text_prompts, style: Optional[str] None, artist: Optional[str] None, width_height: Optional[List[int]] [1280, 768], seed: Optional[int] None, output_dir: Optional[str] disco_diffusion_clip_rn50_out):实际上module.py 中generate_image的完整签名还包含init_image、skip_steps、steps、cut_ic_pow、init_scale、clip_guidance_scale、tv_scale、range_scale、sat_scale、cutn_batches、diffusion_sampling_mode、perlin_init、perlin_mode、eta、clamp_grad、clamp_max、randomize_class、clip_denoised、fuzzy_prompt、rand_mag、cut_overview、cut_innercut、cut_icgray_p、display_rate、n_batches、batch_size、batch_name、use_gpu等 30 余个参数默认值均与原版 DiscoArt 对齐。基础参数参数类型/默认值说明text_promptsstr 或 List[str]必填。描述目标图像内容的语句。推荐按内容描述 艺术家/风格的结构构造如a beautiful painting of Chinese architecture, by krenz, sunny, super wide angle, artstation.。prompt 构造技巧可参考公开的 Disco Diffusion prompt 指南styleOptional[str] None指定绘画风格如watercolor、Chinese painting。不指定时风格完全由 prompt 决定artistOptional[str] None指定艺术家如 Greg Rutkowsk、krenz生成该艺术家风格的画作。不指定时由 prompt 决定init_imageOptional[str] None初始图像路径。提供后扩散将以该图而非纯噪声为起点配合较大的skip_steps约总步数的 50%可保留原图结构width_heightList[int] [1280, 768]输出图像宽高。宽高应为 64 的倍数非 64 的倍数会被自动修正为最近的倍数见 runner.py尺寸越大计算时间越长seedOptional[int] None随机种子。默认每次随机指定种子可获得可复现且相近非完全一致的结果。实际使用的种子会在运行时参数表中打印便于复现output_dirstr disco_diffusion_clip_rn50_out输出目录。运行中每隔display_rate步会写入progress-{n}.png进度图扩散过程控制参数参数类型/默认值说明skip_stepsint 0跳过的去噪步数。早期步噪声极高、画面变化剧烈跳过约 10%~15% 步数通常不影响最终效果可显著缩短渲染时间使用 init_image 时建议跳过约 50% 步数以保留原图形态stepsint 250总扩散步数。每步 AI 观察若干cuts并计算引导方向。250~500 步后收益递减复杂图像可增至 1000 步渲染时间与步数成正比etafloat 0.8每时间步混入的随机缩放噪声量0 为无噪声1.0 噪声最大。eta0 时约 50~75 步即可获得不错结果eta≈1.0 时建议 250 步以上diffusion_sampling_modestr ddim采样算法。ddim成熟稳定plms可在更少步数下获得良好结果但测试较少clip_guidance_scaleint 5000CGS最重要的参数之一。控制 CLIP 每时间步向 prompt 靠拢的强度。过高会过冲导致图像失真该值一般随图像尺寸增大而线性放大如尺寸增大 50% 时从 5000 调到 7500init_scaleint 1000控制 CLIP 匹配 init_image 的强度与 CGS 相互制衡。过大则图像变化小过小则初始图像信息丢失tv_scaleint 0全变分去噪强度控制输出平滑度0 为关闭。图像过于噪点/脆时调大range_scaleint 0颜色对比度调节0 为关闭。调低增强对比更鲜艳或海报化调高减弱对比更柔和sat_scaleint 0饱和度调节0 为关闭。图像过饱和时调大以降低饱和度切割Cut相关参数参数类型/默认值说明cutn_batchesint 4每时间步切割批次数。默认每步 16 个 cutscutn_batches4时每步共 64 个 cuts分 4 批各 16 个顺序评估在内存占用不变的前提下提升精度代价是渲染时间约增至 4 倍cut_ic_powint 1内切割inner cut边框尺寸的指数。越大边框越大、切割块越小、细节越细过大易导致整体不连贯或马赛克效果cut_overviewstr [12]*400[4]*600概览切割overview cut的调度表形式为[数量]*步数拼接控制扩散各阶段的切割数量cut_innercutstr [4]*400[12]*600内切割inner cut调度表cut_icgray_pstr [0.2]*400[0]*600内切割中灰度化比例调度表从 runner.py 的cond_fn可以看到 cuts 的具体作用方式每个时间步对当前图像调用MakeCutoutsDango生成概览/内切割块实现见 make_cutouts.py经过随机翻转、仿射、灰度、颜色抖动等数据增强后送入 CLIP 编码再与文本目标嵌入计算球面距离损失spherical_dist_loss最终以clip_guidance_scale加权后的梯度反向引导扩散过程。高级参数参数类型/默认值说明perlin_initbool False是否使用 Perlin 噪声作为初始状态替代随机噪声。注意开启后会覆盖 init_image 设置perlin_modestr mixedPerlin 噪声类型color彩色、gray灰度、mixed混合clamp_gradbool True梯度裁剪开关防止产生极端结果。若关闭后图像剧烈变化说明 CGS 过高clamp_maxfloat 0.05梯度裁剪上限。默认 0.05 色彩更平滑内敛调至 0.15~0.3 可增强对比与活力fuzzy_promptbool False为 prompt 损失叠加多个带噪 prompt增大输出多样性rand_magfloat 0.05仅作用于 fuzzy_prompt控制叠加随机噪声的幅度randomize_classbool True是否随机化类别影响无条件模型推理clip_denoisedbool False是否对去噪结果做 CLIP 裁剪display_rateint 10每隔多少步显示一次中间进度图设为 steps 可减少显示开销n_batchesint 1生成图像数量。每个 batch 对应 DocumentArray 中的一个 Documentbatch_sizeint 1单批并行生成的图像数batch_namestr 批次命名会话 ID 形如disco_diffusion_clip_rn50-{batch_name}-{seed}建议使用唯一名称避免结果被覆盖use_gpubool True是否使用 GPU 推理Prompt 权重语法text_prompts中的每个 prompt 支持描述:权重后缀语法。从 helper.py 的parse_prompt实现可见prompt 会按最后一个冒号拆分为文本与浮点权重未写权重时默认为 1且权重归一化后求和不能为 0否则会抛出RuntimeError(The weights must not sum to 0.)。此外若传入style/artist模块会自动将,{style}、,{artist},trending on artstation拼接进 prompt 末尾见 module.py。返回对象DocumentArray包含n_batches个 Documents每个 Document 的chunks保存了生成过程中的全部中间结果其tags记录本次运行的全部参数见 runner.py。四、生成流程的源码级拆解generate_image内部调用reverse_diffusion.create()入口见 reverse_diffusion/init.py随后经过三个环节配置加载config.py 将用户参数与default.yml默认配置合并未识别参数会告警忽略并把浮点型整数参数强制转 int随后打印参数表供核对。模型加载load_all_models加载 512x512 无条件扩散 UNet 与 Secondary Diffusion 模型SecondaryDiffusionImageNet2用于更快地清理中间图像供 CLIP 评估load_clip_models按clip_models[RN50]加载 CLIP 编码器所有参数均设为stop_gradientTrue冻结见 helper.py。迭代采样do_run根据diffusion_sampling_mode选择ddim_sample_loop_progressive或plms_sample_loop_progressive在每个时间步通过cond_fn计算 CLIP 引导梯度并施加损失CLIP 球面距离损失 TV/range/saturation 损失 LPIPS 初始图损失完成整幅图像的迭代生成见 runner.py。在每步迭代中中间图像会被保存为progress-{n}.png并作为Document.chunks追加进结果这正是后续save_gif能还原生成过程的原因。五、服务部署PaddleHub ServingPaddleHub Serving 可以将文图生成能力部署为在线服务。5.1 第一步启动 PaddleHub Serving$ hub serving start -m disco_diffusion_clip_rn50执行后即完成文图生成在线服务 API 的部署默认端口为8866。注意如使用 GPU 预测需在启动服务前设置CUDA_VISIBLE_DEVICES环境变量CPU 环境则无需设置。5.2 第二步发送预测请求服务端就绪后以下代码即可发送预测请求并获取结果import requests import json import cv2 import base64 from docarray import DocumentArray # Send an HTTP request 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)) # Get results da DocumentArray.from_base64(r.json()[results]) # Save final result image to a file da[0].save_uri_to_file(disco_diffusion_clip_rn50_out-result.png) # Save the generating process as a gif da[0].chunks.save_gif(disco_diffusion_clip_rn50_out-result.gif)服务端处理逻辑对应 module.py 中serving装饰的serving_method它调用generate_image后将DocumentArray序列化为 base64 返回。因此客户端在反序列化后拿到的仍是DocumentArray对象对结果的操作方式与直接调用generate_image完全相同保存 PNG、拼接雪碧图、导出 GIF 均可复用同一套 API。六、版本与更新历史1.0.0初始发布。如需指定版本安装$ hub install disco_diffusion_clip_rn50 1.0.0结语disco_diffusion_clip_rn50 完整复现了扩散模型生成 CLIP 语义引导的文图生成范式通过 module.py 统一的参数入口你既可以hub run一行命令出图也可以基于generate_image精细控制从扩散步数、CGS 引导强度到切割调度的全部细节还能借助 PaddleHub Serving 将模型快速封装为 HTTP 在线服务。对于希望深入理解 Diffusion CLIP 协同原理、或需要在 PaddlePaddle 生态中落地文图生成能力的开发者这是一个可以直接上手、可完整复现的参考实现。【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考