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

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

相关文章
|
4月前
|
机器学习/深度学习 人工智能 算法
PaperCoder:一种利用大型语言模型自动生成机器学习论文代码的框架
PaperCoder是一种基于多智能体LLM框架的工具,可自动将机器学习研究论文转化为代码库。它通过规划、分析和生成三个阶段,系统性地实现从论文到代码的转化,解决当前研究中代码缺失导致的可复现性问题。实验表明,PaperCoder在自动生成高质量代码方面显著优于基线方法,并获得专家高度认可。这一工具降低了验证研究成果的门槛,推动科研透明与高效。
359 19
PaperCoder:一种利用大型语言模型自动生成机器学习论文代码的框架
|
4月前
|
PyTorch 调度 算法框架/工具
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
DLC任务Pytorch launch_agent Socket Timeout问题源码分析与解决方案
220 18
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
|
4月前
|
数据可视化 Rust 机器学习/深度学习
mlop.ai 无脑使用教程 (机器学习工具 WandB/ClearML 的首个国区开源平替)
mlop.ai 是首个为国区用户优化的机器学习工具,全栈免费开源,是主流付费解决方案 ClearML/WandB 的开源平替。常规实验追踪的工具经常大幅人为降速,mlop因为底层为Rust代码,能轻松支持高频数据写入。如需更多开发者帮助或企业支持,敬请联系cn@mlop.ai
263 12
mlop.ai 无脑使用教程 (机器学习工具 WandB/ClearML 的首个国区开源平替)
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
阿里云人工智能平台 PAI 开源 EasyDistill 框架助力大语言模型轻松瘦身
本文介绍了阿里云人工智能平台 PAI 推出的开源工具包 EasyDistill。随着大语言模型的复杂性和规模增长,它们面临计算需求和训练成本的障碍。知识蒸馏旨在不显著降低性能的前提下,将大模型转化为更小、更高效的版本以降低训练和推理成本。EasyDistill 框架简化了知识蒸馏过程,其具备多种功能模块,包括数据合成、基础和进阶蒸馏训练。通过数据合成,丰富训练集的多样性;基础和进阶蒸馏训练则涵盖黑盒和白盒知识转移策略、强化学习及偏好优化,从而提升小模型的性能。
|
4月前
|
缓存 并行计算 测试技术
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
1062 12
|
5月前
|
人工智能 自然语言处理 运维
Qwen3 全尺寸模型支持通过阿里云PAI-ModelGallery 一键部署
Qwen3 是 Qwen 系列最新一代的大语言模型,提供了一系列密集(Dense)和混合专家(MOE)模型。目前,PAI 已经支持 Qwen3 全系列模型一键部署,用户可以通过 PAI-Model Gallery 快速开箱!
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
云上一键部署通义千问 QwQ-32B 模型,阿里云 PAI 最佳实践
3月6日阿里云发布并开源了全新推理模型通义千问 QwQ-32B,在一系列权威基准测试中,千问QwQ-32B模型表现异常出色,几乎完全超越了OpenAI-o1-mini,性能比肩Deepseek-R1,且部署成本大幅降低。并集成了与智能体 Agent 相关的能力,够在使用工具的同时进行批判性思考,并根据环境反馈调整推理过程。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署 QwQ-32B,本实践带您部署体验专属 QwQ-32B模型服务。
|
4月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
|
10月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1032 6
|
5月前
|
机器学习/深度学习 存储 Kubernetes
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。