AWS Rekognition当JPEG源为MJPEG流时出现无效图像格式异常

5
我正在从mjpg流中提取jpg帧。这些是有效的jpg文件,并且在我尝试过的任何图像工具中都可以使用;但是,Rekognition无论是将它们作为Bytes发送还是将它们移动到S3并尝试该路线,都无法接受它们。
我制作了一些版本(附在此处),都来自同一源jpg(我不想将它们内联包含,因为我不想让图像优化代码更改它们) test.jpg - 原始帧 test-photoshop.jpg - 在Photoshop中打开,“保存为Web” test-imageoptim.jpg - 经过ImageOptim处理(我相信它使用jpegtran压缩)
查看这些文件的十六进制编辑器中,我唯一看不到的区别是更多的exif数据(使用exiftool)。当我在原始文件上运行exiftool时,它仍然报告框架的所有基本详细信息。
我认为这是Rekognition的一个错误,或者它正在寻找一些特定的exif位,而我的mjpeg流提取正在省略它。也许有人知道为什么只需附加正确的起始和结束帧字节就无法从mjpeg中提取jpeg帧。

只是猜测,尝试截掉最后的6个字节,在最终的FF D9标记之后,也许这些字节会让亚马逊感到困惑。 - Chris O
@ChrisO 这个方法可行!也许我从MJPEG流中提取帧的方法是在末尾填充了零字节... 如果你把这个写成答案,我会接受它。 - Will
3个回答

3

来自评论:

猜测一下,尝试在最后的FF D9标记之后截掉最后6个字节,也许这些字节会使亚马逊感到困惑。

这是一个十六进制查看器的快照:

enter image description here


这是正确的答案。我正在观看mjpg流以获取帧并提取它们,添加sof和eof标记,但在某些情况下,它会在eof之后添加这个零字节尾部,而亚马逊不喜欢。在其他应用程序中,它可以正常读取,我猜测这是因为jpg不需要eof标记。 - Will
JPEG确实需要EOF标记。然而,许多解码器在遇到它时会停止解码。 - user3344003

1
我只能根据我的推测进行翻译,因为我无法访问导致问题的应用程序。然而,我的猜测是它无法识别JPEG流的文件格式(或缺乏文件格式)。
在图像开始标记之后,您有一个帧起始标记。这在JPEG标准中是合法的。但是,没有任何指示文件格式的内容。这不是严格解释JPEG流所必需的(假设3个组件扫描是YCbCr编码),但您的应用程序可能正在寻找某些特定格式的标记(例如JFIF,EXIF)。

0

您的图片没问题。您的代码有错误或权限不正确。我使用了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"
   }
}

我不知道那是怎么可能的。我尝试直接将test.jpg上传到AWS上的Rekognition控制台https://console.aws.amazon.com/rekognition/home?region=us-east-1#/label-detection,但它失败并显示相同的错误。我也通过sdk从node.js上传了一张有效的图片,它可以正常工作。@chris_o上面的评论确实可以通过删除eof标记后的所有内容来解决问题。你真的可以通过api上传test.jpg并获得有效结果吗? - Will
尝试了控制台,得到了“错误请求(400)- InvalidImageFormatException无效图像编码”的提示。我猜测控制台会进行某种初步的检查/验证。 - Sergey Kovalev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接