如何在Google Cloud平台运行Mask-RCNN预测时减小输入文件大小?
你遇到的是非常典型的序列化格式膨胀问题——把小巧的压缩图片转成张量数组文本格式后,体积会几十倍暴涨,完全超出预期。我来分享几个实用的解决方案,帮你把输入大小控制在1.5MB的限制内:
1. 直接发送原始图片字节(最推荐)
问题根源在于你把65KB的JPEG/PNG图片解码成像素张量,再序列化成JSON文本格式,这一步会让体积疯狂膨胀。其实完全可以跳过这个冗余步骤,让模型在预测阶段自己处理图片解码:
- 修改你的SavedModel,把输入层改为接受字符串类型的输入(对应原始图片的二进制字节)。
- 在模型输入层后串联预处理逻辑:用
tf.io.decode_jpeg或tf.io.decode_png解码图片,再执行resize、归一化等你之前在本地做的预处理操作。 - 重新导出修改后的SavedModel并部署到AI Platform。
这样你发送预测请求时,直接上传原始的65KB图片文件即可,输入大小和原图片完全一致,根本不会触发上限。
2. 用gzip压缩请求体
如果暂时不想修改模型,你可以对序列化后的张量请求体进行gzip压缩,AI Platform支持接受压缩后的请求,只要在请求头里设置Content-Encoding: gzip。
比如用gcloud命令发送预测时:
gzip -c request.json > request.json.gz gcloud ai-platform predict \ --model=your_model_name \ --version=your_version \ --json-request=request.json.gz \ --headers="Content-Encoding: gzip"
57MB的张量JSON压缩后通常能降到几MB以内,完全符合1.5MB的限制,而且你已经验证过格式没问题,压缩后也不会影响预测结果。
3. 替换为高效的二进制序列化格式
JSON对数值数组的序列化效率极低,你可以换成TensorFlow原生的tf.Example或protobuf二进制格式,体积会比JSON小很多。发送请求时设置Content-Type: application/octet-stream,AI Platform同样支持这种二进制输入格式。
4. 调整图片编码参数(辅助优化)
如果还是想保留resize的方式,可以尝试调整图片的编码质量:把resize后的图片用更高压缩率的JPEG格式保存(比如设置质量参数为70-80),这样400×400的图片体积可能会从7MB降到1MB左右,刚好符合上限,同时不会丢失太多关键识别信息。
内容的提问来源于stack exchange,提问作者akshay pai

