ARTICLE DETAIL

资讯详情

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

stable-diffusion.cpp 图像预处理指南:用 --image-preprocess 精确控制 init/mask/ref/control 输入变换

stable-diffusion.cpp 图像预处理指南:用 --image-preprocess 精确控制 init/mask/ref/control 输入变换 人工智能大模型本地部署推理引擎媒体生成【免费下载链接】stable-diffusion.cppDiffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp点击查看免费下载导读stable-diffusion.cpp 是纯 C/C 实现的扩散模型推理引擎支持 SD、Flux、Wan、Qwen Image、Z-Image 等模型见 README.md。本文围绕 docs/image_preprocessing.md 展开讲解其核心特性--image-preprocess如何在一次生成前针对 init、end、mask、control、ref、ip-adapter、id、control-frame 等每一类图像输入独立配置裁剪、缩放、填充、重采样与 Canny 边缘检测。读完本文你将掌握 CLI、HTTP 服务SDAPI / OpenAI 兼容接口与 C API 三种入口的规则写法、默认几何与优先级语义、mask 与 init 对齐约束、以及它与原始管线画布适配、reference 缩放、VAE/CLIP 预处理之间的边界关系。一、设计动机与整体流程CLI 与 Server 的图像加载器按原始分辨率解码输入sd_image_t保持原始宽高定义见 include/stable-diffusion.h。过去CLI/Server 的 BOX/sRGB 缩放逻辑内嵌在加载器里引入--image-preprocess后几何变换被移出加载器统一由生成入口执行因此默认像素输出不再保证与旧版本构建完全一致文档已明确此点。整个流程如下native-resolution image - input defaults user overrides - one input transform - original generation pipeline and model-specific processing对应到源码在 src/pipeline/image.cpp 的generate_image()中构造sd::ImagePreprocessor先prepare_inputs()完成全部变换再把处理后的参数交给后续的prepare_image_generation_latents()/prepare_image_generation_embeds()等原始管线视频路径同理见 src/pipeline/video.cpp 的generate_video()。几个关键边界文档明确说明源码亦可印证这些规则不会覆盖模型内部既有的 VAE、CLIP/VLM、ControlNet、像素 patch 预处理--ref-image-args语义不变且在本次输入变换之后执行参考视频与音频预处理不在这套图像规则内预处理仅作用于img_gen与vid_gen不作用于独立的 upscale 或 ADetailer 模式ADetailer 会为内部裁剪清空用户规则src/detailer.cpp 将generation.image_preprocess置空。二、输入目标与默认几何Inputs and defaults文档给出的默认行为表如下这些默认值由 CLI、Server、C API 三方共享target输入默认几何是否支持索引initimg2img 图像或视频首帧按生成宽高比居中裁剪再缩放否end视频末帧居中裁剪再缩放否maskInpainting 蒙版继承 init 几何否则居中裁剪再缩放否controlControl 图像居中裁剪再缩放否ref参考图保持源尺寸是ip-adapterIP-Adapter 图像保持源尺寸否idPhotoMaker 身份图保持源尺寸是control-frameControl 视频帧居中裁剪再缩放是画布canvas默认使用对齐后的生成尺寸参考图、IP-Adapter、身份图默认保留原始尺寸除非显式覆盖。默认重采样普通图像为nearest蒙版为nearest-exact对应 src/runtime/image_preprocess.cpp 中apply_geometry的默认 filter 选择。从源码结构看ImageTarget枚举src/runtime/image_preprocess.h与文档表格的八类目标一一对应规则解析时通过image_targets表完成字符串映射src/runtime/image_preprocess.cpp。三、规则语法、校验与优先级规则是逗号分隔的keyvalue列表。每条规则必须以target开头且至少包含一个选项多条规则通过重复 CLI 选项或分号连接。校验时机为图像/视频生成启动时prepare_inputs调用validate_inputs见 src/runtime/image_preprocess.cpp以下情况会导致生成失败并输出错误日志未知 key、非法值、同一条规则内重复 keystd::setstd::string keys去重检测见 src/runtime/image_preprocess.cpp缺少target、规则没有任何选项、width/height只出现其一目标输入缺失如图片中未提供 ref/control 图索引越界rule.index count。优先级语义文档明确源码resolve_options印证见 src/runtime/image_preprocess.cpp省略index则配置该类型的全部图像否则使用从 0 开始的索引CLI 目录输入按文件名顺序排序索引化规则按字段覆盖类型级规则且与书写顺序无关相同特异性下最后一个字段值生效auto表示采用该输入的默认预设resolve_mode中auto回落见 src/runtime/image_preprocess.cpp。四、几何变换模式modemode输入变换auto使用输入的默认几何none保持源尺寸不缩放、不裁剪、不填充stretch缩放到目标尺寸crop裁剪目标尺寸矩形但不缩放源图过小则失败crop-resize先裁剪到目标宽高比再缩放fit-pad保持宽高比完整放入目标尺寸内再填充要点与源码佐证width/height必须成对出现且为正整数它们覆盖输入变换的尺寸而不改变生成或编码器尺寸对于原生尺寸预设若指定了尺寸但未指定 mode则等价于stretchresolve_mode中options.count(width) default_mode None时选Stretchmodenone同时显式指定了与源不同的尺寸属于自相矛盾会被拒绝src/runtime/image_preprocess.cppcrop模式下若裁剪尺寸超出源尺寸会报错“crop exceeds source dimensions”src/runtime/image_preprocess.cppcrop-resize先按目标宽高比计算裁剪矩形crop_width/crop_height再缩放fit-pad的缩放比例取min(target_w/source_w, target_h/source_h)再按anchor计算pad_x/pad_ysrc/runtime/image_preprocess.cpp。五、锚点、填充色、重采样与抗锯齿5.1 anchoranchorcenter|top|bottom|left|right决定裁剪/填充的位置。源码anchor_offsetsrc/runtime/image_preprocess.cpp实现left/top 取 0right/bottom 取剩余量center 取一半。5.2 pad_colorpad_color#RRGGBB或#RRGGBBAA选择填充色默认不透明黑#000000ff见 src/runtime/image_preprocess.cpp。解析规则7 位十六进制自动补ff灰度蒙版使用第一个颜色分量见 src/runtime/image_preprocess.cpp 的通道填充逻辑。#RRGGBBAA中的 alpha 也会参与填充多通道下取对应分量。5.3 filter 与 antialiasfilterauto|nearest|nearest-exact|bilinear|bicubic|lanczos选择重采样算法默认auto即目标默认图像 nearest、蒙版 nearest-exact。源码映射到ops::InterpolateMode枚举src/runtime/image_preprocess.cpp。antialiasauto|true|falseauto仅在“滤波类插值 缩小”resize_width crop_width || resize_height crop_height时自动启用见 src/runtime/image_preprocess.cpptrue强制开启但要求 filter 为 bilinear/bicubic/lanczos 之一与 nearest/nearest-exact 组合会被拒绝构造时即校验src/runtime/image_preprocess.cppfalse关闭。滤波类 RGBA 缩放采用预乘 alpha缩放前将 RGB 乘以 alpha缩放后除以 alpha并对 alpha 做 0–1 clamp、对除零做保护见 src/runtime/image_preprocess.cpp。最终像素统一 clamp 到 [0,1]src/runtime/image_preprocess.cpp。六、Canny 边缘检测cannytrue|false为任意受支持的图像目标开启边缘检测默认false。它只在几何变换之后、原始生成管线之前执行一次且modenone时也执行即 Canny 独立于几何变换。支持灰度、灰度alpha、RGB、RGBA 输入alpha 保留。关键点每个输入拥有独立的 Canny 设置索引化规则可对单个 ref / 身份图 / control 视频帧单独开关从源码看Canny 阈值在prepare_image中以固定参数(0.08f, 0.08f, 0.8f, 1.f, false)调用preprocess_cannysrc/runtime/image_preprocess.cpp即当前版本未开放阈值参数适用示例--image-preprocess targetinit,modefit-pad,cannytrue --image-preprocess targetref,index0,modenone,cannytrue --image-preprocess targetcontrol-frame,index2,cannytrue七、mask 与 init 的对齐约束init 与 mask 的源尺寸必须相同mask 继承 init 的裁剪、缩放与填充坐标同时保留自己的 filter、填充值与 Canny 设置。源码实现位于preprocess_input的 Mask 分支src/runtime/image_preprocess.cpp若 init 已产生变换则 mask 源尺寸必须与 init 源尺寸一致否则报错若 mask 规则中显式出现width、anchor或非auto的mode即“几何覆盖”则重新计算 mask 几何并与 init 变换逐字段比较crop、resize、pad、输出尺寸任何不一致都报错“mask geometry conflicts with init”否则直接复用init_transform_的几何仅以 mask 自己的 filter/填充色/Canny 应用变换默认nearest-exact完全省略 mask 时保持缺失直到原始管线创建默认蒙版。八、下游行为Downstream behaviormodenone只跳过输入几何变换但下游处理依旧执行--image-preprocess targetinit,modenone \ --image-preprocess targetref,modenoneinit 图仍会被原始管线适配到生成画布参考图仍遵循--ref-image-args与模型特有缩放CLIP 保留固定输入尺寸与归一化HiDream-O1 保留其原始像素参考与视觉预处理文档明确。已有消费方之间的共享语义保持不变例如 Wan img2video 用同一个适配后的首帧同时服务 VAE 条件与 CLIP从 src/pipeline/video.cpp 可见视频首帧会转为 img2img 参数并走generate_image路径高分辨率hirespass 复用已准备好的图像并执行自身的尺寸适配不会第二次应用用户的裁剪。要禁用 VAE 编码前的参考图缩放使用--ref-image-args resize_before_vaefalse或 Server 字段ref_image_args: resize_before_vaefalse。这与targetref,modenone相互独立后者仅跳过输入几何变换模型约束仍然生效。九、Server 请求与 SDAPI原生图像/视频请求与 SDAPI 均接受image_preprocess为字符串或规则字符串数组{ image_preprocess: [ targetinit,modefit-pad,filterbicubic, targetmask,filternearest-exact, targetref,index0,modenone ] }OpenAI 兼容请求通过 prompt 中的sd_cpp_extra_args{...}/sd_cpp_extra_args传入例如编辑类请求可写sd_cpp_extra_args{image_preprocess:targetref,modenone,ref_image_args:resize_before_vaefalse}/sd_cpp_extra_args见 examples/server/api.md请求中的规则会替换 Server 默认规则生成元数据记录用户规则图像编码与通道约定不变。服务端解析入口parse_image_preprocess_jsonexamples/common/common.cpp校验其为字符串或字符串数组SDAPI 路由在 examples/server/routes_sdapi.cpp 调用并在失败时返回invalid image_preprocessSDCpp 路由默认值见 examples/server/routes_sdcpp.cpp。完整参数表见 examples/server/api.md。十、C API 用法在现有图像/视频生成参数上设置image_preprocessgenerate_image()与generate_video()签名不变sd_img_gen_params_t params; sd_img_gen_params_init(params); /* Set prompt, original-resolution input images, and generation options. */ params.image_preprocess.rules targetinit,modecrop-resize,filterlanczos; targetmask,filternearest-exact; bool ok generate_image(ctx, params, images, count);要点sd_image_preprocess_params_t仅含一个rules成员分号分隔的target...,keyvalue规则NULL表示采用默认预设定义见 include/stable-diffusion.h两个生成参数初始化器都将rules置为NULL见 src/runtime/image_preprocess.cpp 与 src/runtime/image_preprocess.cpp即默认输入预设规则字符串在同步调用期间是“借用”borrowed的调用方需保证其生命周期覆盖调用库拥有临时变换后的像素owned_images_调用方图像与数组不会被修改在对应目标规则的rules中加cannytrue即可启用 Canny参数结构体已扩展应用与绑定代码需要重新编译。十一、CLI 参数速查与注意事项完整 CLI 参数定义见 examples/common/common.cpp其分隔符为;帮助文本与本文各表一一对应./bin/sd-cli ... \ --image-preprocess targetinit,modecrop-resize,filterlanczos,antialiastrue \ --image-preprocess targetmask,filternearest-exact \ --image-preprocess targetref,index0,modefit-pad,width768,height768,filterbicubic注意事项汇总仅img_gen/vid_gen模式生效其他模式会报错--image-preprocess requires img_gen or vid_gen modeexamples/common/common.cpp每条规则必须含target与至少一个选项width/height成对索引只允许用于ref、id、control-frame三个可索引目标src/runtime/image_preprocess.cpp校验失败未知 key、重复 key、非法值、越界索引、缺图时生成直接失败并记录错误日志与旧版 CLI/Server 的 BOX/sRGB 加载器缩放相比默认像素不再保证一致——升级后如需复现旧结果请显式配置几何规则。十二、完整示例组合一个典型的 img2img inpainting 参考图 Canny 控制组合./bin/sd-cli --mode img_gen \ --image ./input.png --mask ./mask.png \ --ref-image ./ref0.png \ --image-preprocess targetinit,modecrop-resize,filterlanczos,antialiastrue \ --image-preprocess targetmask,filternearest-exact \ --image-preprocess targetref,index0,modefit-pad,width768,height768,filterbicubic \ --image-preprocess targetcontrol,index0,cannytrue \ --output ./result.png对应的 Server JSON{ image_preprocess: [ targetinit,modecrop-resize,filterlanczos,antialiastrue, targetmask,filternearest-exact, targetref,index0,modefit-pad,width768,height768,filterbicubic, targetcontrol,index0,cannytrue ] }建议在实际生成时打开--log-level verbose观察preprocess init[0]: ... crop(...) resize... pad(...)日志由 src/runtime/image_preprocess.cpp 输出以核对每个目标的几何计划是否符合预期。参考文档与源码索引本功能权威文档docs/image_preprocessing.mdCLI 入口与帮助文本examples/cli/README.md、examples/common/common.cpp核心实现src/runtime/image_preprocess.cpp、src/runtime/image_preprocess.h生成入口src/pipeline/image.cpp、src/pipeline/video.cppC API 结构体include/stable-diffusion.h服务端解析与文档examples/common/common.cpp、examples/server/routes_sdapi.cpp、examples/server/api.md赞分享人工智能大模型本地部署推理引擎媒体生成【免费下载链接】stable-diffusion.cppDiffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp点击查看免费下载相关推荐Image Editing in stable-diffusion.cpp参考图像驱动的图像编辑完整指南Image Editing in stable diffusion.cpp参考图像驱动的图像编辑完整指南 stable diffusion.cpp 是一款纯人工智能大模型本地部署推理引擎媒体生成opencodex Design B 端点清扫/v1/* 404 守卫与 /v1/responses/compact 远程压缩的完整落地opencodex Design B 端点清扫/v1/ 404 守卫与 /v1/responses/compact 远程压缩的完整落地 本篇技术指南以 opeMistral-src多模态输入图像预处理指南Mistral src多模态输入图像预处理指南 引言解析多模态交互的图像输入难题 在大语言模型主导的AI应用中单一文本输入已无法满足复杂场景需求。Mist人工智能大模型本地部署上一篇gh_mirrors/st/styleguide服务网格Istio等网格技术规范下一篇Prometheus PVE Exporter源码解析ClusterCollector如何采集Proxmox集群数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表