首页 > 解决方案 > 无法在 AWS Lambda 中使用 OpenCV-Python

问题描述

我一直在尝试将 OpenCV 放入 S3 存储桶,然后将其分配给 lambda 层。

网上关于这个的很少,我所看到的没有奏效。

我已经设法在亚马逊 linux 环境中使用 docker,并按照本教程进行操作。https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

我在 requirements.txt 文件中添加了 setuptools、wheel 和 opencv-python==4.4.0.42。

setuptools 和 wheel 因为较早的错误,建议在需要更新时将它们包括在内,即使我已经更新了它们。但它适用于他们,所以谁知道。

创建了我已压缩并放入 S3 存储桶的 docker 映像。

当我运行它时,我不断收到{“errorMessage”:“无法导入模块'lambda_function':libGL.so.1:无法打开共享对象文件:没有这样的文件或目录”,“errorType”:“Runtime.ImportModuleError”}尽管。

我似乎无法弄清楚出了什么问题。

有任何想法吗?

标签: amazon-web-servicesopencvamazon-s3aws-lambdapython-3.8

解决方案


您将需要向您的层添加一堆依赖项。以下是我在 lambda 上用于 opencv_python 的步骤。

1.在本地工作站上(终端窗口1)

mkdir /tmp/mylayer && cd /tmp/mylayer

echo opencv-python==4.4.0.42 > ./requirements.txt

2.在本地工作站(终端窗口2)


docker run -it -v /tmp/mylayer:/mylayer  lambci/lambda:build-python3.8 bash

上面的命令会将您放入 docker 容器中。

容器内部:

cd /mylayer

pip install --no-deps -t python/lib/python3.8/site-packages/ -r requirements.txt

yum install -y mesa-libGL

cp -v /usr/lib64/libGL.so.1 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGL.so.1.7.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libgthread-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libgthread-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libglib-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLX.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libX11.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXext.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLdispatch.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLESv1_CM.so.1.2.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLX_mesa.so.0.0.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLESv2.so.2.1.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libxcb.so.1 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXau.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXau.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /lib64/libGLdispatch.so.0.0.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/

3.再次在本地工作站上(终端窗口1)

python将文件夹打包成mylayer.zip.

zip -r -9 mylayer.zip python

在 AWS 控制台中

  1. mylayer.zip在 AWS 控制台中创建 lambda 层。不要忘记指定Compatible runtimesto python3.8

  2. 将 AWS 提供的 SciPy 层AWSLambda-Python38-SciPy1x和您自己的带有 cv2 的层添加到您的函数中。

所以你的函数中有两层

  1. 使用以下 lambda 函数在 lambda 中执行层的基本测试:
import cv2

def lambda_handler(event, context):    
    print(dir(csv))

该函数正确执行(显示部分打印输出)。

slation3D', 'exp', 'extractChannel', 'fastAtan2', 'fastNlMeansDenoising', 'fastNlMeansDenoisingColored', 'fastNlMeansDenoisingColoredMulti', 'fastNlMeansDenoisingMulti', 'fillConvexPoly', 'fillPoly', 'filter2D', 'filterHomographyDecompByVisibleRefpoints', 'filterSpeckles', 'find4QuadCornerSubpix', 'findChessboardCorners', 'findChessboardCornersSB', 'findChessboardCornersSBWithMeta', 'findCirclesGrid', 'findContours', 'findEssentialMat', 'findFundamentalMat', 'findHomography', 'findNonZero', 'findTransformECC', 'fisheye', 'fitEllipse', 'fitEllipseAMS', 'fitEllipseDirect', 'fitLine', 'flann', 'flann_Index', 'flip', 'floodFill', 'gemm', 'getAffineTransform', 'getBuildInformation', 'getCPUFeaturesLine', 'getCPUTickCount', 'getDefaultNewCameraMatrix', 'getDerivKernels', 'getFontScaleFromHeight', 'getGaborKernel', 'getGaussianKernel', 'getHardwareFeatureName', 'getNumThreads', 'g

推荐阅读