Impossible d'utiliser OpenCV-Python dans AWS Lambda

Sep 23 2020

J'ai essayé d'obtenir OpenCV dans un compartiment S3, puis de l'attribuer à une couche lambda.

Il y a très peu de choses à ce sujet en ligne et ce que j'ai vu n'a pas fonctionné.

J'ai réussi à utiliser docker avec l'environnement amazon linux et j'ai suivi ce tutoriel. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

J'ai ajouté setuptools, wheel et opencv-python == 4.4.0.42 au fichier requirements.txt.

setuptools et wheel en raison d'une erreur antérieure où la recommandation était de les inclure car ils doivent être mis à jour, même si je les ai mis à jour. Mais cela fonctionne avec eux, alors qui sait.

J'ai créé l'image docker que j'ai compressée et placée dans un compartiment S3.

Je continue à recevoir {"errorMessage": "Impossible d'importer le module 'lambda_function': libGL.so.1: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type", "errorType": "Runtime.ImportModuleError"} lorsque je l'exécute bien que.

Je n'arrive pas à comprendre ce qui ne va pas.

Des idées?

Réponses

7 Marcin Sep 23 2020 at 06:59

Vous devrez ajouter un tas de dépendances à votre couche. Voici les étapes que j'ai utilisées pour opencv_python sur lambda.

1. Sur le poste de travail local (fenêtre du terminal 1)

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

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

2. Sur le poste de travail local (fenêtre du terminal 2)


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

La commande ci-dessus vous placera dans le conteneur du docker.

À l'intérieur du conteneur:

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. Sur le poste de travail local à nouveau (fenêtre du terminal 1)

Emballez le pythondossier dans mylayer.zip.

zip -r -9 mylayer.zip python

Dans la console AWS

  1. Créez une couche lambda basée sur mylayer.zipdans la console AWS. N'oubliez pas de préciser Compatible runtimesà python3.8.

  2. Ajouter AWS fournit une couche SciPy AWSLambda-Python38-SciPy1xet votre propre couche avec cv2 dans votre fonction.

Vous aurez donc deux couches dans votre fonction.

  1. Effectuez un test de base de la couche en lambda à l'aide de la fonction lambda suivante:
import cv2

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

La fonction s'exécute correctement (impression partielle affichée).

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