【问题标题】:Encoding a file to send to Google AutoML对文件进行编码以发送到 Google AutoML
【发布时间】:2018-07-31 13:05:08
【问题描述】:

我正在编写一个 golang 脚本来将图像发送到 Google AutoML API 的预测引擎。

它使用下面的代码接受大多数文件,但某些 .jpeg 或 .jpeg 会返回错误 500,说明文件无效。大多数情况下它都有效,但我无法找出例外情况。它们是完全有效的 jpg。

我正在使用 EncodeToString 对有效负载进行编码。

除此之外,我尝试对其进行解码,将其保存为 PNG,但似乎没有任何效果。它不喜欢某些图像。

我想知道我的方法是否有错误?任何帮助将非常感激。谢谢

PS 文件保存到文件系统并上传到 S3 就好了。当它去谷歌时,它只是对字符串的编码失败。

imgFile, err := os.Open(filename)
if err != nil {
    fmt.Println(err)
}

img, fname, err := image.Decode(imgFile)
if err != nil {
    fmt.Println(fname)
}

buf := new(bytes.Buffer)
err = jpeg.Encode(buf, img, nil)

// Encode as base64.
imgBase64Str := base64.StdEncoding.EncodeToString(buf.Bytes())

defer imgFile.Close()

payload := fmt.Sprintf(`{"payload": {"image": {"imageBytes": "%v"},}}`, imgBase64Str)

// send as a byte
pay := bytes.NewBuffer([]byte(payload))
req, err := http.NewRequest(http.MethodPost, URL.String(), pay)

【问题讨论】:

  • 尝试使用"<html><body><img src=\"data:image/png;base64," + imgBase64Str + "\" /></body></html>"在浏览器上查看图像作为响应。
  • 谢谢,我只是把你的脚本放在前端,图像渲染完美,就像 S3 上传一样。但是,当它在有效负载中发布到 API 时,它仍然会死掉,而且我在图像中看不到它失败的模式
  • 在创建有效负载时可能有问题。可以尝试直接发布图片。
  • 我认为你是写的,它是有效载荷的创建。它只接受带有 base64 图像的 JSON 格式。我只是尝试更改有效负载引号,但仍然是同样的问题:payload := fmt.Sprintf("{'payload': {'image': {'imageBytes': '%v'},}}", imgBase64Str)
  • 可能是payload json {"payload": {"image": {"imageBytes": "%v"}}}中多了一个逗号。去掉逗号,然后尝试发布payload

标签: go jpeg automl


【解决方案1】:

我相信我已经修好了。

我再次查看了 Google 文档并查看了语音转文本(这是一个不同的 API),它说要执行 encode64 -w 0

因此,查看 Go 文档,似乎使用 RawStdEncoding 来复制这种行为是正确的,而不是 StdEncoding

还没有图像故障。希望有一天这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2019-06-04
    • 2011-12-16
    相关资源
    最近更新 更多