OCR分析調(diào)研報(bào)告
摘要
本文簡(jiǎn)要概述了OCR的概念和應(yīng)用場(chǎng)景,以及OCR常用算法解決方案。最主要的是調(diào)研并對(duì)比了幾個(gè)github上star較多的開源項(xiàng)目?,F(xiàn)階段推薦百度開源的項(xiàng)目paddlocr,可直接使用其預(yù)訓(xùn)練模型進(jìn)行演示,并且支持docker部署(實(shí)踐通過)??梢灾С稚矸葑C,車牌號(hào),信用卡號(hào)識(shí)別。并且paddleocr 支持重新訓(xùn)練模型,以及圖像標(biāo)注工具。擴(kuò)展性強(qiáng)。
一. OCR是什么
OCR (Optical Character Recognition,光學(xué)字符識(shí)別)
從圖像化的文本信息中提取到文字符號(hào)做表征的語義信息,其重要性不言而喻,在實(shí)際應(yīng)用場(chǎng)景中也比較容易想到跟NLP技術(shù)結(jié)合來完成比較優(yōu)質(zhì)的人機(jī)交互等任務(wù)。
二. OCR分類和算法解決方案
1. OCR分類和挑戰(zhàn)
按文字類型分類
手寫體識(shí)別和印刷體識(shí)別。這兩個(gè)可以認(rèn)為是OCR領(lǐng)域兩個(gè)大主題了,當(dāng)然印刷體識(shí)別較手寫體識(shí)別要簡(jiǎn)單得多,印刷體大多都是規(guī)則的字體,因?yàn)檫@些字體都是計(jì)算機(jī)自己生成再通過打印技術(shù)印刷到紙上。在印刷體的識(shí)別上有其獨(dú)特的干擾:在印刷過程中字體很可能變得斷裂或者墨水粘連,使得OCR識(shí)別異常困難。當(dāng)然這些都可以通過一些圖像處理的技術(shù)幫他盡可能的還原,進(jìn)而提高識(shí)別率??偟膩碚f,單純的印刷體識(shí)別在業(yè)界已經(jīng)能做到很不錯(cuò)了,但說100%識(shí)別是肯定不可能的,但是說識(shí)別得不錯(cuò)那是沒毛病。
按識(shí)別場(chǎng)景分類
可大致將 OCR 分為識(shí)別特定場(chǎng)景的專用 OCR 和識(shí)別多種場(chǎng)景的通用 OCR。比如車牌識(shí)別就是對(duì)特定場(chǎng)景的OCR,而對(duì)工業(yè)場(chǎng)景中的文字識(shí)別則是通用場(chǎng)景OCR。例如醫(yī)藥品包裝上的文字、各種鋼制部件上的文字、容器表面的噴涂文字、商店標(biāo)志上的個(gè)性文字等。在這樣的圖像中,字符部分可能出現(xiàn)在彎曲陣列、曲面異形、斜率分布、皺紋變形、不完整等各種形式中,并且與標(biāo)準(zhǔn)字符的特征大不相同,因此其識(shí)別難度相對(duì)困難。
按應(yīng)用場(chǎng)景分類
1、結(jié)構(gòu)化文本
結(jié)構(gòu)化的文本識(shí)別應(yīng)用場(chǎng)景包括識(shí)別車牌、身份證、火車票、增值稅發(fā)票、銀行卡、護(hù)照、快遞單等小垂類。這些小垂類的共同特點(diǎn)是格式固定,因此非常適合使用OCR技術(shù)進(jìn)行自動(dòng)化,可以極大的減輕人力成本,提升效率,也是目前OCR應(yīng)用最廣泛、并且技術(shù)相對(duì)較成熟的場(chǎng)景。
2、視頻場(chǎng)景
除了面向垂類的結(jié)構(gòu)化文本識(shí)別,通用OCR也有很多應(yīng)用,其中一個(gè)熱門的應(yīng)用場(chǎng)景是視頻。視頻里面常見文字包括:字幕、標(biāo)題、廣告、彈幕等。
OCR 面臨挑戰(zhàn)
對(duì)應(yīng)到OCR技術(shù)實(shí)現(xiàn)問題上,則一般面臨仿射變換、尺度問題、光照不足、拍攝模糊等技術(shù)難點(diǎn); 另外OCR應(yīng)用常對(duì)接海量數(shù)據(jù),因此要求數(shù)據(jù)能夠得到實(shí)時(shí)處理;并且OCR應(yīng)用常部署在移動(dòng)端或嵌入式硬件,而端側(cè)的存儲(chǔ)空間和計(jì)算能力有限,因此對(duì)OCR模型的大小和預(yù)測(cè)速度有很高的要求。
2. OCR算法解決方案
1)傳統(tǒng)特征提取方案
特征提取、分類性設(shè)計(jì)等相關(guān)的基礎(chǔ)技術(shù)
2)文本檢測(cè)+文本識(shí)別,two-stage方案
- 文本檢測(cè):檢測(cè)出輸入圖片中文字所在區(qū)域。
CTPN:基于回歸的算法。
CTPN是ECCV 2016提出的一種基于box回歸文字檢測(cè)算法,由Faster RCNN改進(jìn)而來,結(jié)合了CNN與LSTM深度網(wǎng)絡(luò),其支持任意尺寸的圖像輸入,并能夠直接在卷積層中定位文本行。
CTPN檢測(cè)橫向分布的文字效果較好。由于算法中加入了雙向LSTM學(xué)習(xí)文本的序列特征,有利于文字的檢測(cè),但是LSTM的不易訓(xùn)練問題需謹(jǐn)慎。是目前比較成熟的文本檢測(cè)框架,精確度較好。但是檢測(cè)時(shí)間較長(zhǎng),有很大的優(yōu)化空間。預(yù)測(cè)文本的豎直方向上的位置,水平方向的位置不預(yù)測(cè)。對(duì)于非水平的文字不能檢測(cè)。這類算法對(duì)規(guī)則形狀文本檢測(cè)效果較好,但無法準(zhǔn)確檢測(cè)不規(guī)則形狀文本。
PSENet:基于分割的算法
這類算法不受文本形狀的限制,對(duì)各種形狀的文本都能取得較好的效果,但是往往后處理比較復(fù)雜,導(dǎo)致耗時(shí)嚴(yán)重。目前也有一些算法專門針對(duì)這個(gè)問題進(jìn)行改進(jìn),如DB,將二值化進(jìn)行近似,使其可導(dǎo),融入訓(xùn)練,從而獲取更準(zhǔn)確的邊界,大大降低了后處理的耗時(shí)。
- 文本識(shí)別
基于CTC的算法:CRNN
CNN+RNN+CTC是一個(gè)很經(jīng)典的端到端模型,總體來說就是用CNN提取圖片特征;將提取到的特征轉(zhuǎn)換成特征序列作為RNN的輸入,用于對(duì)卷積層輸出的特征序列的每一幀進(jìn)行預(yù)測(cè);最后使用CTC算法將循環(huán)層的每幀預(yù)測(cè)轉(zhuǎn)化為標(biāo)簽序列。因?yàn)镽NN可以處理任意長(zhǎng)度的序列,所以僅僅需要固定輸入圖片的高度,寬度不定長(zhǎng)。CRNN是目前最為廣泛的一種文本識(shí)別框架。需要自己構(gòu)建字詞庫(包含常用字、各類字符等)。
基于Attention的算法
attention機(jī)制雖然很火,做英文識(shí)別效果確實(shí)也非常好,但是做中文尤其是中文長(zhǎng)文本識(shí)別可能是干不過CTC的。并且Attention的串行解碼結(jié)構(gòu)限制了預(yù)測(cè)速度。
3)端到端方案
端到端在文字分布密集的業(yè)務(wù)場(chǎng)景,效率會(huì)比較有保證,精度的話看自己業(yè)務(wù)數(shù)據(jù)積累情況,如果行級(jí)別的識(shí)別數(shù)據(jù)積累比較多的話two-stage會(huì)比較好。百度的落地場(chǎng)景,比如工業(yè)儀表識(shí)別、車牌識(shí)別都用到端到端解決方案。
三. OCR開源項(xiàng)目調(diào)研
1. EasyOCR
全語種的(包括70+門外語識(shí)別),不單單針對(duì)中文,所以它的官方文檔是英文。
速度太慢,一張6行文字的圖用了近5分鐘,官方推薦支持CUDA的獨(dú)立顯卡可以提高運(yùn)行效率
demo實(shí)驗(yàn)如下
[([[92, 379], [807, 379], [807, 494], [92, 494]], ‘最美的不是下雨天’, 0.9265730284655984), ([[23, 523], [898, 523], [898, 637], [23, 637]], ‘是曾與你躲過雨的屋檐’, 0.7645155572775529)]
耗時(shí): 12.126248359680176 s
2. chineseocr
它基于 YOLO V3 與 CRNN 實(shí)現(xiàn)中文自然場(chǎng)景文字檢測(cè)及識(shí)別
如果要做個(gè)性化的話,Chineseocr框架相對(duì)來說非常方便,只需要修改對(duì)應(yīng)模塊的函數(shù)就可以,因?yàn)楸旧磉@些模塊其實(shí)就是可擴(kuò)展的,比如后續(xù)pull request到項(xiàng)目里的lstm推理和ncnn核擴(kuò)展。
3. chineseocr_lite
超輕量級(jí)中文ocr,支持豎排文字識(shí)別, 支持ncnn推理 , psenet(8.5M) + crnn(6.3M) + anglenet(1.5M) 總模型僅17M。
相比 chineseocr,chineseocr_lite 采用了輕量級(jí)的主干網(wǎng)絡(luò) PSENet,輕量級(jí)的 CRNN 模型和行文本方向分類網(wǎng)絡(luò) AngleNet。盡管要實(shí)現(xiàn)多種能力,但 chineseocr_lite 總體模型只有 17M。目前 chineseocr_lite 支持任意方向文字檢測(cè),在識(shí)別時(shí)會(huì)自動(dòng)判斷文本方向。
demo實(shí)驗(yàn)如下
4. cnocr
(愛因互動(dòng) Ein+) 內(nèi)部的項(xiàng)目需求
cnocr 是 Python 3 下的中英文OCR工具包,自帶了多個(gè)訓(xùn)練好的識(shí)別模型(最小模型僅 4.7M
),安裝后即可直接使用。
cnocr 主要針對(duì)的是排版簡(jiǎn)單的印刷體文字圖片,如截圖圖片,掃描件等。目前內(nèi)置的文字檢測(cè)和分行模塊無法處理復(fù)雜的文字排版定位。如果要用于場(chǎng)景文字圖片的識(shí)別,需要結(jié)合其他的場(chǎng)景文字檢測(cè)引擎使用,例如同樣基于 MXNet 的文字檢測(cè)引擎 cnstd 。
5. PaddleOCR
百度開源項(xiàng)目,文檔完善,2020年6月開源。PaddleOCR 旨在打造一套豐富、領(lǐng)先、且實(shí)用的 OCR 工具庫,助力使用者訓(xùn)練出更好的模型,并應(yīng)用落地。
PaddleOCR 是基于飛槳的 OCR 工具庫,包含總模型僅8.6M的超輕量級(jí)中文 OCR,單模型支持中英文數(shù)字組合識(shí)別、豎排文本識(shí)別、長(zhǎng)文本識(shí)別。同時(shí)支持多種文本檢測(cè)、文本識(shí)別的訓(xùn)練算法。
demo實(shí)驗(yàn)如下
6. tesseract
谷歌開源項(xiàng)目,支持100多種語言。中文效果不如paddlepaddle-ocr,識(shí)別時(shí)間較長(zhǎng),需優(yōu)化。
7. OpenMMLab
OpenMMLab基本囊括了所有計(jì)算機(jī)視覺任務(wù)。OpenMMlab系列的開源項(xiàng)目,代碼模塊化、抽象做得比較好,容易拓展,對(duì)新手不太友好,但是對(duì)相對(duì)資深的從業(yè)者,適合學(xué)術(shù)研究和打比賽。
OpenMMLab將MMDetection打造成了一個(gè)爆款,目標(biāo)檢測(cè)在所有計(jì)算機(jī)視覺任務(wù)中是重要性和難度結(jié)合得最好的任務(wù)。分類很重要,但是分類非常簡(jiǎn)單,實(shí)現(xiàn)起來難度不大;實(shí)例分割實(shí)現(xiàn)起來難度較大,但是卻沒那么重要。MMDetection緊跟學(xué)術(shù)前沿,基本所有目標(biāo)檢測(cè)模型都能在MMDetection中找到。
商湯的品牌背書,商湯公司的推廣,再加上MMDetection這個(gè)爆款,整個(gè)OpenMMLab系列后面推出的開源項(xiàng)目都可以得到足夠的流量和用戶。
8. Azure
提供API。官網(wǎng)上有具體的調(diào)制配置參數(shù)。中國區(qū)是由世紀(jì)互聯(lián)運(yùn)營的。可以上官網(wǎng)(不是中國區(qū)的)上傳圖片體驗(yàn)一下微軟的ocr識(shí)別。微軟暫時(shí)只支持22種語言。
9. 付費(fèi)OCR
1)騰訊OCR(付費(fèi))
2)ABBYY(付費(fèi))
識(shí)別率高,ABBYY也開始提供實(shí)時(shí)翻譯sdk了,安卓,iOS都支持,目前支持持63種識(shí)別語言,包括24種語言跟字典支持;而且還有中文網(wǎng)站。
3)阿里OCR(付費(fèi))
四. 主要開源項(xiàng)目對(duì)比和結(jié)論
1. 準(zhǔn)確率對(duì)比
2. 綜合對(duì)比
項(xiàng)目名稱 | 優(yōu)缺點(diǎn) | 內(nèi)容 |
---|---|---|
1. EasyOCR | 優(yōu)點(diǎn) | 支持全語種(包括70+門外語識(shí)別) |
缺點(diǎn) | 速度慢,兩行文字要7-12秒(親測(cè)) | |
部署 | pip安裝,只能linux/windows下運(yùn)行,使用獨(dú)立顯卡可以提高運(yùn)行效率; | |
2. chineseocr | 缺點(diǎn) | 目前極少更新維護(hù) |
3. chineseocr_lite | 優(yōu)點(diǎn) | 速度快,1秒以內(nèi),模型輕巧,準(zhǔn)確率比Easyocr高 |
缺點(diǎn) | 不支持自定義訓(xùn)練;不支持復(fù)雜、不常見字符,比如德語、法語;豎向文本識(shí)別錯(cuò)誤 | |
部署 | 無法pip安裝,要git clone 下載安裝 | |
4.cnocr | 優(yōu)點(diǎn) | 區(qū)域檢測(cè)和內(nèi)容識(shí)別效果都很高 |
缺點(diǎn) | start星最低,目前極少更新維護(hù) | |
部署 | pip安裝,doker部署 | |
5. PaddleOCR | 優(yōu)點(diǎn) | 百度準(zhǔn)確率高,支持英文、法語、德語、韓語、日語,支持自訓(xùn)練,支持傾斜、豎排等多種方向文字識(shí)別 |
缺點(diǎn) | 偏向中文識(shí)別,語言支持有限 | |
部署 | 支持本地部署,云端部署,手機(jī)端集成部署,docker | |
6. tesseract | 優(yōu)點(diǎn) | 谷歌開源,支持100多種語言,英文和數(shù)字識(shí)別準(zhǔn)確率高 |
缺點(diǎn) | 單純中文識(shí)別準(zhǔn)確率需優(yōu)化 | |
部署 | c或c++ API |
3. 結(jié)論
- 如果要求支持中文,建議使用百度開源的paddle ocr
理由:中文支持友好,文檔完善,有標(biāo)注工具,方便后期訓(xùn)練,優(yōu)化模型。部署簡(jiǎn)單。面向工業(yè)化場(chǎng)景。
其他:使用GPU機(jī)器可提高計(jì)算效率,目前的CPU 上識(shí)別速度大概0.9s。
- 如果要求支持多語言,建議使用谷歌開源的 tesseract。支持100多種語言。使用人數(shù)最多。
五. Paddle OCR落地方案
1. 快速安裝
linux 安裝,安裝PaddlePaddle 2.0 (支持動(dòng)態(tài)圖)
pip3 install --upgrade pip
如果您的機(jī)器是CPU,請(qǐng)運(yùn)行以下命令安裝
python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple
更多的版本需求,請(qǐng)參照安裝文檔中的說明進(jìn)行操作。
克隆PaddleOCR repo代碼
git clone https://github.com/PaddlePaddle/PaddleOCR
安裝第三方庫
cd PaddleOCR
pip3 install -r requirements.txt
2. 如何部署
1)PaddleHub Serving的服務(wù)部署 [API]
使用PaddleHub能夠快速進(jìn)行模型預(yù)測(cè),但開發(fā)者常面臨本地預(yù)測(cè)過程遷移線上的需求。無論是對(duì)外開放服務(wù)端口,還是在局域網(wǎng)中搭建預(yù)測(cè)服務(wù),都需要PaddleHub具有快速部署模型預(yù)測(cè)服務(wù)的能力。在這個(gè)背景下,模型一鍵服務(wù)部署工具——PaddleHub Serving應(yīng)運(yùn)而生。開發(fā)者通過一行命令即可快速啟動(dòng)一個(gè)模型預(yù)測(cè)在線服務(wù),而無需關(guān)注網(wǎng)絡(luò)框架選擇和實(shí)現(xiàn)。
PaddleHub提供便捷的模型轉(zhuǎn)服務(wù)的能力,只需簡(jiǎn)單一行命令即可完成模型的HTTP服務(wù)部署。
啟動(dòng)服務(wù)
# 安裝paddlehub
pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
#命令行啟動(dòng)
hub serving start --port 8866 --use_multiprocess 2 --workers 2
#配置文件啟動(dòng)
cd PaddleOCR
hub serving start -c deploy/hubserving/ocr_system/config.json
#如果使用gpu
export CUDA_VISIBLE_DEVICES=0
hub serving start -c deploy/hubserving/ocr_system/config.json
#命令行啟動(dòng)
hub serving start --modules ocr_system==1.0.0 \
--port 8869 --use_multiprocess false --workers 2
啟動(dòng)客戶端測(cè)試
python tools/test_hubserving.py
輸出數(shù)據(jù)格式
[{'confidence': 0.9275153279304504, 'text': '遼AD4539', 'text_region': [[213, 204], [316, 199], [317, 229], [214, 234]]}]
2)docker部署
和官網(wǎng)的操作步驟不同,有適當(dāng)?shù)恼{(diào)整,已經(jīng)實(shí)踐通過,推薦使用。docker鏡像大小15.6G。實(shí)驗(yàn)的是CPU版本,識(shí)別速度在1s以內(nèi)。如果有GPU可以加快速度。
步驟1: 下載PaddleOCR項(xiàng)目
git clone https://github.com/PaddlePaddle/PaddleOCR.git
步驟2: 下載模型文件,解壓放到目錄PaddleOCR/inference下
步驟3: 在同級(jí)目錄下增加Dockerfile文件
Dockerfile文件內(nèi)容如下
#Paddle Version: 2.0.0
FROM paddlepaddle/paddle:2.0.2
# PaddleOCR base on Python3.7
RUN pip3.7 install --upgrade pip -i https://mirror.baidu.com/pypi/simple
RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
WORKDIR /
COPY ./PaddleOCR /PaddleOCR
WORKDIR /PaddleOCR
RUN pip3.7 install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
EXPOSE 8868
CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -c deploy/hubserving/ocr_system/config.json"]
步驟4: 生成鏡像, 啟動(dòng)paddleocr容器
#從Dockerfile生成鏡像
docker build -t paddleocr:cpu .
#啟動(dòng)docker容器
sudo docker run -d -p 8868:8868 --name paddle_ocr paddleocr:cpu
#檢查服務(wù)運(yùn)行
docker logs -f paddle_ocr
#檢查服務(wù)運(yùn)行
cd PaddleOCR
python tools/test_hubserving.py
#保存鏡像
docker save -o paddleocr-cpu.tar paddleocr:cpu
#加載鏡像
docker load -i paddleocr-cpu.tar
更新部署
使用paddlepaddl2.1.0版本
/PaddleOCR-release-2.1/deploy/hubserving/ocr_system/config.json
{
"modules_info": {
"ocr_system": {
"init_args": {
"version": "1.0.0",
"use_gpu": false
},
"predict_args": {
}
}
},
"port": 8869,
"use_multiprocess": true,
"workers": 6
}
使用6核,多線程,端口使用8869
sudo docker run -d -p 8869:8869 --name paddle_ocrv2 paddleocr:cpuv2
3)其他部署方式
手機(jī)端部署
python方式部署
c++方式部署
PS: 端口占用解決方法
停止 doker 進(jìn)程,刪除所有容器,然后刪除 local-kv.db 這個(gè)文件,再啟動(dòng) docker 就可以了。
sudo service docker stop
docker rm $(docker ps -aq)
sudo rm /var/lib/docker/network/files/local-kv.db
sudo systemctl restart docker
3. 如何優(yōu)化,重新訓(xùn)練
PaddleOCR:車牌識(shí)別
(1)訓(xùn)練數(shù)據(jù)的數(shù)量和需要解決問題的復(fù)雜度有關(guān)系。難度越大,精度要求越高,則數(shù)據(jù)集需求越大,而且一般情況實(shí)際中的訓(xùn)練數(shù)據(jù)越多效果越好。
(2)對(duì)于精度要求不高的場(chǎng)景,檢測(cè)任務(wù)和識(shí)別任務(wù)需要的數(shù)據(jù)量是不一樣的。對(duì)于檢測(cè)任務(wù),500張圖像可以保證基本的檢測(cè)效果。對(duì)于識(shí)別任務(wù),需要保證識(shí)別字典中每個(gè)字符出現(xiàn)在不同場(chǎng)景的行文本圖像數(shù)目需要大于200張(舉例,如果有字典中有5個(gè)字,每個(gè)字都需要出現(xiàn)在200張圖片以上,那么最少要求的圖像數(shù)量應(yīng)該在200-1000張之間),這樣可以保證基本的識(shí)別效果。
4. 數(shù)據(jù)標(biāo)注與合成
-
半自動(dòng)數(shù)據(jù)標(biāo)注工具PPOCRLabel:支持快速高效的數(shù)據(jù)標(biāo)注
安裝PPOCRLabel
pip3 install pyqt5 pip3 install trash-cli cd ./PPOCRLabel # 將目錄切換到PPOCRLabel文件夾下 python3 PPOCRLabel.py --lang ch
-
數(shù)據(jù)合成工具Style-Text:批量合成大量與目標(biāo)場(chǎng)景類似的圖像
參考文獻(xiàn)
一個(gè)關(guān)于OCR/STR深度學(xué)習(xí)算法的綜述
OCR綜述—持續(xù)更新
對(duì)比了最常見的幾家開源OCR框架,我發(fā)現(xiàn)了最好的開源模型
PaddleOCR 使用教程
GluonCV、OpenMMLab、Paddle系列算法框架對(duì)比與思考
最好的開源或開放API的ocr引擎是什么?
OCR技術(shù)綜述
PaddleOCR
OCR技術(shù)初步解析文章來源:http://www.zghlxwxcb.cn/news/detail-497474.html
金連文:“文字檢測(cè)與識(shí)別:現(xiàn)狀及展望”文章來源地址http://www.zghlxwxcb.cn/news/detail-497474.html
到了這里,關(guān)于OCR調(diào)研報(bào)告的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!