Python 二进制数据另存为 png



所以我已经用头撞了几个小时,我不能完全让它工作。

该文件以图像/png的形式发送,如果我打印它,则会出现看起来像二进制数据的内容。

我得到的问题在这里 #PROBLEM 评论 - 基本 PIL 无法读回文件,它在目录中是 100%。

cannot identify image file '/tmp/image.jpg'

我也尝试了 JSON 等和 base64,但最终进入了同一个圈子,这将是一件非常愚蠢的事情。

我正在使用Postman来测试Sagemaker端点集成 - 这是我的代码 - 我包含了很多,因为希望你看到虽然这是一个愚蠢的问题,但我已经为此做了很多工作,我对python相对较新。

为了在 Lambda 中完成这项工作,我不得不从 ubuntu 文件系统中从 MXNet、Sagemaker 和众多 .so 中拖动模块,并作为软件包的一部分上传,以便它满足 Lambda 的空间要求。(最终结果是 100mb lambda 包,比我开始使用的 300 个要好。

sys.path.append('./libs')
from record_pb2 import Record
from recordio import MXRecordIO
runtime= boto3.client('runtime.sagemaker')
# event, context
def handler(event, context):
print(event)
print('Body')
# tried 'w' here too.
with open('/tmp/image.jpg' , 'wb') as file:
# Tried without encode and no 'b' above.
file.write(event['body'].encode())
files = os.listdir('/tmp')
print(files)
im = PIL.Image.open('/tmp/image.jpg')
im.thumbnail([800,600],PIL.Image.ANTIALIAS)
im.save('/tmp/resized.jpg', "JPEG")
files = os.listdir('/tmp')
print(files)

with open('/tmp/resized.jpg', 'r') as image:
img = image.read()
img = bytearray(img)
response = runtime.invoke_endpoint(EndpointName='ss-notebook-demo-2020-06-02-09-27-40-405',
ContentType='image/jpeg',
Accept='application/x-protobuf',
Body=img)
print(response)
result = response['Body'].read()
results_file = '/temp/results.rec'
with open(results_file, 'wb') as f:
f.write(result)
rec = Record()
recordio = MXRecordIO(results_file, 'r')
protobuf = rec.ParseFromString(recordio.read())
values = list(rec.features["target"].float32_tensor.values)
shape = list(rec.features["shape"].int32_tensor.values)
shape = np.squeeze(shape)
mask = np.reshape(np.array(values), shape)
mask = np.squeeze(mask, axis=0)
pred_map = np.argmax(mask, axis=0)
unique_elements, counts_elements = np.unique(pred_map[pred_map != 0], return_counts=True)
#print(unique_elements, counts_elements)
#print(pred_map[pred_map != 0].size)
#print(np.bincount(pred_map[pred_map != 0]).argmax())
return {
'classes': unique_elements,
'counts': counts_elements,
'top': np.bincount(pred_map[pred_map != 0]).argmax(),
}

对于那些有兴趣的人,您可以如何从Sagemaker中的语义分割记录中获取类和像素数每个类! :-(

更新:

身体样本,请注意这不是全部,因为它很大。

'body': '����x00x10JFIFx00x01x01x00x00x01x00x01x00x00��x00Cx00x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01��x00Cx01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01x01��x00x11x08x07�x05dx03x01"x00x02x11x01x03x11x01��x00x1fx00x00x01x05x01x01x01x01x01x01x00x00x00x00x00x00x00x00x01x02x03x04x05x06x07x08tnx0b��x00�x10x00x02x01x03x03x02x04x03x05x05x04x04x00x00x01}x01x02x03x00x04x11x05x12!1Ax06x13Qax07"qx142���x08#B��x15R��$3br�tnx16x17x18x19x1a%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���������������������������������������������������������������������������x00x1fx01x00x03x01x01x01x01x01x01x01x01x01x00x00x00x00x00x00x01x02x03x04x05x06x07x08tnx0b��x00�x11x00x02x01x02x04x04x03x04x07x05x04x04x00x01x02wx00x01x02x03x11x04x05!1x06x12AQx07aqx13"2�x08x14B����t#3R�x15br�nx16$4�%�x17x18x19x1a&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������x00x0cx03x01x00x02x11x03x11x00?x00�*x03�n8�x06R����x17�vs�x04��gx14�)3��2�k�7�Kx029��x1f��4<�|��I�'heN��x1f�^s�3�q�x16x17�ɘ'�3x1c�ّ�~Gx07ؚ�+��x7fx17�G%�ԓR��x17x7f�),! 

您的body样本显示它是一个 JPG 文件,而不是 PNG。这就是为什么PIL.Image拒绝打开它。更改文件扩展名,然后重试。

相关内容

  • 没有找到相关文章

最新更新