影音先锋男人资源站_国产婷婷综合丁香亚洲欧洲_白狐视频传媒污软件下载_趁女同学午休揉她的屁股

快速構建基于AWS Lambda容器鏡像的OCR應用,aws lambda-ESG跨境

快速構建基于AWS Lambda容器鏡像的OCR應用,aws lambda

來源網(wǎng)絡
來源網(wǎng)絡
2022-04-26
點贊icon 0
查看icon 739

快速構建基于AWS Lambda容器鏡像的OCR應用,aws lambda快速構建基于AWS Lambda容器鏡像的OCR應用摘要AWS Lambda函數(shù)現(xiàn)已支持打包和部署容器鏡像,開發(fā)者通過官方提供或自己構建鏡像文件,可以非常方便利用現(xiàn)有的開發(fā)工具,工作流輕松構建基于AWS Lambda的應用程序。基于容器打包的應用......

快速構建基于AWS Lambda容器鏡像的OCR應用,aws lambda




快速構建基于AWS Lambda容器鏡像的OCR應用

摘要

AWS Lambda函數(shù)現(xiàn)已支持打包和部署容器鏡像,開發(fā)者通過官方提供或自己構建鏡像文件,可以非常方便利用現(xiàn)有的開發(fā)工具,工作流輕松構建基于AWS Lambda的應用程序?;谌萜鞔虬膽猛ㄟ^AWS Lambda可以實現(xiàn)更為簡便的操作部署,相比EC2有著更為快速的啟動時間,更為強大的并發(fā)擴展以及高可用,同時無縫與140余種AWS服務集成。

本文將展示如何基于自建鏡像(public.ecr.aws/bitnami/python:3.7),利用AWS官方提供的運行時接口客戶端(RIC)和運行時接口仿真器(RIE),構建運行在AWS Lambda上的OCR應用。

前言

對于機器學習,圖像處理等依賴庫構建復雜且文件較大的應用,AWS Lambda支持最大10GB的容器鏡像,開發(fā)者可以直接使用熟悉的容器開發(fā)工具(docker)在本地構建測試,并將容器鏡像推國際快遞Amazon ECR(全托管的容器注冊表),之后通過指定Amazon ECR鏡像來部署Lambda函數(shù),免去了以往Lambda Layer構建流程,也無需受限于Lambda Layer的大小限制(250MB)。

伴隨AWS Lambda對容器鏡像支持的特性發(fā)布,AWS官方提供了一組Lambda基礎鏡像,可在Amazon ECR(gallery.ecr.aws/lambda)和Docker Hub(amazon/awslambdapython)上獲取,該基礎鏡像預裝了包括Node.js,Python,Java等語言的Lambda運行時,必要組件以及構建基礎鏡像的dockerfile。同時AWS官方還開源了運行時接口客戶端(RIC)和運行時接口仿真器(RIE),方便用戶構建同Lambda兼容的容器鏡像并進行本地測試。

OCR應用我們基于tesseract(最早由HP Lab開發(fā)并于2005年開源)實現(xiàn),其中軟件依賴如pillow,libtesseract我們利用AWS進行本地安裝,或者用戶也可以選取官方鏡像public.ecr.aws/lambda編譯以盡可能保證同Lambda兼容。

流程概覽

本文構建的OCR應用會利用到Python,Shell作為開發(fā)語言,PIP/Docker作為開發(fā)工具,構建流程分成如下部分:1)軟件依賴庫的構建,包括pillow,libtesseract編譯;2)Lambda兼容鏡像的構建,包括RIC/RIE的安裝配置,Lambda業(yè)務代碼的打包;3)Lambda業(yè)務代碼實現(xiàn),通過簡單的代碼調(diào)用生成的pytesseract庫返回圖片識別結果;4)本地調(diào)試驗證,通過RIE實現(xiàn)本地功能調(diào)試和迭代。

其中構建容器鏡像的軟件依賴庫有以下幾個途徑:方案一,直接利用已經(jīng)包含軟件依賴庫的容器鏡像,其dockerfile示例如下:

FROM public.ecr.aws/myrepo/sharedliblayer:1 AS sharedliblayer

#Layer code

WORKDIR/opt

COPYfrom=sharedliblayer/opt/.

方案二,利用已經(jīng)構建好的Lambda Layer,通過curl的形式拉取到新的鏡像當中,其dockerfile示例如下:

ARG AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:cnnorthwest1}

ARG AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:}

ARG AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:}

ENV AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}

ENV AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}

ENV AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}

RUN apk add awscli curl unzip

RUN mkdirp/opt

RUN curl$(aws lambda getlayerversionbyarnarn arn:aws:lambda:useast1:1234567890123:layer:sharedliblayer:1queryContent.Locationoutput text)output layer.zip

RUN unzip layer.zipd/opt

RUN rm layer.zip

方案三,完全從零開始的用戶可以考慮直接在容器里面構建軟件依賴庫,其dockerfile示例如下:

FROM python:3.8alpine AS installer

#Layer Code

COPY extensionssrc/opt/

COPY extensionssrc/requirements.txt/opt/

RUN pip installr/opt/requirements.txtt/opt/extensions/lib

FROM scratch AS base

WORKDIR/opt/extensions

COPYfrom=installer/opt/extensions.

接下來的OCR方案考慮到tesseract的依賴構建相對復雜,為了構建流程的獨立和依賴庫的共享,我們將采用方案二,即先利用Shell和Docker構建Lambda業(yè)務代碼調(diào)用的所有依賴,再將構建完畢后的zip包存放到Lambda Layer中供后續(xù)Lambda鏡像構建調(diào)用。

創(chuàng)建步驟

軟件依賴庫的構建

首先安裝pillow,創(chuàng)建requirements文件,寫入以下內(nèi)容。

pillow

接著創(chuàng)建shell腳本(build_py37_pkgs.sh),寫入以下內(nèi)容并執(zhí)行,執(zhí)行完畢后會在相同目錄下生成pythonlibslayer.zip文件。

sete

rmrf pythonlibslayer.zip exit 0

rmrf python/exit 0

docker runv$PWD:/var/tasklambci/lambda:buildpython3.7/bin/shcpip installr requirements.txtt python/lib/python3.7/sitepackages/;exit

chmod 777 python/

zipr pythonlibslayer.zip pythongt;/dev/null

rmrf python/

Pillow構建完畢后,開始構建tesseract依賴,創(chuàng)建dockerfile(Dockerfiletess4),文件內(nèi)容可以直接參考這里

FROM lambci/lambdabase:build

#Proxy setup if exists

#ENV http_proxyhttp://ip:port

#ENV https_proxyhttps://ip:port

ARG LEPTONICA_VERSION=1.78.0

ARG TESSERACT_VERSION=4.1.0rc4

ARG AUTOCONF_ARCHIVE_VERSION=2017.09.28

ARG TMP_BUILD=/tmp

ARG TESSERACT=/opt/tesseract

ARG LEPTONICA=/opt/leptonica

ARG DIST=/opt/builddist

#change OCR_LANG to enable the layer for different languages

ARG OCR_LANG=chi_sim

#change TESSERACT_DATA_SUFFIX to use different datafiles(options:_best,_fastand)

ARG TESSERACT_DATA_SUFFIX=

ARG TESSERACT_DATA_VERSION=4.0.0

后續(xù)省略

……

創(chuàng)建shell腳本(build_tesseract4.sh),寫入以下內(nèi)容并執(zhí)行,執(zhí)行完畢后會在相同目錄下生成tesseractlayer.zip

sete

rmrf tesseractlayer.zip exit 0

rmrf configs exit 0

rmrf tessconfigs exit 0

#Download tessconfigs folder

git clone https://github.com/tesseractocr/tessconfigs.git tesseractconfigs

mv tesseractconfigs/configs.

mv tesseractconfigs/tessconfigs.

rmrf tesseractconfigs

#Build Docker image containing Tesseract

docker buildt tess_layerf Dockerfiletess4.

#Copy Tesseract locally

CONTAINER=$(docker rund tess_layer false)

docker cp$CONTAINER:/opt/builddist layer

docker rm$CONTAINER

##Zip Tesseract

cd layer/

zipr../tesseractlayer.zip.

#Clean

cd..

rmrf layer/

rmrf tessconfigs/

rmrf configs/

將前面步驟生成的zip文件(pythonlibslayer.zip/tesseractlayer.zip)通過AWS Console或者AWS命令行的方式上傳至Lambda Layer,并記錄下對應的ARN,類似arn:awscn:lambda:cnnorthwest1:xxxxxxxx:layer:ocrTesseract:1。

Lambda兼容鏡像的構建

運行時接口客戶端(RIC)作為AWS開源項目,實現(xiàn)了Lambda的運行時API,包括調(diào)用事件檢索,調(diào)用響應返回,調(diào)用錯誤處理和初始化錯誤等功能實現(xiàn)Lambda能正確接收處理調(diào)用并返回結果。運行時接口仿真器(RIE)實際是一個輕量級的web服務器,代理Lambda的運行時和擴展API,使開發(fā)者可以在本地通過Docker,CURL進行本地測試而不用將Lambda容器鏡像部署上云。

接下來我們基于自建鏡像(public.ecr.aws/bitnami/python:3.7)構建Lambda容器的dockerfile并針對其中部分操作進行解釋。

創(chuàng)建entry.sh文件,用作容器在云上部署和本地調(diào)試的自動切換,內(nèi)容如下:

if [ z ${AWS_LAMBDA_RUNTIME_API} ]; then

  exec /usr/local/bin/awslambdarie /usr/local/bin/python m awslambdaric $1

else

  exec /usr/local/bin/python m awslambdaric $1

fi

創(chuàng)建dockerfile(dockerfilecustomtesseract),內(nèi)容摘錄如下,原文件參見這里:

安裝必要工具

ARG LAYER_DIR=/opt

FROM public.ecr.aws/bitnami/python:3.7 as buildimage

RUN aptget update  \

aptget install y \

g++ \

make \

cmake \

unzip \

libcurl4openssldev

RUN pip install opencvpythonheadless

RUN aptget install y libpngdev

安裝運行時接口客戶端(RIC)

RUN mkdir p ${LAYER_DIR}

RUN pip install \

    target ${LAYER_DIR} \

    awslambdaric

取前面步驟生成的Lambda Layer

ARG AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:cnnorthwest1}

ARG AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:xxxx}

ARG AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:xxxx}

ENV AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}

ENV AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}

ENV AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}

RUN aptget instally curl unzip

RUN curlhttps://awscli.amazonaws.com/awscliexelinuxx86_64.zipoawscliv2.zip

RUN unzip awscliv2.zip

RUN./aws/install

#ocrTesseract

RUN curl$(aws lambda getlayerversionbyarnarn arn:awscn:lambda:cnnorthwest1:xx:layer:ocrTesseract:3queryContent.Locationoutput text)output pythonlibslayer.zip

#COPY pythonlibslayer.zip.

RUN unzip pythonlibslayer.zipd${LAYER_DIR}

RUN rm pythonlibslayer.zip

#pythonlibslayer

RUN curl$(aws lambda getlayerversionbyarnarn arn:awscn:lambda:cnnorthwest1:xx:layer:pythonlibslayer:1queryContent.Locationoutput text)output tesseractlayer.zip

#COPY tesseractlayer.zip.

RUN unzip tesseractlayer.zipd${LAYER_DIR}

RUN rm tesseractlayer.zip

打包Lambda業(yè)務代碼(代碼邏輯下一小節(jié)會提到)和entry.sh

#Multistage build:grab a fresh copy of the base image,use custom image instead of official one

FROM public.ecr.aws/bitnami/python:3.7

#Include global arg in this stage of the build

ARG LAYER_DIR

#Copy in the build image dependencies

WORKDIR${LAYER_DIR}

COPYfrom=buildimage${LAYER_DIR}.

COPY app.py.

COPY entry.sh/

RUN chmod 755/entry.sh

ENV LD_LIBRARY_PATH=/opt:/opt/lib:${LD_LIBRARY_PATH}

ENV PATH=/opt:/opt/bin:${PATH}

#Production env

ENTRYPOINT[/entry.sh]

開始構建鏡像并推國際快遞ECR,至此OCR業(yè)務的Lambda鏡像構建完畢

docker buildt locallambdapython3.8customocrbuildarg AWS_DEFAULT_REGION=cnnorthwest1buildarg AWS_ACCESS_KEY_ID=xxbuildarg AWS_SECRET_ACCESS_KEY=xxf dockerfilecustomtesseract.

docker tag locallambdapython3.8customocr:latest xx.dkr.ecr.cnnorthwest1.amazonaws.com.cn/locallambdapython3.8customocr

aws ecr getloginpasswordregion cnnorthwest1docker loginusername AWSpasswordstdin xx.dkr.ecr.cnnorthwest1.amazonaws.com.cn

docker push xx.dkr.ecr.cnnorthwest1.amazonaws.com.cn/locallambdapython3.8customocr:latest

Lambda業(yè)務代碼實現(xiàn)

代碼的調(diào)用邏輯如下,handler接收傳入的圖片文件(u64編碼)并調(diào)用pytesseract實現(xiàn)圖片中文字的識別并返回。

import sys

import os

sys.path.append(/opt/python/lib/python3.7/sitepackages)

# sys.path.append(/opt/python/lib/python3.7/sitepackages/pytesseract)

# sys.path.append(/opt/python/lib/python3.7/sitepackages/PIL)

# sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import base64

import pytesseract

import cv2

def write_to_file(save_path, data):

with open(save_path, wb) as f:

  f.write(base64.b64decode(data))

def handler(event, context=None):

  write_to_file(/tmp/photo.jpg, event[body])

  img = cv2.imread(/tmp/photo.jpg)

  ocr_text = pytesseract.image_to_string(img, config = eng)

  # Return the result data in json format

  return {

   statusCode: 200,

   body: ocr_text

  }

本地調(diào)試驗證

本地安裝RIE,盡量減少Lambda鏡像需要安裝的文件

mkdirp~/.awslambdariecurlLo~/.awslambdarie/awslambdarie

https://github.com/aws/awslambdaruntimeinterfaceemulator/releases/latest/download/awslambdarie

chmod+x~/.awslambdarie/awslambdarie

本地運行容器并通過curl測試結果,其中helloWorld文件為顯示有hello world字樣圖片對應的u64編碼文件,成功的話我們可以看到輸出的hello world。

docker rundv~/.awslambdarie:/awslambdap 9000:8080entrypoint/awslambda/awslambdarie locallambdapython3.8customocr:latest/usr/local/bin/pythonm awslambdaric app.handler

curlX POSThttp://localhost:9000/20150331/functions/function/invocationsd@helloWorld

待功能測試成功后我們可以將該鏡像最終部署上云,無縫對接其他AWS服務實現(xiàn)更加豐富的功能。

對接其他服務

Lambda鏡像構建完畢后,用戶可以結合API Gateway實現(xiàn)HTTP前端調(diào)用來整合我們后端的OCR能力,通過SAM(Serverless Application Model)模版快速構建一個無服務器架構的OCR應用,示例模版部分內(nèi)容如下所示:

Resources:

HelloWorldFunction:

  Type: AWS::Serverless::Function

  Properties:

   PackageType: Image

   Events:

    HelloWorld:

     Type: Api

     Properties:

      Path: /hello

      Method: get

   ImageUrl: ‘xxxx.dkr.ecr.cnnorthwest1.amazonaws.com.cn/locallambdapython3.8custom’

ImageConfig:

   Command:

     app.handler

   EntryPoint:

     /entry.sh

   WorkingDirectory: /opt

  Metadata:

   DockerTag: python3.xv1

   DockerContext: ./helloworld

   Dockerfile: Dockerfile

之后通過SAM CLI實現(xiàn)AWS API Gateway,Lambda以及對應IAM的編譯,調(diào)試和部署,有關SAM的具體的操作參見這里。待服務部署完畢后,用戶可通過調(diào)用類似curl–request POSTH“ContentType:image/png”–databinary“@/path/ocrimage.png”https://xxxx.executeapi.cnnorthwest1.amazonaws.com.cn/prod/upload

命令獲取OCR識別結果。

寫在最后

Lambda針對容器鏡像的支持,將無服務器化,容器這兩個熱門的技術領域進行了完美結合,用戶在原有的容器開發(fā)環(huán)境基礎上利用無服務器化架構的低運維,高擴展,高可用等特性,可以更加便捷的構建和開發(fā)諸如機器學習,圖像識別等數(shù)據(jù)密集型負載應用。


文章推薦
領英常見問題如何提高曝光量
空中云匯如何為入境中國的人民幣付款提供訂單信息
聚集用戶洞察,用戶洞察體系
跨境電商系列  高效監(jiān)控腳本行為,跨境電商寫腳本自動采集


特別聲明:以上文章內(nèi)容僅代表作者本人觀點,不代表ESG跨境電商觀點或立場。如有關于作品內(nèi)容、版權或其它問題請于作品發(fā)表后的30日內(nèi)與ESG跨境電商聯(lián)系。

搜索 放大鏡
韓國平臺交流群
加入
韓國平臺交流群
掃碼進群
歐洲多平臺交流群
加入
歐洲多平臺交流群
掃碼進群
美國賣家交流群
加入
美國賣家交流群
掃碼進群
ESG跨境專屬福利分享群
加入
ESG跨境專屬福利分享群
掃碼進群
拉美電商交流群
加入
拉美電商交流群
掃碼進群
亞馬遜跨境增長交流群
加入
亞馬遜跨境增長交流群
掃碼進群
亞馬遜跨境增長交流群
加入
亞馬遜跨境增長交流群
掃碼進群
拉美電商交流群
加入
拉美電商交流群
掃碼進群
ESG獨家招商-PHH GROUP賣家交流群
加入
ESG獨家招商-PHH GROUP賣家交流群
掃碼進群
2025跨境電商營銷日歷
《2024年全球消費趨勢白皮書——美國篇》
《2024TikTok出海達人營銷白皮書》
《Coupang自注冊指南》
《eMAG知識百科》
《TikTok官方運營干貨合集》
《韓國節(jié)日營銷指南》
《開店大全-全球合集》
《TikTok綜合運營手冊》
《TikTok短視頻運營手冊》
通過ESG入駐平臺,您將解鎖
綠色通道,更高的入駐成功率
專業(yè)1v1客戶經(jīng)理服務
運營實操指導
運營提效資源福利
平臺官方專屬優(yōu)惠

立即登記,定期獲得更多資訊

訂閱
聯(lián)系顧問

平臺顧問

平臺顧問 平臺顧問

微信掃一掃
馬上聯(lián)系在線顧問

icon icon

小程序

微信小程序

ESG跨境小程序
手機入駐更便捷

icon icon

返回頂部