1. 程式人生 > >我的AI之路 —— OCR文字識別快速體驗版

我的AI之路 —— OCR文字識別快速體驗版

odin key bapi 真的 sse nor 使用 path 得到

OCR的全稱是Optical Character Recoginition,光學字符識別技術。目前應用於各個領域方向,甚至這些應用就在我們的身邊,比如身份證的識別、交通路牌的識別、車牌的自動識別等等。本篇就先講一下基於開源軟件和大廠服務的文字識別效果,後續會陸續講解一下機器學習和深度學習實現的方案和原理,敬請期待吧。

還記得前一陣某小盆友拿過來一個全是圖片的ppt,讓我把裏面的文字給摳出來(我當時很震驚!!!),隨後在網上隨便找了個OCR的在線文檔轉換軟件,就給轉過來了——這裏面用到的技術就是OCR文字識別,所以本篇就帶大家宏觀上了解一下文字識別的技術方案與實現過程。

更多內容參考——我的AI之路

實現方案 1 大廠調包

有需求的地方就有市場,文字識別也不例外,很多大廠都提供了對應的服務,按照調用次數進行收費。比如網上找了一個產品服務的定價

技術分享圖片

可以看到,倘若你的服務只是偶爾用一次,完全可以使用這種體驗型的免費服務。如果一天需要調用一萬次,那麽一個月基本的花費在5w左右——成本還是很高的,所以很多商用的場景大多都采用自主研發的方式來做。

如果使用這種大廠(我這裏使用的訊飛),流程基本如下:

技術分享圖片

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
from urllib import request,parse
import json
import hashlib
import base64
import cv2


url = 'http://webapi.xfyun.cn/v1/service/v1/ocr/general'
x_appid = '5b4d9bbf'
api_key = 'a08332353b4df650842359129ffadb88'
param = {"language": "cn|en", "location": "true"}
x_param = str(base64.b64encode(bytes(json.dumps(param).replace(' ', ''),encoding='utf-8')),encoding = "utf8")

dict = {}

def main():
    # 圖片加載
    f = open("名片.jpg", 'rb')
    file_content = f.read()
    body = parse.urlencode({'image': base64.b64encode(file_content)})

    x_time = int(int(round(time.time() * 1000)) / 1000)
    x_checksum = hashlib.md5((api_key + str(x_time) + x_param).encode("utf8")).hexdigest()

    x_header = {
        'X-Appid': x_appid,
        'X-CurTime': x_time,
        'X-Param': x_param,
        'X-CheckSum': x_checksum
    }

    req = request.Request(url, data=body.encode("utf-8"), headers=x_header)
    result = request.urlopen(req).read()

    body = json.loads(result, encoding='utf-8')

    img = cv2.imread('名片.jpg')
    for text_line in body['data']['block'][0]['line']:
        word = text_line['word'][0]
        x1 = word['location']['top_left']['x']
        y1 = word['location']['top_left']['y']
        x2 = word['location']['right_bottom']['x']
        y2 = word['location']['right_bottom']['y']

        # 繪制文本框
        cv2.line(img, (x1, y1), (x2, y1), (255, 0, 0), 2)
        cv2.line(img, (x1, y1), (x1, y2), (255, 0, 0), 2)
        cv2.line(img, (x1, y2), (x2, y2), (255, 0, 0), 2)
        cv2.line(img, (x2, y1), (x2, y2), (255, 0, 0), 2)

        # 輸出對應文本
        text = word['content']
        print(text)

    cv2.imshow('result', img)
    cv2.waitKey(0)

if __name__ == '__main__':
    main()

技術分享圖片

實現方案 2 基於開源軟件tesseract實現

有的時候我們在寫爬蟲會遇到驗證碼校驗的問題,這個時候使用大廠的接口就不現實了。驗證碼一般是數字+字母,因此識別起來復雜度不高,采用一些開源軟件就能應付。說到開源軟件,最有名的就是tesseract了,它目前由Google在進行維護,官方提供了3.05版本,貌似使用的還是傳統機器學習的方式。

安裝

安裝的過程很簡單,以我的mac為例,如果你只是想體驗一下,那麽可以使用下面的命令安裝:

brew install tesseract

如果還想未來針對自己的使用數據重新訓練,可以使用下面的命令安裝(強烈推薦):

brew install --with-training-tools tesseract

如果不介意時間長一點,可以直接安裝的時候下載所有的語言版本(不建議,因為語言包真的很大):

brew install --all-languages --with-training-tools tesseract

然後配置環境變量,比如vi ~/.bash_profile 增加下面的內容:

# 增加tesseract環境變量
export TESSERACT=/usr/local/Cellar/tesseract/3.05.02
export TESSDATA_PREFIX=/usr/local/Cellar/tesseract/3.05.02/share/
export PATH=$PATH:$TESSERACT/bin

然後執行source ~/.bash_profile

在命令行就可以使用tesseract了:

技術分享圖片

支持中文版本

如果想要支持中文,官方提供了語言包,可以去直接下載:
https://github.com/tesseract-ocr/tesseract/wiki/Data-Files#data-files-for-version-304305
這裏3.04和3.05是通用的,下載後使用-l命令切換語言版本即可。

下面體驗一下tesseract的效果,原圖為
技術分享圖片
技術分享圖片

正常在使用tesseract的時候都會基於第三方的易用的接口來用
技術分享圖片

tesseract的自定義語言訓練

另外tesseract對中文的支持還不是很好,如果想要優化可以使用jTessBoxEditor。
http://www.softpedia.com/get/Multimedia/Graphic/Graphic-Others/jTessBoxEditor.shtml

重新訓練的流程為:
技術分享圖片

首先需要把圖片轉成tiff格式,這樣它才能記錄一些box的信息。
技術分享圖片
然後打開JTessBoxEditor對圖片進行合並:
技術分享圖片
技術分享圖片
合並後得到一個新的tif圖片
技術分享圖片
然後基於tesseract打上box信息

tesseract tg.font.exp0.tif tg.font.exp0 -l chi_sim batch.nochop makebox

技術分享圖片
隨後再打開jTessBoxEditor,點擊Box Editor,加載tif文件
技術分享圖片
針對生成的結果進行文字的重新編輯和調整。然後在圖片目錄下創建一個font_properties的字體文件,裏面的內容為:

>cat font_properties 
font 0 0 0 0 0

技術分享圖片
然後執行重新訓練腳本,腳本的內容為:

echo "訓練"
tesseract tg.font.exp0.tif tg.font.exp0 nobatch box.train

echo "生成字符集"
unicharset_extractor tg.font.exp0.box

mftraining -F font_properties -U unicharset -O tg.unicharset tg.font.exp0.tr

echo "聚類"
cntraining tg.font.exp0.tr

echo "重命名"
cp normproto tg.normproto 
cp inttemp tg.inttemp 
cp pffmtable tg.pffmtable 
cp shapetable tg.shapetable 
cp unicharset tg.unicharset

echo "創建tessdata"
combine_tessdata tg.

echo "拷貝traineddata"
cp tg.traineddata /usr/local/Cellar/tesseract/3.05.02/share/tessdata/tg.traineddata

技術分享圖片

技術分享圖片

然後重新進行文字識別,可以看到剛才識別錯誤的 “輯”字正確了:

技術分享圖片

本地搭建好tesseract,可以使用一些第三方的工具包來調用,還是很方便的。

我的AI之路 —— OCR文字識別快速體驗版