Last Updated on 2024-07-20 by Clay
介紹
最近我在探索一些用來進行光學字元辨識(Optical character recognition, OCR)的模型,早些年 OCR 是研究非常熱門的領域,畢竟是電腦視覺最早可落地應用的領域;但是到了今日,OCR 也已經是非常成熟的任務了,上網一找,便可以找到性能很好的開源模型。
當然,今日主要聚焦於中文 OCR,尤其是介紹 PaddleOCR 這個架構與模型。如果是英文的 OCR,想必會有更多的模型可供選擇吧!
約 2018 到 2020 這段期間我還在研究所,也曾經協助過指導教授進行 OCR 的研究。當時我們是使用 UNet 來找出影像中所有的中文字,以字為單位切成一張張圖片,經過縮放、對比增強等一系列前處理,再交由我們微調後的 VGG 模型進行幾千分類(因為中文常見字約有幾千字)。雖然最後在我們的資料集上達成了一定的成績,但是最終仍沒能挑戰其他領域的資料集,算是稍微有些可惜。
話題扯遠了,今日我想介紹的 PaddleOCR,是由百度飛槳 AI Studio 所開源的一個 OCR 架構,在中文辨識的任務中效果好得讓我驚為天人,不由地就去簡單探索其作法,故筆記於此,權作個分享。
PaddleOCR 架構
以下分成兩部份介紹,首先來介紹圖片進入處理流程後,使用哪些不同的方法辨識文字框、接下來則是使用不同的模型去預測圖片中的文字。但這部份由於一一展開實在太長,或許留到日後再去細究,不過對我個人來說優先度比較低。
不過上述與其說是 PaddleOCR 的架構,不如說許多的 OCR 都是走這樣的流程。
PaddleOCR 使用方式
如果是希望能夠利用 GPU 加速 OCR 的辨識速度,那在開始應用 PaddleOCR 前,需要事先確認已經安裝好 CUDA 以及 CuDNN 的函式庫。如果希望使用 docker 容器來佈署與測試,我個人推薦 nvidia/cuda:12.2.2-cudnn8-devel-ubuntu20.04 這個 image,可以直接無痛開始使用 PaddleOCR。
以下根據是否要 GPU 版本,擇一安裝。
# GPU
pip install paddlepaddle-gpu
# CPU
pip install paddlepaddle
接著安裝 PaddleOCR 的套件本體:
pip install paddleocr
接著,你可以參考以下程式碼進行 OCR 的測試。有趣的是,官方的程式碼中要求要使用 simfang.ttf 這個字體。如果真的需要,你可以去這裡下載。
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
# OCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
img_path = "./program_data/clay_blog.png"
result = ocr.ocr(img_path, cls=True)
# Print Text
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)
# Show the image with bounding boxes
result = result[0]
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./program_data/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save("ocr_result.jpg")
Output:
這是我的部落格的其中一篇文章縮圖與摘要,可以看到抓的文字還是抓得滿不錯的!雖然有漏掉一行,不過我給它的解析度本來就很低,能抓得如此精確已經讓我非常滿意了。
References
辨識文字框
1. EAST (Efficient and Accurate Scene Text Detector)
論文:EAST: An Efficient and Accurate Scene Text Detector
2. DB (Differentiable Binarization)
論文:Real-time Scene Text Detection with Differentiable Binarization
3. SAST (Segmentation-based Text Detector)
論文:A Single-Shot Arbitrarily-Shaped Text Detector based on Context Attended Multi-Task Learning