创意广告有可能通过生成式人工智能(GenAI)而得到革命性的改变。现在,您可以通过重新训练GenAI模型并向模型提供一些输入(例如描述场景和要生成的物体的句子),来创建各种新颖的图像,例如产品照片。从2022年开始,随着一类名为潜在扩散模型的基础模型(FMs)的爆发,如稳定扩散、中途旅程和Dall-E-2,这种技术已经显示出有希望的结果。然而,要在生产中使用这些模型,生成过程需要不断改进以产生一致的输出。这通常意味着创建大量产品样本图像和巧妙的提示工程,这使得在规模上进行任务变得困难。
在这篇文章中,我们探讨了如何利用这种变革性技术在大规模处理图像目录时生成引人注目和创新的广告。通过利用GenAI的强大功能,特别是通过修复技术,我们可以无缝地创建图像背景,从而产生视觉上令人惊叹和引人入胜的内容,并减少不需要的图像伪像(称为模型幻觉)。我们还深入探讨了通过使用Amazon SageMaker端点来实现这种技术的实际实施,这使得驱动创意过程的GenAI模型的高效部署成为可能。
我们将修复技术作为基于GenAI的图像生成的关键技术,因为它提供了一个强大的解决方案来替换图像中缺失的元素。然而,这也带来了一些挑战。例如,对图像中物体位置的精确控制可能会受限,导致潜在的问题,如图像伪像、悬浮物体或未混合的边界,如下面的示例图像所示。
为了克服这个问题,在本文中,我们提出通过使用最少的监督来生成大量逼真的图像,以在创意自由和高效生产之间取得平衡。为了将所提出的解决方案扩展到生产,并简化在AWS环境中部署AI模型的过程,我们使用SageMaker端点进行演示。
具体而言,我们建议将修复过程拆分为一组图层,每个图层可能具有不同的提示集。该过程可以总结为以下步骤:
- 首先,我们提示一个常规场景(例如,“后面有树的公园”),并将物体随机放置在该背景上。
- 接下来,在物体的下中部添加一个图层,提示物体所在的位置(例如,“在草地上野餐,或者在木桌上”)。
- 最后,在物体的上中部使用与背景相同的提示添加一个类似背景的图层。
这种过程的好处在于提高了物体的真实感,因为它在与人类期望相匹配的背景环境中具有更好的缩放和定位。下图显示了所提出解决方案的步骤。
解决方案概述
为了完成任务,考虑以下数据流程:
- 在SageMaker端点上托管Segment Anything Model(SAM)和Stable Diffusion Inpainting模型。
- 使用Stable Diffusion模型使用背景提示来创建一个生成的背景图像。
- 通过SAM传递一个基本产品图像以生成一个遮罩。遮罩的反向称为反遮罩。
- 使用生成的背景图像、遮罩以及前景提示和负面提示作为输入,通过Stable Diffusion Inpainting模型生成生成的中间背景图像。
- 类似地,使用生成的背景图像、反遮罩以及前景提示和负面提示作为输入,通过Stable Diffusion Inpainting模型生成生成的中间前景图像。
- 通过将生成的中间前景图像和生成的中间背景图像组合,得到生成的产品图像的最终输出。
先决条件
我们已经开发了一个 AWS CloudFormation 模板,用于创建用于部署端点和运行推断的 SageMaker 笔记本。
您需要具有 AWS 身份和访问管理 (IAM) 角色的 AWS 帐户,以便访问以下内容:
- AWS CloudFormation
- SageMaker
- 尽管 SageMaker 端点提供了运行 ML 模型的实例,但为了运行生成式 AI 模型等重负载工作负载,我们使用启用 GPU 的 SageMaker 端点。有关定价的详细信息,请参阅 Amazon SageMaker 定价。
- 我们使用 NVIDIA A10G 启用的实例
ml.g5.2xlarge
来托管模型。
- Amazon Simple Storage Service (Amazon S3)
有关详细信息,请查阅 GitHub 存储库和 CloudFormation 模板。
掩盖产品的感兴趣区域
一般来说,我们需要提供一个我们想要放置的对象的图像和一个描绘对象轮廓的掩码。可以使用 Amazon SageMaker Ground Truth 等工具来完成此操作。或者,我们可以使用 Segment Anything Models (SAM) 等 AI 工具自动分割对象,假设对象位于图像的中心。
使用 SAM 生成掩码
使用 SAM,一种先进的生成式 AI 技术,我们可以轻松生成图像中各种对象的高质量掩码。SAM 使用在大量数据集上进行训练的深度学习模型来准确识别和分割感兴趣的对象,提供精确的边界和像素级掩码。这种突破性的技术通过自动化耗时和劳动密集型的手动创建掩码任务,革新了图像处理工作流程。通过 SAM,企业和个人现在可以快速生成用于对象识别、图像编辑、计算机视觉任务等的掩码,为视觉分析和操作打开了无限的可能性。
在 SageMaker 端点上托管 SAM 模型
我们使用笔记本 1_HostGenAIModels.ipynb
来创建 SageMaker 端点并托管 SAM 模型。
我们使用 inference_sam.py
中的推断代码,并将其打包为一个 code.tar.gz 文件
,用于创建 SageMaker 端点。该代码下载 SAM 模型,将其托管在端点上,并提供一个入口点来运行推断并生成输出:
SAM_ENDPOINT_NAME = 'sam-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f'))
prefix_sam = "SAM/demo-custom-endpoint"
model_data_sam = s3.S3Uploader.upload("code.tar.gz", f's3://{bucket}/{prefix_sam}')
model_sam = PyTorchModel(entry_point='inference_sam.py',
model_data=model_data_sam,
framework_version='1.12',
py_version='py38',
role=role,
env={'TS_MAX_RESPONSE_SIZE':'2000000000', 'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '300'},
sagemaker_session=sess,
name='model-'+SAM_ENDPOINT_NAME)
predictor_sam = model_sam.deploy(initial_instance_count=1,
instance_type=INSTANCE_TYPE,
deserializers=JSONDeserializer(),
endpoint_name=SAM_ENDPOINT_NAME)
调用 SAM 模型并生成掩码
以下代码是 2_GenerateInPaintingImages.ipynb
笔记本的一部分,用于运行端点并生成结果:
raw_image = Image.open("images/speaker.png").convert("RGB")
predictor_sam = PyTorchPredictor(endpoint_name=SAM_ENDPOINT_NAME,
deserializer=JSONDeserializer())
output_array = predictor_sam.predict(raw_image, initial_args={'Accept': 'application/json'})
mask_image = Image.fromarray(np.array(output_array).astype(np.uint8))
# 使用 PIL Image 保存掩码图像
mask_image.save('images/speaker_mask.png')
下图显示了从产品图像中获得的结果掩码。
使用修复绘画技术创建生成图像
通过将修复绘画的强大功能与由SAM生成的掩码和用户的提示结合起来,我们可以创建出卓越的生成图像。修复绘画利用先进的生成型人工智能技术,智能地填充图像中缺失或掩盖的区域,并将其与周围内容无缝地融合。凭借SAM生成的掩码作为指导以及用户的提示作为创意输入,修复绘画算法可以生成视觉上连贯、背景相关的内容,从而产生令人惊叹和个性化的图像。这种技术的融合开启了无限的创作可能性,使用户能够将他们的想象变成生动、引人入胜的视觉叙事。
在SageMaker端点上托管稳定的扩散修复模型
与2.1类似,我们使用笔记本1_HostGenAIModels.ipynb
来创建SageMaker端点并托管稳定的扩散修复模型。
我们使用inference_inpainting.py
中的推理代码,并将其打包成code.tar.gz
文件,用于创建SageMaker端点。该代码下载稳定的扩散修复模型,将其托管在一个端点上,并提供一个入口点来运行推理并生成输出:
INPAINTING_ENDPOINT_NAME = 'inpainting-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f'))
prefix_inpainting = "InPainting/demo-custom-endpoint"
model_data_inpainting = s3.S3Uploader.upload("code.tar.gz", f"s3://{bucket}/{prefix_inpainting}")
model_inpainting = PyTorchModel(entry_point='inference_inpainting.py',
model_data=model_data_inpainting,
framework_version='1.12',
py_version='py38',
role=role,
env={'TS_MAX_RESPONSE_SIZE':'2000000000', 'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '300'},
sagemaker_session=sess,
name='model-'+INPAINTING_ENDPOINT_NAME)
predictor_inpainting = model_inpainting.deploy(initial_instance_count=1,
instance_type=INSTANCE_TYPE,
serializer=JSONSerializer(),
deserializers=JSONDeserializer(),
endpoint_name=INPAINTING_ENDPOINT_NAME,
volume_size=128)
调用稳定的扩散修复模型并生成新图像
与调用SAM模型的步骤类似,我们使用笔记本2_GenerateInPaintingImages.ipynb
来在端点上运行推理并生成结果:
raw_image = Image.open("images/speaker.png").convert("RGB")
mask_image = Image.open('images/speaker_mask.png').convert('RGB')
prompt_fr = "table and chair with books"
prompt_bg = "window and couch, table"
negative_prompt = "longbody, lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, letters"
inputs = {}
inputs["image"] = np.array(raw_image)
inputs["mask"] = np.array(mask_image)
inputs["prompt_fr"] = prompt_fr
inputs["prompt_bg"] = prompt_bg
inputs["negative_prompt"] = negative_prompt
predictor_inpainting = PyTorchPredictor(endpoint_name=INPAINTING_ENDPOINT_NAME,
serializer=JSONSerializer(),
deserializer=JSONDeserializer())
output_array = predictor_inpainting.predict(inputs, initial_args={'Accept': 'application/json'})
gai_image = Image.fromarray(np.array(output_array[0]).astype(np.uint8))
gai_background = Image.fromarray(np.array(output_array[1]).astype(np.uint8))
gai_mask = Image.fromarray(np.array(output_array[2]).astype(np.uint8))
post_image = Image.fromarray(np.array(output_array[3]).astype(np.uint8))
# 使用PIL Image保存生成的图像
post_image.save('images/speaker_generated.png')
下图显示了经过修饰的掩码、生成的背景、生成的产品图像和后处理图像。
生成的产品图像使用以下提示:
- 背景生成 – “椅子,沙发,窗户,室内”
- 修补 – “除书之外”
清理
在本文中,我们使用了两个启用GPU的SageMaker端点,这在成本中占据了大部分。当端点不使用时,应关闭它们以避免额外的费用。我们提供了一个笔记本3_CleanUp.ipynb
,可以帮助清理端点。我们还使用SageMaker笔记本来托管模型和运行推断。因此,如果不使用笔记本实例,停止它是一个好的做法。
结论
生成式AI模型通常是大规模的机器学习模型,需要特定的资源才能高效运行。在本文中,我们使用广告用例演示了SageMaker端点如何为托管生成式AI模型(如文本到图像基础模型Stable Diffusion)提供可扩展和托管的环境。我们演示了如何根据需要托管和运行两个模型,并且还可以从单个端点托管多个模型。这消除了与基础架构供应、可扩展性和监控相关的复杂性,使组织能够专注于部署其模型并提供预测以解决其业务挑战。借助SageMaker端点,组织可以在统一的基础架构中高效部署和管理多个模型,实现最佳资源利用率并减少运营开销。
详细的代码可在GitHub上找到。该代码演示了使用AWS CloudFormation和AWS Cloud Development Kit(AWS CDK)自动化创建SageMaker笔记本和其他所需资源的过程。