tesseract-ocr适用于EC2,而非lambda

use*_*380 5 tesseract amazon-ec2 aws-lambda

我的目标是在AWS Lambda中运行tesseract-ocr.

我已经构建了一个试图镜像Lambda环境的EC2实例.在没有参数的情况下执行tesseract在两种环境中都成功.但是,任何实质性图像处理的尝试,例如此代码:

tess = child_process.exec('tesseract input.tif output -l eng -psm 1 hocr', function(error, stdout, stderr) {
...
Run Code Online (Sandbox Code Playgroud)

在我的EC2框上成功运行,但在Lambda中失败并出现此错误:

Error: Command failed: Tesseract Open Source OCR Engine v3.04.00 with Leptonica
Error during processing.

 at ChildProcess.exithandler (child_process.js:648:15)
 at ChildProcess.emit (events.js:98:17)
 at maybeClose (child_process.js:756:16)
 at Process.ChildProcess._handle.onexit (child_process.js:823:5)
Error code: 1
Signal received: null
Run Code Online (Sandbox Code Playgroud)

Lambda承担具有管理权限的IAM角色({"效果":"允许","操作":" ","资源":" "})

tesseract将"处理中的错误"错误作为顶级捕获所发出.我打算使用tesseract,并尝试进一步缩小问题范围.

我是怎么来的

  • 我的EC2机器是在美国东部地区运行的亚马逊Linux的t2.micro(amzn-ami-hvm-2014.09.2.x86_64-ebs(ami-146e2a7c)).
  • 我安装了节点0.10.33和aws-sdk@2.0.23,它们与Lambda版本相匹配.
  • 我从源代码编译了tesseract和leptonica.添加了一个rpath并运行了ldd以确认找到了所有依赖项
  • tesseract二进制文件和liblept.so都在我的根目录下(/ var/task)

我想知道出了什么问题 - 或者如何诊断它.

戴夫,谢谢你

use*_*380 3

简短的回答:输出必须放在 /tmp 目录中,例如

tesseract input.tif /tmp/output -l eng -psm 1 hocr
Run Code Online (Sandbox Code Playgroud)

答案稍长:tesseract 在底层调用 fopen wb,显然这在 /var/task 中是被禁止的。

几天前我就会注意到这一点,但 Lambda 尚未传播我的部署包。因此,有一次我尝试将输出放入 /tmp 目录中,但没有效果 - 但那是因为 Lambda 正在执行我的函数的过时版本。解决方案是始终在调用 update-function 之前删除-function。