更好地理解圖片:場景文字檢測工具 cnstd

透過識別圖片中的文字,我們可以更好地理解圖片的內容。

cnstd

https://github.com/breezedeus/cnstd

) 是

Python 3

下的

場景文字檢測

Scene Text Detection

,簡稱

STD

)工具包,自帶了多個訓練好的檢測模型,安裝後即可直接使用。當前的文字檢測模型使用的是 PSENet,目前支援兩種 backbone 模型:

mobilenetv3

resnet50_v1b

。它們都是在

ICPR

ICDAR15

的 11000 張訓練集圖片上訓練得到的。

如需要識別文字框中的文字,可以結合

OCR

工具包

cnocr

https://github.com/breezedeus/cnocr

) 一起使用。

示例

更好地理解圖片:場景文字檢測工具 cnstd

文字檢測工具 cnstd 示例

安裝

嗯,安裝真的很簡單。

pip install cnstd

【注意】:

請使用Python3 (3。4, 3。5, 3。6以及之後版本應該都行),沒測過Python2下是否ok。

依賴opencv,所以可能需要額外安裝opencv。

已有模型

當前的文字檢測模型使用的是PSENet,目前包含兩個已訓練好的模型,分別對應兩種backbone模型:mobilenetv3 和 resnet50_v1b。它們都是在ICPR和ICDAR15訓練資料上訓練得到的。

更好地理解圖片:場景文字檢測工具 cnstd

文字檢測工具 cnstd 自帶模型

模型

resnet50_v1b

精度略高於模型

mobilenetv3

使用方法

首次使用

cnstd

時,系統會自動下載zip格式的模型壓縮檔案,並存放於

~/.cnstd

目錄(Windows下預設路徑為

C:\Users\<username>\AppData\Roaming\cnstd

)。 下載後的zip檔案程式碼會自動對其解壓,然後把解壓後的模型相關目錄放於~/。cnstd/0。1。0目錄中。

如果系統無法自動成功下載zip檔案,則需要手動從 百度雲盤(提取碼為 4ndj)下載對應的zip檔案並把它存放於

~/.cnstd/0.1.0

(Windows下為

C:\Users\<username>\AppData\Roaming\cnstd\0.1.0

)目錄中。放置好zip檔案後,後面的事程式碼就會自動執行了。

圖片預測

使用類 CnStd 進行場景文字的檢測。類 CnStd 的初始化函式如下:

class CnStd(object): “”“ 場景文字檢測器(Scene Text Detection)。雖然名字中有個”Cn“(Chinese),但其實也可以輕鬆識別英文的。 ”“” def __init__( model_name=‘mobilenetv3’, model_epoch=None, root=data_dir(), context=‘cpu’, name=None, ):

其中的幾個引數含義如下:

model_name: 模型名稱,即上面表格第一列中的值,目前僅支援取值為 mobilenetv3 和 resnet50_v1b。預設為 mobilenetv3 。

model_epoch: 模型迭代次數。預設為 None,表示使用系統自帶的模型對應的迭代次數。對於模型名稱 mobilenetv3就是 59。

root: 模型檔案所在的根目錄。Linux/Mac下預設值為 ~/。cnstd,表示模型檔案所處資料夾類似 ~/。cnstd/0。1。0/mobilenetv3。Windows下預設值為 C:\Users\\AppData\Roaming\cnstd。

context:預測使用的機器資源,可取值為字串cpu、gpu,或者 mx。Context例項。

name:正在初始化的這個例項的名稱。如果需要同時初始化多個例項,需要為不同的例項指定不同的名稱。

每個引數都有預設取值,所以可以不傳入任何引數值進行初始化:std = CnStd()。

文字檢測使用類CnOcr的函式

detect()

,以下是詳細說明:

類函式CnStd。detect(img_fp, max_size, pse_threshold, pse_min_area)

函式說明

輸入引數 img_fp: 可以是需要識別的圖片檔案路徑,或者是已經從圖片檔案中讀入的陣列,型別可以為mx。nd。NDArray 或 np。ndarray,取值應該是[0,255]的整數,維數應該是(height, width, 3),第三個維度是channel,它應該是RGB格式的。

輸入引數 max_size: 如果圖片的長邊超過這個值,就把圖片等比例壓縮到長邊等於這個size。

輸入引數 pse_threshold: pse中的閾值;越低會導致識別出的文字框越大;反之越小。

輸入引數 pse_min_area: 面積大小低於此值的框會被去掉。所以此值越小,識別出的框可能越多。

返回值:型別為list,其中每個元素是一個字典, 儲存了檢測出的一個框的各種資訊。字典包括以下幾個值:“box”:檢測出的文字對應的矩形框四個點的座標(第一列對應寬度方向,第二列對應高度方向); np。ndarray型別,shape==(4, 2);“score”:得分;float型別;分數越高表示越可靠;“croppped_img”:對應 “box” 中的圖片patch(RGB格式),會把傾斜的圖片旋轉為水平。 np。ndarray型別,shape==(width, height, 3);示例:

[{‘box’: array([[416, 77], [486, 13], [800, 325], [730, 390]], dtype=int32), ‘score’: 1。0, ‘cropped_img’: array([[[25, 20, 24], [26, 21, 25], [25, 20, 24], 。。。, [11, 11, 13], [11, 11, 13], [11, 11, 13]]], dtype=uint8)}, 。。。 ]

呼叫示例

from cnstd import CnStdstd = CnStd()box_info_list = std。detect(‘examples/taobao。jpg’)

或:

import mxnet as mxfrom cnstd import CnStdstd = CnStd()img_fp = ‘examples/taobao。jpg’img = mx。image。imread(img_fp, 1)box_info_list = std。detect(img)

識別檢測框中的文字(OCR)

上面示例識別結果中“cropped_img”對應的值可以直接交由

cnocr

中的

CnOcr

進行文字識別。如上例可以結合

CnOcr

進行文字識別:

from cnstd import CnStdfrom cnocr import CnOcrstd = CnStd()cn_ocr = CnOcr()box_info_list = std。detect(‘examples/taobao。jpg’)for box_info in box_info_list: cropped_img = box_info[‘cropped_img’] ocr_res = cn_ocr。ocr_for_single_line(cropped_img) print(‘ocr result: %s’ % ‘’。join(ocr_res))

注:執行上面示例需要先安裝

cnocr

pip install cnocr

指令碼使用

cnstd

包含了幾個命令列命令,安裝

cnstd

後即可使用。

預測單個檔案或資料夾中所有圖片

使用命令

cnstd evaluate

預測單個檔案或資料夾中所有圖片,以下是使用說明:

(venv) ➜ cnstd git:(master) ✗ cnstd evaluate -hUsage: cnstd evaluate [OPTIONS]Options: ——backbone [mobilenetv3|resnet50_v1b] backbone model name ——model_root_dir TEXT 模型所在的根目錄 ——model_epoch INTEGER model epoch -i, ——img_dir TEXT 評估圖片所在的目錄或者單個圖片檔案路徑 ——max_size INTEGER 圖片預測時的最大尺寸(最好是32的倍數)。超過這個尺寸的圖片會被等比例壓縮到此尺寸 [Default: 768] ——pse_threshold FLOAT threshold for pse [Default: 0。45] ——pse_min_area INTEGER min area for pse [Default: 100] ——gpu INTEGER 使用的GPU數量。預設值為-1,表示自動判斷 -o, ——output_dir TEXT 輸出結果存放的目錄 -h, ——help Show this message and exit。

例如可以使用以下命令對圖片 examples/taobao。jpg進行檢測,並把檢測結果存放在目錄 outputs中:

cnstd evaluate -i examples/taobao。jpg -o outputs

具體使用也可參考檔案 Makefile 。

模型訓練

使用命令

cnstd train

訓練文字檢測模型,以下是使用說明:

(venv) ➜ cnstd git:(master) ✗ cnstd train -hUsage: cnstd train [OPTIONS]Options: ——backbone [mobilenetv3|resnet50_v1b] backbone model name ——pretrain_model_fp TEXT 初始化模型路徑 ——gpu INTEGER 使用的GPU數量。預設值為-1,表示自動判斷 ——optimizer TEXT optimizer for training [Default: Adam] ——batch_size INTEGER batch size for each device [Default: 4] ——epoch INTEGER train epochs [Default: 50] ——lr FLOAT learning rate [Default: 0。001] ——momentum FLOAT momentum [Default: 0。9] ——wd FLOAT weight decay factor [Default: 0。0] ——log_step INTEGER 隔多少步列印一次資訊 [Default: 5] -r, ——root_dir TEXT 資料所在的根目錄,它與索引檔案中指定的檔案路徑合併後獲得最終的檔案路徑 -i, ——train_index_fp TEXT 存放訓練資料的索引檔案 -o, ——output_dir TEXT 模型輸出的根目錄 [Default: ~/。cnstd] -h, ——help Show this message and exit。

具體使用可參考檔案 Makefile 。

未來工作

進一步精簡模型結構,降低模型大小。

PSENet速度上還是比較慢,嘗試更快的STD演算法。

加入更多的訓練資料。

cnstd

​專案地址:

https://github.com/breezedeus/cnstd

,歡迎大家嘗試。