cnocr是用來做中文OCR的Python 3包。cnocr自帶了訓練好的識別模型,安裝後即可直接使用。cnocr主要針對的是排版簡單的印刷體文字圖片,如截圖圖片,掃描件等。cnocr目前內置的文字檢測和分行模塊無法處理複雜的文字排版定位。如果要用於場景文字圖片的識別,需要結合其他的場景文字檢測引擎使用。
EasyOCR 是一個使用 Java 語言實現的 OCR 識別引擎(基於Tesseract)。藉助幾個簡單的API,即能使用Java語言完成圖片內容識別工作。併集成了圖片清理、識別 CAPTCHA 驗證碼圖片,票據等內容的一體化工作。EasyOCR不僅可以為消費者提供服務,更主要面向開發,能夠提供本地化的開發SDK集成,與 C/S,B/S 及 Android 移動端項目進行原生集成。
PaddleOCR是一個與OCR相關的開源項目,不僅支持超輕量級中文OCR預測模型,總模型僅8.6M(單模型支持中英文數字組合識別、豎排文本識別、長文本識別,其中檢測模型DB(4.1M)+識別模型CRNN(4.5M)),而且提供多種文本檢測訓練算法(EAST、DB)和多種文本識別訓練算法(Rosetta、CRNN、STAR-Net、RARE)。
easyocr、paddleocr、cnocr是目前比較常見的開源OCR組件,提供了標註、訓練、調用等功能,對於高清、標準的圖片和證件照的識別問題都不大,但對於拍攝效果、角度、以及物件本身的模糊問題識別的效果,還是有很大區別的。
個人測試情況如下:
import easyocr
# 創建reader對象
reader = easyocr.Reader(['ch_sim','en'],gpu=False)
# 讀取圖像
result = reader.readtext('C:\Python\Pycharm\dzp.jpg')
# 結果
# print(result)
# [([[317, 131], [485, 131], [485, 175], [317, 175]], '晶序列號', 0.8012555837631226),
# ([[1127, 147], [1319, 147], [1319, 183], [1127, 183]], '031094', 0.2800997197628021),
# ([[],[],[],[]],' ',0.0),
for box_info in result:
print('坐標=', box_info[0])
print('文字=', box_info[1])
print('概率=', box_info[2])
# 坐標= [[317, 131], [485, 131], [485, 175], [317, 175]]
# 文字= 晶序列號
# 概率= 0.8012555837631226
from cnstd import CnStd
from cnocr import CnOcr
std = CnStd()
cn_ocr = CnOcr()
box_info_list = std.detect('C:\Python\Pycharm\dzp.jpg')
#print('box_info_list=',box_info_list)
for box_info in box_info_list:
# {'box': array([[320, 934],[790, 934],[790, 976],[320, 976]]),
# 'score': 1.0,
# 'cropped_img': array([[[83, 85, 82],[84, 86, 83],[81, 87, 83]],
# [[86, 88, 85],[84, 86, 83],[83, 85, 82],[],[],[]]
# ], dtype=uint8)}
cropped_img = box_info['cropped_img'] # 檢測出的文本框
ocr_res = cn_ocr.ocr_for_single_line(cropped_img)
print('ocr result: %s' % ''.join(ocr_res))
# ocr result:
# ocr result: 更痤國盔
# ocr result: 開擅查立
# ocr result: oN
# ocr result: H
# ocr result: Hv
# ocr result: !/油麵人
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory
img_path = 'C:\Python\Pycharm\dzp.jpg'
result = ocr.ocr(img_path, cls=True)
for line in result:
print(line)
# [[[272.0, 121.0], [486.0, 126.0], [486.0, 175.0], [272.0, 171.0]], ['產品序列號', 0.9959299]]
# [[[272.0, 168.0], [436.0, 173.0], [436.0, 216.0], [272.0, 211.0]], ['製造年月', 0.9986]]
對於各OCR組件訓練標註和完整開發過程尚未學習,估計訓練後不同組件識別率會有很大提升空間,此外效率與GPU伺服器也有很大關係,後續慢慢嘗試吧