通過雲計算平台製作簡易文字識別腳本

今天給大家介紹一個小小的文字識別腳本,有用到的時候可以方便大家,標題如下:

  1. 前言
  2. 庫與id的配置步驟
  3. 腳本編寫
  4. 尾言

前言

最近遇到個小問題,像提取一些印在圖片上的文字信息,介於數量比較多——好幾張圖片,每張都有幾百來字,自己對照手打又嫌浪費時間,但找的幾個軟體要麼識別出來的文段錯別字一大堆,自己一個個改比直接照原來的打還麻煩,要麼就看著像病毒。當然也不可能自己寫一個,從採集數據,訓練模型到實際產出,真弄出來估計都要大半年,錯別字還不一定比別人的少……於是打算看看一些雲計算平台會不會提供一些「便宜」的api,供個人開發者實現類似功能。

而事實上,常見的雲計算平台確實都提供了這種功能,包括國產三巨頭BAT的三朵雲。這次我們拿百度雲平台舉個例,這次我們使用的依然是Python3.6 。

庫與id的配置步驟

我們先可以打開百度雲的官網:

用百度搜就好,然後我們在首頁-產品-人工智慧中找到文字識別選項

然後在彈出的頁面中選擇「立即使用」

這裡,我們要使用百度雲計算平台的功能的話還需要創建一個百度賬號,如果有pong友水過貼吧的話,那麼用那個賬號就可以啦,登陸並且進入「文字識別」界面之後我們可以看到:

選擇創建應用,根據需求選擇要用的功能然後給咱們的應用取個名分個類

例如我創建了個叫文字識別的應用,就可以進入應用管理界面看到:

這裡我們需要的就是紅框框住的AppID、API Key、Secret Key這三個內容,用於確保接下來我們發送給百度雲平台的請求能夠被識別。

然後,我們在python3.6中安裝baidu-aip這個第三方庫:

pip install baidu-aip

至此,我們實現「文字識別」的環境配置就完成了。

腳本編寫

編寫對應的工具腳本非常簡單,我們首先看看我們的測試集,這是放在腳本工作目錄中 data/ImageForOcr 下兩章包含文字的圖片

然後我們來編寫我們的Python腳本,首先導入兩個庫

from aip import AipOcrimport os

aip就是我們安裝的那個來自百度的庫。

我們再寫個讀取圖片的函數:

dir=data\ImageForOcrdef read_image(path): dir_i=dir+\ print(dir_i+path) with open(dir_i+path,rb) as f: image=f.read() return image

path參數用於傳入我們希望讀取的圖片的名字。

然後,我們編寫主程序:

api_key=**************app_id=**********secret_key=********************client=AipOcr(app_id,api_key,secret_key)fs=os.listdir(dir)file=open(routput.txt,w,encoding=utf-8)for image in fs: i=read_image(image) inf=client.basicGeneral(i) for response in inf[words_result]: for words in response[words]: file.write(words) print(inf)file.close()

Python標準庫os庫提供的listdir方法用於我們查找所接收參數對應目錄下的所有文件和文件夾,返還這些文件和文件夾名字組成的列表,這裡我們用它遍歷讀取 data/ImageForOcr 目錄下的所有圖片,並調用百度雲的api進行識別。

api_key、app_id、secret_key的內容對應我們之前在應用中申請的那三個內容,都作為字元串輸入。AipOcr函數是aip提供的類方法,basicGeneral則是由這個方法構建的對象使用的文字識別方法,對應百度雲一方提供的「通用文字識別功能」,接收一個圖片作為參數,返還文字識別後的信息,通常情況下作為json類對象返還,但在Python中自然就是以dict對象返還,返還內容下:

{

log_id: 9021892210976551911,

words_result_num: 14,

words_result:[

{words:"xxxxxxxxxxx"},

{words:"xxxxxxxxxxx"},

...

]

}

不過有時候會因為某些情況報錯,返回內容中就會有err_msg之類的。

(這部分詳情參考百度雲官方技術文檔)

對於我們的兩張圖片,控制台輸出結果如下:

並且我們在腳本工作目錄中創建了一個叫output.txt的文件,裡面記載著我們識別圖片得到的內容,並且幾乎沒啥錯別字:

至此,腳本完成,有需要源碼的可以老樣子去我們的github(不過這麼短的腳本應該沒有多大必要吧)

有的pong友可能會考慮到,識別後能不能保留文字在原來的圖片中的格式,這個可以將basicGeneral換成general方法,這樣返回的信息就會包含文段的形狀和位置信息,這個方法對應「通用文字識別(含位置信息版)」。

另外,百度雲提供的該項api調用並不是無償的(意料之中啦),不過至少在現在這個時間段,大多是有免費使用次數的,像本文所寫的文字識別api,通用版本是免費使用500次/天,並且有QPS限制,不過對於個人作為工具使用其實完全足矣就是了。

尾言

所以這篇文章討論的東西就只有這麼點兒嗎……事實上,關於這個腳本的內容,確實就這麼點兒(笑),並且用阿里雲、騰訊雲或者Google雲之類的api其實也可以實現類似的功能,至於更深入的使用方式,他們的官方技術文檔肯定會詳細的多,最主要的還是引入各位pong友(也包括我)對近年發展起來的一些人工智慧平台的了解。

不過我們也可以看到,隨著時代發展,人工智慧的各個階段開始慢慢分化,從應用數學工具設計優化演算法,到利用現有演算法訓練模型,再到使用已經訓練好的優秀模型實現應用(有人戲稱其為人工智慧三大轉職:大神、煉丹師、調包俠(當然,這只是戲稱)),人工智慧行業也在慢慢成型。

推薦閱讀:

SRCNN 論文閱讀
VC眼中的人工智慧!
機器學習實戰:k-means實現客戶分類
Training/Validation/Test Dataset

TAG:Python | 機器學習 |