多模态AI开发实战五:图像生成与编辑
多模态 AI 开发实战(五):图像生成与编辑
从文字到图片,让 AI 成为你的画师。本篇实现文生图、图像编辑和批量生成三大核心功能,支持 DALL-E 3 和 CogView 双后端。
前言
前四期我们一直在”看图”: : 让 AI 理解图片内容。从本期开始,我们反向操作: : “画图”:给定文字描述,让 AI 生成对应的图片。这就是文生图(Text-to-Image)技术。
本篇将实现:文生图生成、图像编辑和批量图片生成。
一、文生图技术原理
1.1 技术演进
文生图技术经历了三个阶段:
GAN 时代(2014-2021):生成对抗网络,代表模型 StyleGAN,擅长生成人脸等特定类别图像,但不支持文字控制。
扩散模型时代(2022-2023):Stable Diffusion、DALL-E 2 采用扩散模型,支持通过文字描述控制生成内容,质量大幅提升。
大模型时代(2023-至今):DALL-E 3、Midjourney V6、CogView-3 等模型进一步提高了图文一致性和画面质量,操作门槛大幅降低。
1.2 API 方案对比
| 模型 | 提供方 | 特点 | 价格 |
|---|---|---|---|
| DALL-E 3 | OpenAI | 文本理解强,画面细节丰富 | $0.04/张起 |
| CogView-3 | 智谱AI | 中文支持好,速度快 | 免费额度 |
| Stable Diffusion | 开源 | 完全免费,可本地部署 | 需GPU |
本篇代码同时支持 DALL-E 3 和 CogView-3 Flash 两种后端。
二、ImageGenerator 类设计
2.1 文生图
text_to_image() 方法是核心: : 给定文字描述,生成图片:
class ImageGenerator:
"""图像生成器"""
def __init__(self, provider: str = "openai", api_key: str = None):
self.provider = provider
self.api_key = api_key or os.getenv("OPENAI_API_KEY", "")
def text_to_image(self, prompt: str, size: str = "1024x1024",
output_path: str = "generated.png") -> str:
"""文生图"""
if self.provider == "openai":
from openai import OpenAI
client = OpenAI(api_key=self.api_key)
response = client.images.generate(
model="dall-e-3",
prompt=prompt,
size=size,
quality="standard",
n=1
)
image_url = response.data[0].url
img_data = requests.get(image_url).content
with open(output_path, "wb") as f:
f.write(img_data)
return output_path
elif self.provider == "zhipu":
from openai import OpenAI
client = OpenAI(
api_key=self.api_key or os.getenv("ZHIPU_API_KEY", ""),
base_url="https://open.bigmodel.cn/api/paas/v4"
)
response = client.images.generate(
model="cogview-3-flash",
prompt=prompt,
size=size
)
image_url = response.data[0].url
img_data = requests.get(image_url).content
with open(output_path, "wb") as f:
f.write(img_data)
return output_path
使用示例:
from image_generation import ImageGenerator
# 使用 DALL-E 3
gen = ImageGenerator(provider="openai")
path = gen.text_to_image("一只穿着宇航服的猫在月球上漫步,星空背景,科幻风格")
print(f"图片已保存到: {path}")
# 使用 CogView(中文优化)
gen = ImageGenerator(provider="zhipu")
path = gen.text_to_image("水墨画风格的江南水乡,小桥流水人家")
print(f"图片已保存到: {path}")
2.2 图像编辑
edit_image() 方法实现了”描述+修改”的图像编辑流程:
def edit_image(self, image_path: str, prompt: str,
output_path: str = "edited.png") -> str:
"""图像编辑(基于多模态模型描述+重新生成)"""
from openai import OpenAI
client = OpenAI(api_key=self.api_key)
# 先描述原图
base64_image = base64.b64encode(
open(image_path, "rb").read()
).decode("utf-8")
desc_response = client.chat.completions.create(
model="gpt-4-vision-preview",
messages=[{"role": "user", "content": [
{"type": "text", "text": f"详细描述这张图片的构图和内容,然后按以下要求修改:{prompt}。直接输出修改后的完整画面描述,不要解释。"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}
]}]
)
new_prompt = desc_response.choices[0].message.content
# 重新生成
return self.text_to_image(new_prompt, output_path=output_path)
使用示例:
gen = ImageGenerator(provider="openai")
result = gen.edit_image("cat.jpg", "把背景换成月球表面,增加星空")
print(f"编辑后图片: {result}")
result = gen.edit_image("portrait.jpg", "将风格改为油画风格")
print(f"风格迁移: {result}")
2.3 批量生成
batch_generate() 方法批量生成图片:
def batch_generate(self, prompts: list,
output_dir: str = "output") -> list:
"""批量生成图片"""
os.makedirs(output_dir, exist_ok=True)
results = []
for i, prompt in enumerate(prompts):
output = os.path.join(output_dir, f"image_{i+1}.png")
try:
self.text_to_image(prompt, output_path=output)
results.append({"prompt": prompt, "path": output, "status": "success"})
except Exception as e:
results.append({"prompt": prompt, "path": None, "status": f"failed: {e}"})
return results
三、Prompt 技巧
文生图的质量很大程度上取决于提示词的写法。好的提示词应包含:主体描述、场景/背景、风格/画法、色彩/光线、视角/构图。
# 差的提示词
gen.text_to_image("一只猫")
# 好的提示词
gen.text_to_image("一只橘色的英国短毛猫坐在窗台上,窗外是下雨的伦敦街道,"
"水彩画风格,暖色调光线,侧视角构图,细节丰富")
四、完整代码
git clone https://gitee.com/genesisesNoun/multimodal-ai-tutorial.git
cd multimodal-ai-tutorial/05-image-generation
pip install openai pillow requests
python image_generation.py
五、下期预告
第六期:音频处理与语音识别 – Whisper 语音转文字 – 语音合成实战 – 音频内容分析
CV技术笔记 – 多模态 AI 开发实战
夜雨聆风