男人变成性感美女的样子跟好兄弟走在了一起?第一次看到这个需求,我还以为是个搞笑段子。但仔细拆解一下,这其实是一个很典型的 AI 创意图像生成项目:把人脸做“性别变换”,再让变换后的形象与另一个真实人物生成同框合影。实现这个效果的核心不是 PS 修图,而是目前已经非常成熟的 Stable Diffusion 工作流,配合 ControlNet、LoRA、局部重绘(Inpainting)和身份保持类模型。
这篇文章我会从需求理解开始,完整讲解技术选型、环境搭建、核心流程、实际生成步骤、API 批量调用和常见坑位。如果你刚好也想做“AI 变身照”“双人同框合影”这类创意照片,可以直接照着这篇文章跑一遍。
1. 项目背景与核心概念
1.1 这个需求到底是什么
先把这个标题翻译成技术需求:用户希望输入一张男性照片,输出一张具有女性特征的同一个人形象,再把这个形象和“好兄弟”的照片放在同一个画面里,形成一张看起来非常自然、像是真实合影的照片。
这个需求在影视特效、短视频创意、社交娱乐 App 里非常常见。比如:
- 短视频平台里的“性别互换挑战”;
- 相机类 App 的“变妆滤镜”;
- 给朋友生成“平行时空”风格的创意合照;
- 个人写真、生日祝福、活动海报的趣味素材。
和普通美颜不同,这里的难点不在于“把脸变白变瘦”,而在于三个核心问题:
- 性别特征要自然转换,不能只是简单磨皮美白;
- 生成出来的人要保留原照片的身份感,不能变成完全陌生的另一个人;
- 两个人要出现在同一张图里,并且姿态、光线、背景都要协调。
这三个问题,恰好分别对应了生成模型、身份保持模型和姿态控制模型。
1.2 涉及的核心技术名词
先不要被术语吓到,下面这几个概念是整个项目的关键。
Stable Diffusion(稳定扩散模型)这是一个开源文本生成图像模型,可以根据文字描述生成图片,也可以根据一张原图做“图生图”二次创作。我们现在要做的“男性照片转女性形象”,本质上就是一次带文字引导的图生图过程。
LoRA(Low-Rank Adaptation)一种轻量化的模型微调方式。它能给 Stable Diffusion 增加某种固定风格或固定角色特征,同时不重训整个大模型。比如我们下载一个“韩系女生风格 LoRA”,生成时就会自动倾向于生成相应风格的女性形象。
ControlNet(可控生成网络)用来给 Stable Diffusion 增加额外控制条件的工具。我们可以通过它把原照片的骨架姿态、深度关系、边缘轮廓提取出来,让生成结果保持原有动作,而不是自由乱发挥。
Inpainting(局部重绘)只在图片指定区域重新生成内容。比如原图中只有人脸区域需要改成女性特征,其他部分保持不变,这就是 Inpainting 的典型用法。
IPAdapter / InstantID这类工具用于保持人物身份一致性。它们能提取原图的身份特征,在生成时融入新形象,让结果看起来“还是同一个人”。
1.3 方案选型对比
在实际动手之前,我们要先选一条最合适的实现路线。我比较了四种常见方案:
| 方案 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 传统 PS 修图 | 手动液化、磨皮、换发型 | 可控性高 | 效率低,技术要求高,效果有限 |
| 经典 GAN 模型 | 用 StyleGAN 等模型做人脸属性编辑 | 人脸效果真实 | 姿态、背景、多人合影支持弱 |
| Stable Diffusion WebUI 工作流 | 图生图 + LoRA + ControlNet + Inpainting | 灵活、可控、免费、社区生态好 | 依赖显卡,参数调试有门槛 |
| 云端 AI API | 调用第三方图像生成服务 | 无需显卡,开箱即用 | 费用高,数据隐私有风险 |
这四种方案里,最适合新手和普通开发者的其实是 Stable Diffusion WebUI。它虽然是开源的,但已经封装得很好,界面操作比较直观,而且有大量社区模型可以直接下载使用。下面整篇教程都会围绕这套方案展开。
2. 环境准备与软件安装
2.1 硬件与系统要求
先说硬件,因为很多人第一次卡住不是代码问题,而是显存不够。
- 最低配置:NVIDIA 显卡 8GB 显存,可以跑通,但出图速度和分辨率受限;
- 推荐配置:16GB 显存以上,可以比较舒服地完成 512x512、768x768 分辨率的生成和重绘;
- 内存建议 16GB 以上;
- 硬盘预留 50GB 以上,因为大模型文件、ControlNet 模型和 LoRA 文件都不小。
系统方面,Windows 10/11 和 Ubuntu 20.04 以上都可以。如果只有 Mac 或者集成显卡,也可以运行,但速度会明显偏慢,建议改用远程 GPU 服务器或者云平台。
2.2 安装 Stable Diffusion WebUI
这里我们使用目前使用最广的 AUTOMATIC1111 版本。输入以下命令把项目克隆到本地:
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git cd stable-diffusion-webui然后根据系统执行启动脚本:
# Linux / macOS ./webui.sh # Windows webui-user.bat第一次启动会自动创建 Python 虚拟环境,并安装 PyTorch 等依赖。这个过程比较长,取决于网络和机器性能。启动成功后,浏览器会自动打开http://127.0.0.1:7860。
需要注意的是:如果你有多个显卡或者显存较小,可以修改启动参数。Windows 用户可以编辑目录下的webui-user.bat,在里面追加:
set COMMANDLINE_ARGS=--xformers --no-half-vaeLinux 用户则可以在启动时追加参数:
./webui.sh --xformers --no-half-vae其中--xformers能减少显存占用并加速生成,--no-half-vae可以避免部分显卡生成图片时出现黑图或噪点。版本和参数需要根据你的实际环境调整,重点是理解这些参数的作用。
2.3 安装 LoRA 与 ControlNet
WebUI 启动之后,我们在models目录下补一些东西。目录结构大致是这样的:
stable-diffusion-webui/ ├── models/ │ ├── Stable-diffusion/ │ │ └── realistic-based.safetensors │ ├── Lora/ │ │ └── female_style.safetensors │ └── ControlNet/ │ └── control_v11p_sd15_openpose.pth ├── extensions/ │ ├── sd-webui-controlnet/ │ └── sd-webui-additional-networks/具体说明如下:
models/Stable-diffusion/放置主模型,也就是底模,一般建议使用写实风格模型,而不是二次元动漫模型;models/Lora/放置风格 LoRA,比如女性妆容、发型等;models/ControlNet/放置 ControlNet 的模型权重文件;extensions/放置 WebUI 扩展插件。
ControlNet 的安装推荐直接在 WebUI 的“扩展”页面搜索sd-webui-controlnet安装,或者手动克隆到extensions目录:
git clone https://github.com/Mikubill/sd-webui-controlnet.git extensions/sd-webui-controlnet之后重启 WebUI,在“文生图/图生图”页面下方就会看到 ControlNet 设置面板。
2.4 验证环境是否正常
环境配好后,我们先做一次最简单的验证。在“文生图”页面输入一个简单描述,比如:
a portrait photo of a woman, soft light, clean background点击“生成”,如果能正常出图,说明整个环境已经跑通。接下来就可以开始核心流程了。
3. 核心流程拆解
3.1 总体工作流
整个“男性照片变成女性形象,再与兄弟合影”的任务,可以分为下面五个阶段:
- 素材准备:准备清晰的正脸照片和兄弟的照片;
- 生成女性形象:用图生图 + LoRA 把男性照片转成女性形象;
- 局部精修:用 Inpainting 修复脸部、发型等细节;
- 同框合成:通过 ControlNet 姿态控制,生成两人同框底图,再分别替换两张脸;
- 高清放大:最后用 Hires.fix 或外挂放大模型提升清晰度。
这个流程最核心的点在于:不要试图一步到位生成“两个人都在画面里”的最终图。一步到位的结果往往身份特征丢失、动作僵化。正确的做法是“先生成单人形象,再合成同框画面”。
3.2 借助 ControlNet 控制人物姿态
ControlNet 的作用是给生成模型额外增加一张“约束图”。我们通常使用 OpenPose 姿态图,也就是一张由关键点构成的火柴人图。
比如,我们想让最终同框照中左边的女生是站姿,右边的兄弟也是站姿,那么先用工具提取两张照片的姿态骨架,然后在 ControlNet 中分别上传姿态图。生成时会根据骨架重新绘制人物,人物的衣服、背景可以被重写,但动作会保持和骨架一致。
参数方面,重点看下面几项:
- 启用 ControlNet:必须勾选;
- 预处理器(Preprocessor):选择
openpose; - 模型(Model):选择对应的
control_v11p_sd15_openpose; - 权重(Control Weight):一般 0.6 到 0.9 之间,越高越贴近姿态图。
3.3 利用 LoRA 控制人物风格
LoRA 是一个体积很小的风格插件,可能只有几十 MB 到一两百 MB,但能在生成时显著改变人物风格。
在提示词中加入 LoRA 的触发方式通常是这样的:
<lora:female_style:0.8>这里的0.8代表权重。权重太高容易让画面过度风格化,太低则效果不明显。建议从0.7到0.9之间尝试。
同时,LoRA 一般会自带触发词。比如某个韩系写实 LoRA 可能需要额外加korean, 20 years old, soft skin这类词,具体要以 LoRA 作者的说明为准。
3.4 身份一致性:IPAdapter 与 InstantID
如果不做身份保持,生成出来的“女生”可能只是“符合提示词的女生”,和原照片的主人完全不像。这时候我们需要借助 IPAdapter 或 InstantID。
IPAdapter 是 WebUI 里的一个扩展插件,它可以把参考图的图像特征写入生成过程。简单理解:你上传一张原照片,生成时模型会参考这张照片的人物长相,再把性别、发型、穿搭往女性方向调整。
InstantID 是近年来比较流行的人脸身份保持方案,它侧重于“人脸 ID 特征”的提取和迁移,在写真人像生成上表现很稳定。
对于本项目的实战,我建议优先使用 IPAdapter 做全图参考,再用 InstantID 强化人脸特征。刚开始不追求完美,先用 IPAdapter 跑通流程即可。
4. 完整实战案例
接下来进入实际动手环节。下面我以一个具体案例为例,演示从准备素材到生成同框合影的完整过程。
4.1 素材准备
在项目目录下新建一个input文件夹,并准备两张照片:
me.jpg:自己的正面照,建议半身或胸像,表情自然,光线均匀;bro.jpg:兄弟的正面照,拍摄环境和上一张尽量接近。
如果图片不是正方形,建议先统一裁剪成 1:1 或 3:4,避免生成时比例变形。
4.2 第一步:从男生照片生成女性形象
打开 WebUI 的“图生图(img2img)”页面,上传me.jpg,然后填入提示词。
正向提示词示例:
photorealistic, 1girl, long hair, elegant, soft lighting, delicate facial features, natural skin texture, business casual outfit, upper body, looking at viewer, clean composition, best quality负向提示词示例:
lowres, bad anatomy, bad hands, extra fingers, blurry, jpeg artifacts, watermark, text, deformed face参数建议按照下面的表格设置:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| 采样器(Sampler) | DPM++ 2M Karras | 稳定、质量高 |
| 迭代步数(Steps) | 30 | 太低细节不足,太高收益下降 |
| 提示词引导系数(CFG Scale) | 6.5 | 太高容易过饱和 |
| 重绘幅度(Denoising Strength) | 0.35 到 0.5 | 数值越高变化越大 |
| 图片尺寸(Width/Height) | 768 x 768 | 视显卡而定 |
这里最关键的是Denoising Strength。它决定生成图跟原图的差异程度。
- 数值低于 0.3,基本只是调色和微调,性别变化不明显;
- 数值在 0.35 到 0.5 之间,能较好地改变性别特征,同时保留身份轮廓;
- 数值超过 0.6,人物可能完全“换头”。
建议先固定一个随机种子(Seed),反复调整 Denoising Strength,直到生成结果满意。固定 Seed 是让结果可复现的关键。
4.3 第二步:局部重绘修复面部与发型
第一步生成出来的结果往往存在一些小问题,比如眼睛不对称、头发边缘奇怪、脸部皮肤不自然。这时候用 Inpainting 局部重绘更合适。
在“图生图”页面切换到“局部重绘(Inpaint)”模式,上传上一步生成的图片,用画笔把脸部、头发区域涂白,保留其他区域为黑色。然后设置:
蒙版模糊度(Mask Blur):8 蒙版模式:重绘蒙版内容 重绘幅度:0.4 到 0.5提示词可以保留原来的正向提示词,也可以针对脸部增加细节描述:
detailed face, symmetrical eyes, natural makeup, realistic skin texture局部重绘的意义在于:只修改你指定的区域,背景和身体部分不会被二次破坏。这样就避免了整张图反复重绘导致的一致性问题。
4.4 第三步:生成与兄弟的同框合影
这一步是整个项目最容易翻车的环节。很多人直接把两张照片一起传进去,然后写“两人合影”,生成结果往往是一团混乱。
更稳定的做法是:
方法 A:双人姿态控制 + 局部换脸
- 先分别用 OpenPose 提取
me.jpg和bro.jpg的姿态骨架; - 在“文生图(txt2img)”页面中,把两个 ControlNet 面板都启用,一个传自己的骨架,一个传兄弟的骨架;
- 提示词写:
two people standing side by side, a beautiful woman and a man, upper body, same background, natural interaction, photorealistic, best quality- 这样就能先生成一张“男生 + 女生”同框的底图;
- 最后再把生成图里两个人的脸,用局部重绘分别替换成上面精修过的两张脸。
方法 B:直接合成 + 后期融合
如果 ControlNet 多面板操作不够熟练,也可以先把两张单人图分别生成好,再用 Photoshop、GIMP 或 Python OpenCV 做拼合。拼合时要注意:
- 两图的光线方向尽量一致;
- 两图的分辨率尽量一致;
- 拼接处可以加一点羽化(Feather)过渡。
方法 A 的优势是整体光影、背景更自然;方法 B 的优势是操作简单、可控性强。建议新手先尝试方法 B,等流程熟练后再使用方法 A。
4.5 第四步:调用 API 批量生成
如果只做一张图,在 WebUI 界面里操作就够了。但如果要做批量测试,比如尝试多组参数、多张照片,直接调用 WebUI 提供的 API 会更高效。
WebUI 启动后,默认会在http://127.0.0.1:7860暴露一个 HTTP 接口。下面是一个基于 Python 的调用示例,思路如下:
import base64 import requests import json def image_to_base64(image_path): """读取图片并转换为 base64 字符串""" with open(image_path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8") def save_base64_images(images, prefix="output"): """将返回的 base64 图片列表保存为文件""" for i, img in enumerate(images): data = base64.b64decode(img) file_name = f"{prefix}_{i}.png" with open(file_name, "wb") as f: f.write(data) print(f"已保存: {file_name}") def img2img_generate(init_image, prompt, negative_prompt, mask_image=None): """调用 SD WebUI 的 img2img 接口生成图片""" url = "http://127.0.0.1:7860/sdapi/v1/img2img" payload = { "init_images": [image_to_base64(init_image)], "prompt": prompt, "negative_prompt": negative_prompt, "steps": 30, "cfg_scale": 6.5, "width": 768, "height": 768, "sampler_name": "DPM++ 2M Karras", "denoising_strength": 0.45, "batch_size": 2, "seed": -1, } # 如果有蒙版,则传入蒙版信息,用于局部重绘 if mask_image: payload["mask"] = image_to_base64(mask_image) payload["inpaint_full_res"] = True payload["inpaint_full_res_padding"] = 32 resp = requests.post(url, json=payload, timeout=180) resp.raise_for_status() return resp.json()["images"] if __name__ == "__main__": init = "input/me.jpg" mask = "input/me_mask.png" positive = "photorealistic, 1girl, long hair, elegant, soft lighting, detailed face, best quality" negative = "lowres, bad anatomy, bad hands, blurry, watermark, text" # 不带蒙版:整幅图做性别变换 images = img2img_generate(init, positive, negative) save_base64_images(images, "output/gender_change") # 带蒙版:只对蒙版区域做局部重绘 images = img2img_generate(init, positive, negative, mask_image=mask) save_base64_images(images, "output/inpaint_fix")这里的mask字段是一张和原图同尺寸的 PNG 图片,黑色表示保持不变,白色表示需要重绘的区域。具体如何传蒙版,不同 WebUI 版本会有一点差异,如果你使用的版本不支持mask字段,建议保持 WebUI 到最新版本,或者检查/sdapi/v1/img2img接口说明。
另外一个需要注意的点:如果 WebUI 里安装了多个底模,接口默认使用当前界面选中的模型。如果你希望脚本里固定模型,可以先请求:
GET http://127.0.0.1:7860/sdapi/v1/sd-models拿到模型名称后,再在请求体中通过override_settings字段指定模型,例如:
payload["override_settings"] = { "sd_model_checkpoint": "realistic-based.safetensors" }示例思路如下,具体名称需要根据你实际安装的模型调整。
4.6 运行与验证
脚本运行后,预期会在output目录下生成多张图片。验证时可以关注几个点:
- 人物五官是否自然;
- 是否还能看出原照片的影子;
- 发型、妆容、穿搭是否符合提示词;
- 局部重绘后,重绘区域与周围区域的皮肤质感是否一致。
如果效果不理想,优先调整denoising_strength和seed,不要盲目修改其他参数。
5. 常见问题与排查思路
AI 图像生成项目很难一次成功,遇到问题是常态。下面这些是我在实践中比较容易踩的坑。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 显存不足,程序直接崩溃 | 分辨率过高或模型过大 | 把分辨率降到 512x512,添加--medvram启动参数 |
| 生成的人不像原照片 | 身份特征丢失 | 降低 Denoising Strength,使用 IPAdapter 或 InstantID |
| 女生形象不够女性化 | 底模风格不适合 | 换用写实底模,加入女性风格 LoRA,调整提示词权重 |
| 兄弟同框时两人位置混乱 | ControlNet 姿态解析不准 | 使用更清晰的姿态参考图,提高 ControlNet 权重 |
| 局部重绘区域和周围颜色不一致 | 蒙版边缘太硬 | 增加 Mask Blur,增加inpaint_full_res_padding |
| 图片有大量噪点 | VAE 问题 | 启动参数加--no-half-vae |
| 生成速度非常慢 | 未启用 xformers | 启动参数加--xformers |
| LoRA 不生效 | 没写触发词或权重太低 | 确认 LoRA 触发词,权重提高到 0.8 左右 |
| ControlNet 面板不显示 | 扩展未安装成功 | 检查extensions目录,重启 WebUI 并查看控制台日志 |
如果你遇到类似问题,建议按“先看日志、再改参数”的顺序排查。WebUI 的控制台会输出详细的报错信息,很多时候比猜要快得多。
6. 最佳实践与工程建议
6.1 素材规范
素材质量决定了最终效果的上限。建议遵循以下规范:
- 使用正脸或微侧脸照片,避免夸张表情和遮挡;
- 光线均匀,避免大面积阴影和高光;
- 尽量使用半身或胸像,方便后续裁剪和姿态提取;
- 如果需要多人同框,两个人的拍摄光线和角度尽量接近。
6.2 参数稳定性建议
AI 生成会有一定随机性。项目工程化时,稳定的参数比“碰运气”更重要:
- 每次测试固定一个 Seed,方便对比参数变化;
- 先固定采样器和步数,再调整提示词;
- 每次只改变一个变量,不要同时改多个参数;
- 使用批量生成时,先跑 2 到 4 张看效果,满意后再放大批量。
6.3 版权与使用边界
这一点需要特别强调。虽然技术上可以轻松生成“任何人变成任何人”的图片,但实际使用时必须注意合规边界:
- 生成内容不得用于色情、低俗、恶意抹黑、诈骗等违法违规场景;
- 如果要使用他人肖像,必须获得本人明确授权;
- 基于模型生成的图片,要确认底模和 LoRA 的使用许可,尤其是商业用途;
- 涉及真实人物时,建议在公开平台标注“AI 生成内容”,避免误导他人。
不要把技术能力用在错误的地方。合法合规地使用 AI 图像生成技术,才是长远发展的前提。
6.4 从单张图片走向视频
如果只是单张照片,上面的流程已经完全够用。但如果想进一步做“视频版变身”,可以考虑这些方向:
- 用视频抽帧方式,把每一帧都跑一遍图像生成,再拼接成视频;
- 使用 AnimateDiff 等视频生成模型做运动控制;
- 使用 Roop/ReActor 类换脸插件在视频帧上保持人脸一致性。
不过视频方案的算力需求和参数调整难度会明显上升,建议先把静态图片流程稳定之后再做扩展。
7. 总结与后续学习建议
至此,我们已经完整走通了“男性照片生成女性形象,并与兄弟生成同框合影”的整个流程。核心知识点可以总结为:
- 使用 Stable Diffusion 的图生图能力完成基础性别变换;
- 使用 LoRA 控制生成风格;
- 使用 ControlNet 控制人物姿态和构图;
- 使用 Inpainting 做局部精修;
- 使用 IPAdapter/InstantID 保持身份一致性;
- 使用 WebUI 的 API 接口做批量生成。
如果你只是个人娱乐,直接在 WebUI 界面操作就够了;如果要交给业务方使用,建议把参数整理成配置模板,并用 Python API 封装成服务。
下一步可以继续学习的内容包括:更精细的提示词工程、ComfyUI 节点式工作流、InstantID 的深入使用、多人姿态生成、以及 AI 视频生成。每一个方向都能让这套项目更进一步。
希望这篇文章能帮你把这个有趣的 AI 创意项目真正落地。如果有更好的想法,欢迎在评论区一起交流。