当 jpeg 源是 mjpeg 流时,AWS Rekognition InvalidImageFormatException
AWS Rekognition InvalidImageFormatException when jpeg source is mjpeg stream
我正在从 mjpg 流中提取 jpg 帧。这些是有效的 jpg 文件,可以在我尝试过的任何图像工具中使用;但是,Rekognition 在以字节形式发送它们时或在我将它们移动到 S3 并尝试该路由时都不会接受它们。
我制作了几个版本 (attached here),全部来自同一个源 jpg(我会内嵌它们,但我不希望图像优化代码改变它们)
test.jpg
- 原始帧
test-photoshop.jpg
- 在 Photoshop 中打开,"save for web"d
test-imageoptim.jpg
- 运行 通过 ImageOptim(我相信用 jpegtran 压缩)
在十六进制编辑器中查看这些,我看不到的唯一区别是更多的 exif 数据(使用 exiftool)。当我 运行 在原来的 exiftool 上时,它仍然会报告框架的所有基本细节。
我假设这是 Rekognition 的错误,或者它正在寻找我的 mjpeg 流提取遗漏的某些特定 exif 位。也许有人知道为什么不能通过附加正确的开始和结束帧字节来从 mjpeg 中提取 jpeg 帧。
你的图片很好。您的代码有问题或您的权限不正确。我用 https://github.com/yourtion/Rekognition_API_NODEJS_SDK 和你的 test.jpg
结果如下:
{
"url":"POST",
"face_detection":[
{
"boundingbox":{
"tl":{
"x":470.77,
"y":109.23
},
"size":{
"width":53.85,
"height":53.85
}
},
"confidence":0.25,
"eye_left":{
"x":489.3,
"y":132.4
},
"eye_right":{
"x":498,
"y":128.9
},
"nose":{
"x":504.1,
"y":142.5
},
"mouth l":{
"x":497.7,
"y":152.1
},
"mouth_l":{
"x":497.7,
"y":152.1
},
"mouth r":{
"x":502.4,
"y":151.9
},
"mouth_r":{
"x":502.4,
"y":151.9
},
"pose":{
"roll":-27.01,
"yaw":86.01,
"pitch":-12.56
},
"quality":{
"brn":0.22,
"shn":0.1
},
"emotion":{
"happy":0.25,
"surprised":0.09,
"sad":0.07
},
"age":30.11,
"smile":0.71,
"glasses":0.79,
"sunglasses":0.87,
"beard":0.96,
"mustache":0.52,
"eye_closed":1,
"mouth_open_wide":0.04,
"beauty":0.5041,
"sex":1
}
],
"ori_img_size":{
"width":640,
"height":480
},
"usage":{
"quota":98,
"status":"Succeed.",
"api_id":"XXXXXXXXXXXXXXXXXXXX"
}
}
我只能做出有根据的猜测,因为我无法访问导致问题的应用程序。但是,我的猜测是它不识别 JPEG 流的文件格式(或不识别)。
您在图像开始标记之后有一个帧开始标记。根据 JPEG 标准,这是合法的。但是,没有任何内容可以指示文件格式。这对于解释 JPEG 流并不是绝对必要的(假设 3 分量扫描是 YCbCr 编码的),但您的应用程序可能正在寻找一些格式特定的标记(例如,JFIF、EXIF)。
来自评论:
Just a guess, try chopping off the last 6 bytes, after the final FF D9
marker, perhaps those bytes are confusing Amazon.
这是来自十六进制查看器的快照:
我正在从 mjpg 流中提取 jpg 帧。这些是有效的 jpg 文件,可以在我尝试过的任何图像工具中使用;但是,Rekognition 在以字节形式发送它们时或在我将它们移动到 S3 并尝试该路由时都不会接受它们。
我制作了几个版本 (attached here),全部来自同一个源 jpg(我会内嵌它们,但我不希望图像优化代码改变它们)
test.jpg
- 原始帧
test-photoshop.jpg
- 在 Photoshop 中打开,"save for web"d
test-imageoptim.jpg
- 运行 通过 ImageOptim(我相信用 jpegtran 压缩)
在十六进制编辑器中查看这些,我看不到的唯一区别是更多的 exif 数据(使用 exiftool)。当我 运行 在原来的 exiftool 上时,它仍然会报告框架的所有基本细节。
我假设这是 Rekognition 的错误,或者它正在寻找我的 mjpeg 流提取遗漏的某些特定 exif 位。也许有人知道为什么不能通过附加正确的开始和结束帧字节来从 mjpeg 中提取 jpeg 帧。
你的图片很好。您的代码有问题或您的权限不正确。我用 https://github.com/yourtion/Rekognition_API_NODEJS_SDK 和你的 test.jpg
结果如下:
{
"url":"POST",
"face_detection":[
{
"boundingbox":{
"tl":{
"x":470.77,
"y":109.23
},
"size":{
"width":53.85,
"height":53.85
}
},
"confidence":0.25,
"eye_left":{
"x":489.3,
"y":132.4
},
"eye_right":{
"x":498,
"y":128.9
},
"nose":{
"x":504.1,
"y":142.5
},
"mouth l":{
"x":497.7,
"y":152.1
},
"mouth_l":{
"x":497.7,
"y":152.1
},
"mouth r":{
"x":502.4,
"y":151.9
},
"mouth_r":{
"x":502.4,
"y":151.9
},
"pose":{
"roll":-27.01,
"yaw":86.01,
"pitch":-12.56
},
"quality":{
"brn":0.22,
"shn":0.1
},
"emotion":{
"happy":0.25,
"surprised":0.09,
"sad":0.07
},
"age":30.11,
"smile":0.71,
"glasses":0.79,
"sunglasses":0.87,
"beard":0.96,
"mustache":0.52,
"eye_closed":1,
"mouth_open_wide":0.04,
"beauty":0.5041,
"sex":1
}
],
"ori_img_size":{
"width":640,
"height":480
},
"usage":{
"quota":98,
"status":"Succeed.",
"api_id":"XXXXXXXXXXXXXXXXXXXX"
}
}
我只能做出有根据的猜测,因为我无法访问导致问题的应用程序。但是,我的猜测是它不识别 JPEG 流的文件格式(或不识别)。
您在图像开始标记之后有一个帧开始标记。根据 JPEG 标准,这是合法的。但是,没有任何内容可以指示文件格式。这对于解释 JPEG 流并不是绝对必要的(假设 3 分量扫描是 YCbCr 编码的),但您的应用程序可能正在寻找一些格式特定的标记(例如,JFIF、EXIF)。
来自评论:
Just a guess, try chopping off the last 6 bytes, after the final FF D9 marker, perhaps those bytes are confusing Amazon.
这是来自十六进制查看器的快照: