日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力

發(fā)布時間:2024/9/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
簡介:飛槳深度學(xué)習(xí)框架采用基于編程邏輯的組網(wǎng)范式,對于普通開發(fā)者而言更容易上手,同時支持聲明式和命令式編程,兼具開發(fā)的靈活性和高性能。


飛槳 (PaddlePaddle) 以百度多年的深度學(xué)習(xí)技術(shù)研究和業(yè)務(wù)應(yīng)用為基礎(chǔ),是中國首個自主研發(fā)、功能完備、 開源開放的產(chǎn)業(yè)級深度學(xué)習(xí)平臺,集深度學(xué)習(xí)核心訓(xùn)練和推理框架、基礎(chǔ)模型庫、端到端開發(fā)套件和豐富的工具組件于一體。


飛槳深度學(xué)習(xí)框架采用基于編程邏輯的組網(wǎng)范式,對于普通開發(fā)者而言更容易上手,同時支持聲明式和命令式編程,兼具開發(fā)的靈活性和高性能。另外飛槳不僅廣泛兼容第三方開源框架訓(xùn)練的模型部署,并且為不同的場景的生產(chǎn)環(huán)境提供了完備的推理引擎,包括適用于高性能服務(wù)器及云端推理的原生推理庫 Paddle Inference,面向分布式、流水線生產(chǎn)環(huán)境下自動上云、A/B 測試等高階功能的服務(wù)化推理框架 Paddle Serving,針對于移動端、物聯(lián)網(wǎng)場景的輕量化推理引擎 Paddle Lite,以及在瀏覽器、小程序等環(huán)境下使用的前端推理引擎 Paddle.js。同時,透過與不同場景下的主流硬件高度適配優(yōu)化及異構(gòu)計(jì)算的支持, 飛槳的推理性能也領(lǐng)先絕大部分的主流實(shí)現(xiàn)。


安裝飛槳


飛槳可以被認(rèn)為是一個 Python 的依賴庫,官方提供了 pip,conda,源碼編譯等多種安裝方法。以 pip 安裝方法為例,飛槳提供了 CPU 和 GPU 兩個版本安裝方法:


  • CPU 版本安裝方法:

pip install paddlepaddle

  • GPU 版本安裝方法:

pip install paddlepaddle-gpu


實(shí)踐:手寫數(shù)字識別任務(wù)


MNIST 是非常有名的手寫體數(shù)字識別數(shù)據(jù)集,在無論是 Tensorflow 的官方網(wǎng)站還是 PaddlePaddle 的新手入門,都是通過它做實(shí)戰(zhàn)講解,它由手寫體數(shù)字的圖片和相對應(yīng)的標(biāo)簽組成,如:



MNIST 數(shù)據(jù)集分為訓(xùn)練圖像和測試圖像。訓(xùn)練圖像 60000 張,測試圖像 10000 張,每一個圖片代表 0-9 中的一個數(shù)字,且圖片大小均為 28*28 的矩陣。這一小節(jié)將會以 PaddlePaddle 官方提供的 MNIST 手寫數(shù)字識別任務(wù)為例,進(jìn)行 PaddlePaddle 框架的基本學(xué)習(xí)。與其他深度學(xué)習(xí)任務(wù)一樣,飛槳同樣要通過以下四個步驟完成一個相對完整的深度學(xué)習(xí)任務(wù):


  • 數(shù)據(jù)集的準(zhǔn)備和加載;
  • 模型構(gòu)建;
  • 模型訓(xùn)練;
  • 模型評估。

  • 加載內(nèi)置數(shù)據(jù)集


    飛槳框架內(nèi)置了一些常見的數(shù)據(jù)集,在這個示例中,開發(fā)者可以加載飛槳框架的內(nèi)置數(shù)據(jù)集,例如本案例所涉及到的手寫數(shù)字體數(shù)據(jù)集。這里加載兩個數(shù)據(jù)集,一個用來訓(xùn)練模型,一個用來評估模型。


    import paddle.vision.transforms as Ttransform = T.Normalize(mean=[127.5], std=[127.5], data_format='CHW')

    #下載數(shù)據(jù)集

    train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)val_dataset = ?paddle.vision.datasets.MNIST(mode='test', transform=transform)


    模型搭建


    通過 Sequential將一層一層的網(wǎng)絡(luò)結(jié)構(gòu)組建起來。注意,需要先對數(shù)據(jù)進(jìn)行Flatten操作,將 [1, 28, 28] 形狀的圖片數(shù)據(jù)改變形狀為 [1, 784]。


    mnist = paddle.nn.Sequential(

    paddle.nn.Flatten(),

    paddle.nn.Linear(784, 512),

    paddle.nn.ReLU(),

    paddle.nn.Dropout(0.2),

    paddle.nn.Linear(512, 10))


    模型訓(xùn)練


    在訓(xùn)練模型前,需要配置訓(xùn)練模型時損失的計(jì)算方法與優(yōu)化方法,開發(fā)者可以使用飛槳框架提供的prepare完成,之后使用fit接口來開始訓(xùn)練模型。


    # 預(yù)計(jì)模型結(jié)構(gòu)生成模型對象,便于進(jìn)行后續(xù)的配置、訓(xùn)練和驗(yàn)證

    model?=?paddle.Model(mnist)

    # 模型訓(xùn)練相關(guān)配置,準(zhǔn)備損失計(jì)算方法,優(yōu)化器和精度計(jì)算方法model.prepare(paddle.optimizer.Adam(parameters=model.parameters()), paddle.nn.CrossEntropyLoss(),????????????????

    paddle.metric.Accuracy())

    # 開始模型訓(xùn)練

    model.fit(train_dataset,

    epochs=5,

    batch_size=64,

    verbose=1)


    訓(xùn)練結(jié)果:


    The loss value printed in the log is the current step, and the metric is the average value of previous steps.Epoch 1/5step 938/938 [==============================] - loss: 0.1801 - acc: 0.9032 - 8ms/stepEpoch 2/5step 938/938 [==============================] - loss: 0.0544 - acc: 0.9502 - 8ms/stepEpoch 3/5step 938/938 [==============================] - loss: 0.0069 - acc: 0.9595 - 7ms/stepEpoch 4/5step 938/938 [==============================] - loss: 0.0094 - acc: 0.9638 - 7ms/stepEpoch 5/5step?938/938?[==============================]?-?loss:?0.1414?-?acc:?0.9670?-?8ms/step


    模型評估


    開發(fā)者可以使用預(yù)先定義的驗(yàn)證數(shù)據(jù)集來評估前一步訓(xùn)練得到的模型的精度。


    model.evaluate(val_dataset, verbose=0)

    結(jié)果如下:

    {'loss': [2.145765e-06], 'acc': 0.9751}


    可以看出,初步訓(xùn)練得到的模型效果在 97.5% 附近,在逐漸了解飛槳后,開發(fā)者可以通過調(diào)整其中的訓(xùn)練參數(shù)來提升模型的精度。


    與 Serverless 架構(gòu)結(jié)合


    PaddlePaddle 團(tuán)隊(duì)首次開源文字識別模型套件 PaddleOCR,目標(biāo)是打造豐富、領(lǐng)先、實(shí)用的文本識別模型/工具庫。該模型套件是一個實(shí)用的超輕量 OCR 系統(tǒng)。主要由DB文本檢測、檢測框矯正和 CRNN 文本識別三部分組成。該系統(tǒng)從骨干網(wǎng)絡(luò)選擇和調(diào)整、預(yù)測頭部的設(shè)計(jì)、數(shù)據(jù)增強(qiáng)、學(xué)習(xí)率變換策略、正則化參數(shù)選擇、預(yù)訓(xùn)練模型使用以及模型自動裁剪量化 8 個方面,采用 19 個有效策略,對各個模塊的模型進(jìn)行效果調(diào)優(yōu)和瘦身,最終得到整體大小為 3.5M 的超輕量中英文 OCR 和 2.8M 的英文數(shù)字 OCR。


    本地開發(fā)


    # index.py

    import base64

    import bottle

    import random

    from?paddleocr?import?PaddleOCR

    ocr?=?PaddleOCR(use_gpu=False)

    @bottle.route('/ocr', method='POST')

    def login():

    filePath = './temp/' + (''.join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5)))

    with open(filePath, 'wb') as f:

    f.write(base64.b64decode(bottle.request.body.read().decode("utf-8").split(',')[1]))

    ocrResult = ocr.ocr(filePath, cls=False)????

    return?{'result':?[[line[1][0],?float(line[1][1])]?for?line?in?ocrResult]}

    bottle.run(host='0.0.0.0', port=8080)


    開發(fā)完成之后,運(yùn)行該項(xiàng)目:


    pythonindex.py


    可以看到服務(wù)已經(jīng)啟動:



    然后通過 Postman 工具進(jìn)行測試,首先準(zhǔn)備一張圖片(此處以 PaddleOCR 項(xiàng)目內(nèi)置的測試圖片為例):



    通過將圖片轉(zhuǎn)換為 Base64 編碼,并以 POST 方法請求剛剛啟動的 Web 服務(wù),可以看到 PaddleOCR 的執(zhí)行結(jié)果:




    部署到 Serverless 架構(gòu)


    目前各大云廠商的 FaaS 平臺均已經(jīng)逐漸支持容器鏡像部署。所以,可以將項(xiàng)目打包成鏡像,并通過 Serverless Devs 部署到阿里云函數(shù)計(jì)算。


    部署前準(zhǔn)備


    首先需要完成 Dockerfile 文件:


    FROM?python:3.7-slim

    RUN apt update && apt install gcc libglib2.0-dev libgl1-mesa-glx libsm6 libxrender1 -y && pip install paddlepaddle bottle scikit-build paddleocrle?scikit-build?paddleocr

    # Create app directory

    WORKDIR?/usr/src/app

    # Bundle app source

    COPY . .


    編寫符合 Serverless Devs 規(guī)范的 Yaml 文檔:


    # s.yaml

    edition: 1.0.0
    name: paddle-ocr
    access: default
    services:
    paddle-ocr:
    component: fc
    props:
    region: cn-shanghai
    service:
    name: paddle-ocr
    description: paddle-ocr service
    function:
    name: paddle-ocr-function
    runtime: custom-container
    caPort: 8080
    codeUri: ./
    timeout: 60
    customContainerConfig:
    image: 'registry.cn-shanghai.aliyuncs.com/custom-container/paddle-ocr:0.0.1'
    command: '["python"]'
    args: '["index.py"]'
    triggers:
    - name: httpTrigger
    type: http
    config:
    authType: anonymous
    methods:
    - GET
    - POST
    customDomains:
    - domainName: auto
    protocol: HTTP
    routeConfigs:
    - path: /*


    項(xiàng)目部署


    首先構(gòu)建鏡像,此處可以通過 Serverless Devs 進(jìn)行構(gòu)建:


    s build --use-docker



    構(gòu)建完成之后,可以通過工具直接進(jìn)行部署:


    s deploy --push-registry acr-internet --use-local -y


    部署完成,可以看到系統(tǒng)返回的測試地址:



    項(xiàng)目測試


    此時,可以通過該測試地址進(jìn)行測試,同樣得到了預(yù)期效果:



    項(xiàng)目優(yōu)化


    通過對部署在 Serverless 架構(gòu)上的項(xiàng)目進(jìn)行請求,可以看到冷啟動和熱啟動的時間消耗:


    通過冷啟動與熱啟動的對比,我們可以發(fā)現(xiàn),在熱啟動時,整個系統(tǒng)的性能是相對優(yōu)秀的。但是遇到冷啟動整個項(xiàng)目的響應(yīng)時常是不可控的,此時可以考慮一下途徑進(jìn)行優(yōu)化:


  • 縮減容器鏡像的體積,減少不必要的依賴、文件等,清理掉安裝依賴時留下的緩存等;因?yàn)楹瘮?shù)計(jì)算的冷啟動包括鏡像拉取時間;
  • 部分流程進(jìn)行優(yōu)化,例如在 PaddleOCR 項(xiàng)目中有明確說明:“paddleocr 會自動下載 ppocr 輕量級模型作為默認(rèn)模型”,所以這就意味著該項(xiàng)目在 Serverless 架構(gòu)的冷啟動過程中,相對比熱啟動還增加了一個模型下載和解壓的流程,所以這一部分在必要時是可以打入到容器鏡像中,進(jìn)而減少冷啟動帶來的影響;
  • 開啟鏡像加速,可以有效降低容器鏡像的冷啟動,在阿里云函數(shù)計(jì)算官方文檔中有相關(guān)鏡像加速的性能測試描述:“開啟函數(shù)計(jì)算的鏡像加速后,可提速 2~5 倍,將分鐘級的鏡像拉取縮短至秒級”;
  • 實(shí)例預(yù)留,最大程度上降低冷啟動率。通過實(shí)例預(yù)留,可以通過多種算法/策略進(jìn)行實(shí)例的預(yù)熱和預(yù)啟動,可以最大程度上降低 Serverless 架構(gòu)冷啟動帶來的影響;

  • 原文鏈接:https://developer.aliyun.com/article/793805?

    版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。