阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码

1. 问题

阿里云PAI平台官方Stable Diffusion(以下简称sd)镜像EAS服务上传PNG图片调用/sdapi/v1/png-info接口返回乱码。

镜像版本:eas-registry-vpc.cn-shanghai.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:4.2

./webui.sh --listen --port 8000 --skip-version-check --no-hashing --skip-prepare-environment --api-log --time-log --nowebui --xformers --enable-extensions stable-diffusion-webui-wd14-tagger multidiffusion-upscaler-for-automatic1111 adetailer sd-webui-3d-open-pose-editor  --embeddings-dir /code/stable-diffusion-webui/data-oss-api/embeddings

请求异常返回截图:

image.png

测试图片用例:

📎客户图片.png

2. 系列文档传送门

https://developer.aliyun.com/article/1574263

3. 环境搭建与问题复现

3.1. webui测试用例图片生成

同是sd问题,我们通过sd的webui界面配合中英文的promt和相关参数来生成测试用例的png图片尝试调用API

promt:a cute dog

Negative prompt: 不要屋内的景色

其余参数保持默认(见下图)

image.png

生成测试用例PNG图片:

📎cute_dog.png

3.2. webui png图片信息测试

image.png

3.3. api请求本地测试与问题复现

3.3.1. 测试代码

这里用相同的镜像拉了一个EAS的服务,测试代码由于涉及多个path的请求所以自己通过requests构建了自定义http请求,相关代码说明见注释。

import json
import requests
import io
import base64
from pprint import pprint
from PIL import Image, PngImagePlugin
from PIL.PngImagePlugin import PngInfo
# eas服务请求的endpoint
url = "http://1623027246845796.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/sunyf_sd_test02.sunyf_sd_test02_9245177a"
if __name__ == '__main__':
    # 打开测试用例图片,二进制读
    with open('/Users/adamsun/Downloads/cute_dog.png', 'rb') as image_file:
        # 采用base64编码
        encoded_string = base64.b64encode(image_file.read())
    # 根据编码后的string构建请求的png信息
    png_payload = {
        "image": "data:image/png;base64," + encoded_string.decode('utf-8')
    }
    # headers中包含认证的token
    headers = {"Authorization": 'xxx=='}
    # api请求
    response2 = requests.post(url=f'{url}/sdapi/v1/png-info'
                              ,json=png_payload
                              ,headers=headers
                              )
    pprint(response2.json())

3.3.2. 本地测试用例(正常)

image.png

3.3.3. 客户部分代码节选

可以看到客户代码中对于http请求的header以及entity以及png图像的都通过charset的方式指定了utf-8(与eas底层所在系统保持一致)

(image客户采用的是

data:image/png;base64,<编码图像数据>

的方式进行数据传输和接口请求)

注:base64编码后decode的charset也是utf-8

image.png

3.3.4. 本地测试客户图例(乱码)

image.png

4. 源码浅析

通过登录eas的容器我们可以找到当前eas内置的sd服务4.2版本的Dockerfile

image.png

对应源码地址:https://gitee.com/stable_diffusion/stable-diffusion-webui/tree/v1.6.0/。我们通过git clone的方式将源码下载到本地。

书接上文,api的请求都是通过fastapi做的封装,如下是入口类

from modules.api.api import Api

通过调用的api path我们可以看到

self.add_api_route("/sdapi/v1/png-info", self.pnginfoapi, methods=["POST"], response_model=models.PNGInfoResponse)

/sdapi/v1/png-info对应的handler方法是pnginfoapi,对应的返回体是models.PNGInfoResponse

image.png

对应方法pnginfoapi中,比较关键的是如下三个方法的调用:

  1. decode_base64_to_image(req.image.strip())
  2. images.read_info_from_image(image)
  3. infotext_utils.parse_generation_parameters(geninfo)

image.png

decode_base64_to_image方法的输入是api请求的request对象,将json string中的image作为入参。根据入参的样式分成两部分:

  1. https和http开头的连接会通过请求的方式获取图片并转换成BytesIO
  2. data:image/开头的会取data:image/png;base64,<编码图像数据>后面编码后的数据转换成BytesIO

随后通过sd项目中实现的./stable-diffusion-webui/modules/images.py 的modules.images.read方法封装成pillow库的Image.Image对象

image.png

images.read_info_from_image(image)方法对读入的Image对象做信息提取

items取的就是Image对象的info属性

geninfo取info属性字段中parameters的信息

后续代码还涉及了EXIF、GIF、pop掉忽略的kv以及NovelAI类型图像的信息处理

image.png

infotext_utils.parse_generation_parameters(geninfo)方法以前面提取出的图像中的info作为输入,返回的是api返回体中parameters的部分,这里主要是解析与图像生成相关参数的部分,包含promt、negative prompt、steps、sampler等,没有字符集相关的特殊处理。

return models.PNGInfoResponse(info=geninfo, items=items, parameters=params)

后续pnginfoapi方法返回的response继承自BaseModel的基础数据类,提供数据验证以及序列化支持,charset也都是utf-8。

可以判断的是从接收到请求到api接口处理完成对于png图片info均没有不合预期的编码行为。

5. 本地调试与问题原因

请求客户端、服务端处理逻辑以及服务端所在机器默认charset均没有异常的情况下尝试本地调试。

根据源码读取请求图片数据以及转换成Image对象的逻辑,本地直接采用

Image.open

的方法读取客户提供的图片,根据read_info_from_image的逻辑来看图片本身的info信息中就已经含有乱码,与客户侧验证后确认也确实仅有这一张第三方图片解析乱码异常,猜测应该是图片保存时环境或其他因素存在编码异常,非PAI平台侧问题

image.png

相关文章
|
1月前
|
机器学习/深度学习 测试技术
阿里云入选Gartner数据科学和机器学习平台挑战者象限
Gartner® 正式发布了《数据科学与机器学习平台魔力象限》报告(Magic Quadrant™ for Data Science and Machine Learning Platforms),阿里云成为唯一一家入选该报告的中国厂商,被评为“挑战者”(Challengers)。
|
6天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
17 2
|
9天前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
1月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
53 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
阿里云人工智能平台 PAI 的多篇论文在 EMNLP2024 上入选。论文成果是阿里云与华南理工大学金连文教授团队、复旦大学王鹏教授团队共同研发。EMNLP 是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究,尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、对话系统、机器翻译等自然语言处理领域的核心创新,在学术和工业界都有巨大的影响力。此次入选标志着阿里云人工智能平台 PAI 在自然语言处理和多模态算法能力方面研究获得了学术界认可。
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
63 2
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
19 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
25天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
1月前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
55 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练