当 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.

这是来自十六进制查看器的快照: