最近很多人同學私聊,想要這篇文章中的源碼,特意重發一下,文中代碼可粘貼複製。
最近和同事聊天,聊到一個比較充滿使命感的心酸的話題——在網上給小朋友抄題。。。那麼問題來了,除了大家所知的QQ文字識別功能之外,還有哪些方式可以做到文字識別呢。
作為一名熱心的Python小工,我想這個問題可以嘗試著使用Python解決一下,看下效果。
Google一下,發現很多大的廠商(百度、阿里、騰訊等)已有相關的API開放使用,那麼我們今天就以百度為例,分享下如何使用百度文字識別(OCR)服務,實現文字提取,其實三者都嘗試過,感覺百度的效果最好(非評測),所以本文就以百度為例。
先簡單介紹下,百度大腦AI開發平臺,首先我們需要註冊下開發平臺用戶,非常簡單,手機號碼註冊即可。
http://ai.baidu.com/
登錄後我們可以在控制檯看到,開發平臺提供的眾多服務,其中有文字識別服務。
創建一個文字識別服務應用,如下
簡單操作後,我們就可以成功創建一個服務應用,如下,其中AppID、API Key、Secret Key是我們後面調用OCR服務時需要用到的。
接下來,我們看下如何使用Python調用百度OCR服務實現文字提取。
Python實現
代碼設計
- 圖片壓縮:由於OCR服務對圖片大小有限制,因此在使用時若圖片大小超過最大限制,要進行壓縮處理。
- OCR調用:實現利用百度OCR服務提取單張圖片文字,返回文字內容。
- 批量處理:實現N張圖片的文字提取,並且保存提取結果到文本文件中。
圖片壓縮
<code> def photo_compression(original_image , tmp_image_path): """ 圖片備份、壓縮 :param original_image: 原始圖片路徑 :param tmp_image_path: 臨時圖片路徑,備份路徑 :return: """ from PIL import Image img = Image.open(original_image) width, height = img.size # 該數值壓縮後的圖片大約 200k+ while (width * height > 4000000): width = width // 2 height = height // 2 e_img = img.resize((width, height), Image.BILINEAR) save_path = path.join(tmp_image_path, os.path.basename(original_image)) e_img.save(save_path) return save_path/<code>
OCR服務調用
該函數中使用到在上一章節,提到的AppID、API Key、Secret Key信息。
在代碼中,我們使用了basicGeneral(通用文字識別),每天免費使用50000次,還有basicAccurate通用文字識別(高精度版),每天免費使用500次。基本滿足我們日常使用,若不夠,可以再使用其他文字識別服務。
<code> def ocr(original_image): """ 使用百度OCR進行文字識別,支持jpg/jpeg/png/bmp格式 :param original_image: 待識別圖片 :return: """ from aip import AipOcr filename = path.basename(original_image) APP_ID = '16572971' API_KEY = '97jmvxVbuce8B3AQtxUirQ00' SECRECT_KEY = 'dWAdA12ByPnSKzMI0MAXyvUwfDh171Cn' client = AipOcr(APP_ID, API_KEY, SECRECT_KEY) with open(original_image, 'rb') as picfile_read: img = picfile_read.read() print "正在識別圖片: {0} ……".format(filename) try: # 通用文字識別,50000次/天免費 result = client.basicGeneral(img) except: # 通用文字識別(高精度版),500次/天免費 result = client.basicAccurate(img) return result /<code>
批量處理
通過傳入單張圖片或多張圖片,調用OCR服務實現批量圖片文字提取。
<code> def run_ocr( original_image, tmp_image_path, result_file_path='identify_results.txt'): """ 主函數 批量執行圖片文本識別,結果存儲 :param original_image: 原始圖片 :param tmp_image_path: 臨時圖片 :param result_file_path: 識別文字存儲文件 :return: """ # 判斷是否存在歷史識別結果,若存在則刪除 if path.exists(result_file_path): os.remove(result_file_path) # 判斷臨時圖片路徑是否存在,若不存在則創建 if not path.exists(tmp_image_path): os.mkdir(tmp_image_path) # 臨時文件路徑列表 tmp_file_path = [] for picfile in glob.glob(original_image): tmp_file = photo_compression(picfile, tmp_image_path) tmp_file_path.append(tmp_file) # 遍歷所有文件,進行ocr識別 結果存儲 for picfile in tmp_file_path: result = ocr(picfile) lines = [text.get('words').encode('utf-8') + '\\n' for text in result.get('words_result')] with open(result_file_path, 'a+') as fo: fo.writelines("=" * 100 + '\\n') fo.writelines("【識別圖片】: {0} \\n".format(path.basename(picfile) )) fo.writelines("【文本內容】: \\n") fo.writelines(lines) os.remove(picfile) if __name__ == "__main__": tmp_image_path = r'D:\\learn\\tmp' original_image = r"D:\\learn\\*.png" run_ocr(original_image,tmp_image_path) /<code>
效果如下
單張圖片
識別結果
<code> 軟件測試開發技術棧V 文章視頻微頭條收藏 支持反編譯,阿里開源性能監控分析神器 Arthas 1.0萬閱讀·15評論·2019-06-17 22:30 /<code>
識別結果
<code> Arthas(阿爾薩斯)是 Alibaba開源的Java診斷性能監控分析工具,它不需要做任何的參數配置,就可以直觀的獲取各種維庋的性能數據。通過閱讀官網的介紹,可以看到,當我們遇到以下類似問題而束手無策時, Arthas可以幫助我們解決 這個類從哪個jar包加載的?為什麼會報各種類相關的 EXception? ■我改的代碼為什麼沒有執行到?難道是我沒 commit?分支搞錯了? ■遇到問題無法在線上 debug,難道只能通過加日誌再重新發布嗎? 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現! ■是否有一個全局視角來查看系統的運行狀況? ■有什麼辦法可以監控到M的實時運行狀態? Arthas支持JDK6+,支持 Linux/Mac∧ Winodws,採用命令行交互模式,同時提供豐富的 Tab自動補全功能,進一步方便進行問題的定位和診斷/<code>
批量處理結果
閱讀更多 軟件測試開發技術棧 的文章