无法读取 Sagemaker 语义分割模型批量转换输出文件

Posted

技术标签:

【中文标题】无法读取 Sagemaker 语义分割模型批量转换输出文件【英文标题】:Not able to read Sagemaker Semantic Segmentation Model Batch Transformation Output file 【发布时间】:2021-02-09 23:06:18 【问题描述】:

目前我已经部署了一个语义分割模型和一个端点,我可以使用它来调用和获取推理。现在,我一次对每张图像进行推断。

现在我想使用批量转换作业一次尝试批量图像。它工作得非常好,但创建的图像是一个 .out 文件,我无法使用任何可视化库(如 matplotlib imread、PIL)打开该文件图像和 openCV 读取。这一切都不是图像。

只是想了解.out 文件是什么?,如果它是通常是语义分割模型的输出的分割掩码图像,那么我该如何读取该文件。

我的批量转换代码:

from sagemaker.predictor import RealTimePredictor, csv_serializer, csv_deserializer

class Predictor(RealTimePredictor):
    
    def __init__(self, endpoint_name, sagemaker_session=None):
        super(Predictor, self).__init__(
            endpoint_name, sagemaker_session, csv_serializer, csv_deserializer
        )

ss_model = sagemaker.model.Model(role =role, image=training_image, model_data = model, predictor_cls=Predictor, sagemaker_session=sess)

transformer = ss_model.transformer(instance_count=1, instance_type='ml.c4.xlarge', output_path=batch_output_data)

transformer.transform(data=batch_input_data, data_type='S3Prefix', content_type='image/png', split_type='None')

transformer.wait()

【问题讨论】:

你能解决这个问题吗? 不,我只对单个图像使用推理,并在一个循环中运行它以进行批处理,您是否也面临同样的问题? 是的,面临同样的问题。您是如何仅对一张图像进行推断的?我看到了你的另一篇文章,但我得到了同样的错误“文件'model_new/model_algo-1'中缺少参数'head.psp.conv1.0.weight'”,我不知道如何在“ png" 而不是 ".out" 根据文档,“.out”文件是带有数据和 pridicted 标签的 CSV 类型的结果文件。尝试使用文本编辑应用程序打开和调查 【参考方案1】:

作为official doc say:

SageMaker 语义分割算法提供了一个细粒度的、 像素级方法来开发计算机视觉应用程序。 它使用预定义类集合中的类标签标记图像中的每个像素

...

因为语义分割算法对每个像素进行分类 图像,它还提供有关对象形状的信息 包含在图像中。 分割输出表示为 灰度图像,称为分割掩码。分割掩码是 与输入图像形状相同的灰度图像。

所以,.out 文件有像素数组(为每个像素分配的类)。 你需要反序列化文件:

from PIL import Image
import numpy as np
import io
from boto3.session import Session

session = Session(
    aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, region_name=REGION_NAME
)
s3 = session.resource("s3")
out_file = io.BytesIO()
s3_object = s3.Object(BUCKET, PATH)
s3_object.download_fileobj(out_file)
out_file.seek(0)

mask = np.array(Image.open(out_file))

另外,我在this doc 中找到了一个类ImageDeserializer 来处理数据流。也许您可以将其调整为适合您的文件,因为它读取从 inference 端点返回的字节流(批量转换将此数据放入 .out 文件中)。

【讨论】:

谢谢你,让我检查一下然后回来。【参考方案2】:

.out 文件是什么?

.out 文件本质上是您的 http 响应 HttpEntity(包括标题和正文)中的流(内容)。它与您输入文件中记录的顺序相匹配。

更具体地说,对于每个批量转换,SageMaker 将您的输入文件拆分为记录,构建多个 http 请求并将它们发送到模型服务器。推理结果包含在 http 响应中。 SageMaker 将推理结果上传到带有“.out”后缀的 s3。

【讨论】:

以上是关于无法读取 Sagemaker 语义分割模型批量转换输出文件的主要内容,如果未能解决你的问题,请参考以下文章

Sagemaker 语义分割:每类 iou 和像素精度

如何在 AWS Sagemaker 中检索分段掩码中使用的标签

如何将图像转换为数据集以进行语义分割

基于MindSpore复现UNet—语义分割

多类语义分割模型评估

我们如何在 AWS Sagemaker 推理中添加复杂的预处理