百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error) 博客 51CTO博客

2023-05-17 18:24:09 319浏览

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error),前言:百度智慧云的图像内容审核真的坑死我了!!!弄了我整整2个小时。我只想吐槽一句:baidu我??你个述编写请求参数:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD...,结果就出现了如下


前言:

百度智能云的图像内容审核真的坑死我了!!!弄了我整整2个小时。我只想吐槽一句: baidu 我 ?? 你个大??!操作很简单,就是把图像转成 Base64 然后上传给百度智慧云后台服务处理,并返回审核结果。然而里面的细节真是把我整吐了,下面由我娓娓道来。


坑点①:

API Explorer 在线调用器没有明确说明 base64 的格式

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_百度

我按照上述描述编写请求参数:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD...,结果就出现了如下错误提示信息:image format error (图像格式化错误)

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_请求参数_02


解决: 后来在另一参数说明文档看到请求参数的明确格式要求:

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_上传_03

当我以为这样就完了,应该没问题了,结果还是 image format error (图像格式化错误) ????==> 到达坑点 ②


坑点②:

我先随便找了一张图,使用在线图像编码转换站点进行base64编码,然后去掉图像头 data:image/jpg;base64, 放入 postman 中去请求测试,返回结果为合规,说明图像审核通过。

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_请求参数_04

我再次尝试在我的项目程序中上传,断点调试对比了一下,base64 没有问题呀,为什么还是返回 image format error (图像格式化错误) 呢?

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_百度_05

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_百度_06

把这里面 base64 编码复制到 postman 也依旧是返回 image format error (图像格式化错误)

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_上传_07

但是我们可以发现 value 值中似乎多了很多 \r\n 回车换行。

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_请求参数_08


我尝试把 \r\n 全部替换成 “”,把程序生成的base64编码再次放入 postman 中进行请求,响应结果为合规,审核通过。百度OCR服务器后台程序竟然不把 \r\n 去掉,这种低级错误,真的无语…。

我知道为啥百度不会过滤剔除 \r\n,查看示例发现百度提供了一个 Base64Util 工具包,公司程序员写了个base64编码的工具类 https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 ,我使用的是 Java 自带的 BASE64Encoder 类进行 base64 编码,会生成 \r\n 。 而百度提供的工具类不会生成 \r\n 。(建议还是用百度提供的吧,如果还是使用 BASE64Encoder,可以 replaceAll("\r\n", "")进行替换。

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_java_09

我又以为这样就完事儿了,这下程序总能运行成功了吧。结果 wdnmd !发送请求还是返回错误信息 image format error (图像格式化错误),真的裂开 ==> 到达坑点 ③

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_请求参数_10


坑点③:

上述两个坑踩完以后,我的程序生成的 base64 和 postman 的请求参数值已经是完全一样的,那为什么postman发送请求能成功审核,我的程序还是跑不起来了呢?

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_java_11

我再次仔细研读开发文档,发现请求体需要进行 urlencode 格式化。但是我就有一个疑问了?postman 没有进行 urlencode 为什么能响应返回成功?难道 postman 自动会对请求参数进行 url 编码?

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_上传_12


没想这么多,先给我程序加上试试, 结果就成功了,问题解决。

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_百度_13

百度智能云 -- 图像内容(Base64)智能审核调用踩坑问题排查及解决 -- (image format error)_java_14


总结:

1、图像的base64编码是不包含图像头的,不要携带如:(data:image/jpg;base64,)的图像头
2、尽量使用官方提供的 Base64 编码工具包:https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 , 如果使用 java 自带的 BASE64Encoder, 记得把 \r\n 去掉, replaceAll("\r\n", "") 进行替换。
3、别忘了对请求体进行 url 编码 URLEncoder.encode()



好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695