PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
飛槳 (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ù):
加載內(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)化:
原文鏈接: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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DataWorks功能实践速览 05——
- 下一篇: 云栖大会|感受万物数字化,体验千行视频化