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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 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

相关文章
|
2月前
|
机器学习/深度学习 测试技术
阿里云入选Gartner数据科学和机器学习平台挑战者象限
Gartner® 正式发布了《数据科学与机器学习平台魔力象限》报告(Magic Quadrant™ for Data Science and Machine Learning Platforms),阿里云成为唯一一家入选该报告的中国厂商,被评为“挑战者”(Challengers)。
|
5天前
|
开发者 Python
阿里云PAI DSW快速部署服务
在使用阿里云DSW实例进行开发的时候,可能需要快速部署服务测试应用效果。DSW实例目前已经支持通过自定义服务访问配置功能,对外提供服务访问能力,您在应用开发过程中无需分享整个DSW实例,即可将服务分享给协作开发者进行测试和验证。
47 23
|
26天前
|
机器学习/深度学习 人工智能 算法
国内首家! 阿里云人工智能平台 PAI 通过 ITU 国际标准测评
阿里云人工智能平台 PAI 顺利通过中国信通院组织的 ITU-T AICP-GA国际标准和《智算工程平台能力要求》国内标准一致性测评,成为国内首家通过该标准的企业。阿里云人工智能平台 PAI 参与完成了智算安全、AI 能力中心、数据工程、模型开发训练、模型推理部署等全部八个能力域,共计220余个用例的测试,并100%通过测试要求,获得了 ITU 国际标准和国内可信云标准评估通过双证书。
国内首家! 阿里云人工智能平台 PAI 通过 ITU 国际标准测评
|
25天前
|
机器学习/深度学习 人工智能 监控
AutoTrain:Hugging Face 开源的无代码模型训练平台
AutoTrain 是 Hugging Face 推出的开源无代码模型训练平台,旨在简化最先进模型的训练过程。用户无需编写代码,只需上传数据即可创建、微调和部署自己的 AI 模型。AutoTrain 支持多种机器学习任务,并提供自动化最佳实践,包括超参数调整、模型验证和分布式训练。
100 4
AutoTrain:Hugging Face 开源的无代码模型训练平台
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
【NeurIPS'24】阿里云 PAI 团队论文被收录为 Spotlight,并完成主题演讲分享
12月10日,NeurIPS 2024在温哥华开幕,阿里云PAI团队论文《PertEval: Unveiling Real Knowledge Capacity of LLMs with Knowledge-Invariant Perturbations》入选Spotlight,PAI团队还进行了“可信AI的技术解读与最佳实践”主题演讲,展示AI工程化平台产品能力。
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
47 2
|
1月前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
2月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
137 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
阿里云人工智能平台 PAI 的多篇论文在 EMNLP2024 上入选。论文成果是阿里云与华南理工大学金连文教授团队、复旦大学王鹏教授团队共同研发。EMNLP 是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究,尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、对话系统、机器翻译等自然语言处理领域的核心创新,在学术和工业界都有巨大的影响力。此次入选标志着阿里云人工智能平台 PAI 在自然语言处理和多模态算法能力方面研究获得了学术界认可。
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
101 2