今天介绍亚马逊云科技推出的国际前沿人工智能模型平台Amazon Bedrock上的Stability Diffusion模型开发生成式AI图像生成应用!本系列共有3篇,在上篇中我们学习了如何在亚马逊云科技控制台上体验该模型的每个特色功能,如文生图、图生图、图像修复等。中篇我们介绍了如何通过API代码实现以上功能。
接下来在下篇中我将带大家沉浸式实操,通过Stability Difussion模型API和Streamlit网页前端框架,沉浸式开发一个属于自己的图片生成式AI应用。大家可以通过本博客中的实操项目自己学习AI技能,并应用到日常工作中。
方案所需基础知识
什么是Amazon Bedrock
Amazon Bedrock 是一项完全托管的服务,通过统一的 API 提供来自 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI 和 Amazon 等领先 AI 公司的高性能基础模型(FMs),同时提供广泛的功能,让开发者能够在确保安全、隐私和负责任 AI 的前提下构建生成式 AI 应用。使用 Amazon Bedrock,开发者们可以:
轻松地测试、评估开发者的用例在不同基础模型下的表现;
使用微调和检索增强生成(RAG)等技术定制化开发应用程序; 构建可以使用开发者的企业系统和数据源自动执行任务的智能 Agents。 由于 Amazon Bedrock 是 Serverless 的服务,开发者无需管理任何基础设施,并且可以使用开发者已经熟悉其它的亚马逊云科技服务安全地集成和部署生成式 AI 功能到开发者的应用中。什么是 Stability AI 模型?
Stability AI 是一家致力于开发和提供生成式人工智能模型的公司,其模型被广泛应用于图像生成领域。Stability AI 的模型中最著名的莫非是 Stable Diffusion 生成模型,能够根据用户输入的描述,自动生成高度逼真的图像和文本。这些模型以其卓越的生成能力和灵活性,在应用开发中管饭应用和认可。
本实践包括的内容
1. 学习Streamlit前端框架以及常用API、服务器启动命令等
2. 利用Streamlit前端框架和Stability Diffusion AI模型开发生成式AI图像生成网页应用。
功能实践具体步骤
模型参数
我们可以在访问Stability Diffusion API时配置如下参数,调整图片生成提示词、风格等配置生成多样化图片:
参数 解释 height 生成图像的高度 width 生成图像的宽度 text_prompts 数组形式的文本提示 cfg_scale 控制扩散过程对提示文本的遵循程度 clip_guidance_preset 采样的预设模式 sampler 用于选择扩散过程使用的算法 seed 随机噪声种子 steps 扩散过程的运行次数 style_preset 引导图像模型走向特定风格的预设 extras 传递给引擎的其他实验性功能接下来我们定义在我们的图像生成网页开发过程中会用到的Stable Diffusion模型参数:
DEBUG = os.getenv("DEBUG", False)
DEFAULT_SEED = os.getenv("DEFAULT_SEED", 12345)
MAX_SEED = 4294967295
MODEL_ID = "stability.stable-diffusion-xl-v1"
NEGATIVE_PROMPTS = [
"bad anatomy", "distorted", "blurry",
"pixelated", "dull", "unclear",
"poorly rendered",
"poorly Rendered face",
"poorly drawn face",
"poor facial details",
"poorly drawn hands",
"poorly rendered hands",
"low resolution",
"Images cut out at the top, left, right, bottom.",
"bad composition",
"mutated body parts",
"blurry image",
"disfigured",
"oversaturated",
"bad anatomy",
"deformed body features",
]
STYLES_MAP = {
"电影感(Cinematic)": "cinematic",
"摄影(Photographic)": "photographic",
"漫画(Comic Book)": "comic-book",
"折纸(Origami)": "origami",
"模拟胶片(Analog Film)": "analog-film",
"幻想艺术(Fantasy Art)": "fantasy-art",
"线条艺术(Line Art)": "line-art",
"霓虹朋克粉(Neon Punk)": "neon-punk",
"三维模型(3D Model)": "3d-model",
"数码艺术(Digital Art)": "digital-art",
"增强(Enhance)": "enhance",
"像素艺术(Pixel Art)": "pixel-art",
"瓷砖纹理(Tile Texture)": "tile-texture",
"无(None)": "None",
}
图片生成API调用函数代码段
1.编写调用 API 的等函数
bedrock_runtime = boto3.client('bedrock-runtime')
@st.cache_data(show_spinner=False)
def gen_img_from_bedrock(prompt, style, seed=DEFAULT_SEED,width=512,height=512):
body = json.dumps({
"text_prompts": [
{
"text": prompt
}
],
"cfg_scale": 10,
"seed": seed,
"steps": 50,
"style_preset": style,
"negative_prompts": NEGATIVE_PROMPTS,
"width":width,
"height":height
})
accept = "application/json"
contentType = "application/json"
response = bedrock_runtime.invoke_model(
body=body, modelId=MODEL_ID, accept=accept, contentType=contentType
)
response_body = json.loads(response.get("body").read())
image_bytes = response_body.get("artifacts")[0].get("base64")
image_data = base64.b64decode(image_bytes.encode())
st.session_state['image_data'] = image_data
return image_data
其他Streamlit应用相关函数,主要用于管理用户界面组件(滑块、图片上传等)
def update_slider():
st.session_state.slider = st.session_state.numeric
def update_numin():
st.session_state.numeric = st.session_state.slider
@st.cache_data
def get_image(image_data):
return Image.open(io.BytesIO(image_data))
2. 主函数界面部分
if __name__ == '__main__':
# Create the page title
st.set_page_config(
page_title='Amazon Bedrock Stable Diffusion', page_icon='./bedrock.png')
st.title('Stable Diffusion Image Generator with Amazon Bedrock')
# Create a sidebar with text examples
with st.sidebar:
# Selectbox
style_key = st.sidebar.selectbox(
"Choose image style",
STYLES_MAP.keys(),
index=0)
seed_input = st.sidebar.number_input(
"Seed", value=DEFAULT_SEED, placeholder=DEFAULT_SEED, key="numeric", on_change=update_slider)
seed_slider = st.sidebar.slider(
'Seed Slider', min_value=0, value=seed_input, max_value=MAX_SEED, step=1, key="slider",
on_change=update_numin, label_visibility="hidden")
seed = seed_input | seed_slider
# 图片宽度
width = st.sidebar.slider(
'Width', min_value=256, value=512, max_value=1024, step=64, key="width_slider")
# 图片高度
height = st.sidebar.slider(
'Height', min_value=256, value=512, max_value=1024, step=64, key="height_slider")
3.主函数调用Stable Diffusion API 部分
prompt = st.text_input('Input your prompt')
if not prompt:
st.warning("Please input a prompt")
# Block the image generation if there is no input prompt
st.stop()
if st.button("Generate", type="primary"):
if len(prompt) > 0:
st.markdown(f"""
This will show an image using **Stable Diffusion** with your desired prompt entered : {prompt}
""")
# Create a spinner to show the image is being generated
with st.spinner('Generating image based on prompt'):
if not DEBUG:
style = STYLES_MAP[style_key]
print("Generate image with Style:{} with Seed:{} and Width:{} and Height:{} and Prompt: {}".format(
style_key, seed, width , height , prompt))
# Send request to Bedrock
image_data = gen_img_from_bedrock(
prompt=prompt, style=style, seed=seed,width=width,height=height)
st.success('Generated stable diffusion image')
if st.session_state.get("image_data", None):
image = get_image(st.session_state.image_data)
st.image(image)
if DEBUG:
st.write(st.session_state)
4. 启动streamlit服务器,加载网页应用
streamlit run intro_streaming.py --server.port 8080
网页应用预览
5. 打开运行命令返回的"External URL"就可以进入到我们开发的网页应用前端了
6. 若想关停streamlit前端应用,在键盘点击Ctrl+C
以上就是沉浸式使用Amazon Bedrock上的Stability AI模型开发图像生成AI网页应用的下篇内容。欢迎大家关注小李哥的亚马逊云科技AI服务深入调研系列,未来获取更多国际前沿的AWS云开发/云架构方案。
总结
**总结文章:使用Amazon Bedrock和Stability Diffusion开发AI图像生成应用**本文介绍了如何利用亚马逊云科技推出的Amazon Bedrock平台上的Stability Diffusion模型,以及Streamlit前端框架,开发一个生成式AI图像生成网页应用。文章分为三篇系列,此篇为下篇,详细步骤包括:
### 1. **基础知识介绍**
- **Amazon Bedrock**:一项完全托管的服务,通过统一API提供来自各大AI公司的高性能基础模型,帮助开发者在安全、隐私与负责任的前提下构建生成式AI应用,无需管理基础设施,且便于集成和部署至其他亚马逊云服务中。
- **Stability AI模型**:专注于生成式人工智能模型,Stable Diffusion模型尤其著名,能通过文本提示生成高质量图像。
### 2. **实践内容包括**
- 学习Streamlit前端框架及其API、服务器启动命令等。
- 利用Streamlit和Stability Diffusion API开发网页应用,实现功能包括文生图、風格选择及图像配置调整等。
### 3. **具体功能实现步骤**
#### a. **模型参数配置**
- 使用不同参数(如宽度、高度、文本提示等)来调整和细化生成的图像。
#### b. **API调用函数**
- 编写调用Stability Diffusion API的函数,并通过Streamlit界面输入提示和风格,生成图像数据并显示。
#### c. **用户界面管理**
- 使用Streamlit界面组件(如滑块、文本输入框、按钮等)获取用户的输入,并通过前端显示生成的图像或警告信息。
### 4. **实现代码简述**
- 初始化设置,包括环境变量读取和模型选择。
- 通过`boto3`客户端调用Amazon Bedrock Runtime API,并处理JSON请求和响应来生成图像数据。
- 使用Streamlit框架渲染页面元素(标题、侧边栏选项、图片显示区等)。
- 实现滑块和输入框来控制图像属性和种子值等。
### 5. **运行和测试**
- 使用`streamlit run`命令运行应用,并打开返回的外部URL地址以查看和操作应用。
- 支持多种图像风格的预设选择及图像的实时生成和预览。
### 6. **结束与展望未来**
- 下篇章内容到此结束,未来将继续推出一系列关于AWS云开发/云架构的前沿方案。
通过本次实操项目,读者不仅能学习到AI图像生成的实战技能,还能将这些技能应用于日常工作中的创新和项目中,助力技术研发和业务增长。