Tidak dapat menggunakan OpenCV-Python di AWS Lambda

Sep 23 2020

Saya telah mencoba memasukkan OpenCV ke dalam ember S3 dan kemudian menetapkannya ke lapisan lambda.

Hanya ada sedikit tentang ini secara online dan apa yang saya lihat tidak berhasil.

Saya telah berhasil menggunakan buruh pelabuhan dengan lingkungan linux amazon, dan mengikuti tutorial ini. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

Saya telah menambahkan setuptools, wheel dan opencv-python == 4.4.0.42 ke file Requirement.txt.

setuptools dan roda karena kesalahan sebelumnya di mana rekomendasinya adalah memasukkan ini karena mereka perlu memperbarui, meskipun saya telah memperbaruinya. Tapi itu berhasil dengan mereka, jadi siapa tahu.

Membuat gambar buruh pelabuhan yang telah saya zip dan dimasukkan ke dalam ember S3.

Saya terus mendapatkan {"errorMessage": "Tidak dapat mengimpor modul 'lambda_function': libGL.so.1: tidak dapat membuka file objek bersama: Tidak ada file atau direktori seperti itu", "errorType": "Runtime.ImportModuleError"} saat saya menjalankannya meskipun.

Saya tidak bisa menemukan apa yang salah.

Ada ide?

Jawaban

7 Marcin Sep 23 2020 at 06:59

Anda perlu menambahkan banyak dependensi ke lapisan Anda. Berikut adalah langkah-langkah yang saya gunakan untuk opencv_python di lambda.

1. Di stasiun kerja lokal (jendela terminal 1)

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

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

2. Di stasiun kerja lokal (terminal jendela 2)


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

Perintah di atas akan menempatkan Anda ke dalam kontainer buruh pelabuhan.

Di dalam wadah:

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. Di stasiun kerja lokal lagi (jendela terminal 1)

Kemas pythonfolder tersebut ke dalam mylayer.zip.

zip -r -9 mylayer.zip python

Di konsol AWS

  1. Buat lapisan lambda berdasarkan mylayer.zipdi Konsol AWS. Jangan lupa untuk menentukan Compatible runtimeske python3.8.

  2. Tambahkan AWS menyediakan lapisan SciPy AWSLambda-Python38-SciPy1xdan lapisan Anda sendiri dengan cv2 ke dalam fungsi Anda.

Jadi Anda akan memiliki dua lapisan dalam fungsi Anda.

  1. Lakukan pengujian dasar lapisan di lambda menggunakan fungsi lambda berikut:
import cv2

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

Fungsi ini dijalankan dengan benar (cetakan parsial ditunjukkan).

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