前言
HALCON是一個強大的機器視覺工具,包含了2D,3D圖像各種算子,以及各種任務(wù)的深度學習工具,包括目標檢測,實例分割,文字識別等。
這次從實際生產(chǎn)的角度,來分享一下如何用HALCON進行文字識別。
衡量一個技術(shù)是否能在實際工業(yè)生產(chǎn)使用,要考慮的因素:
- 最重要的一點,精度要高且穩(wěn)定。在復雜的工業(yè)場景,需要能穩(wěn)定的做到非常高的精度,而不是像簡單的示例程序或者學生作品一樣,只是學習和展示使用。這點HALCON的深度學習OCR可以滿足大部分普通的工業(yè)場景。
- 這里有一個細節(jié),HALCON的版本越高,理論上提供的模型結(jié)構(gòu)要越先進,預訓練模型精度也越高。這里使用的是22.05的版本。
- 速度要快。HALCON做深度學習OCR即使使用CPU進行識別,速度也非??臁?/li>
- 需要能整合到實際開發(fā)的軟件工程里。HALCON支持導出成C++,只需要少量的調(diào)整。
HALCON代碼
HALCON的OCR和現(xiàn)在主流的字符識別任務(wù)一樣,分成兩階段任務(wù)。
- 文本檢測Detection,識別出文本行的位置。
- 文本識別Recognition,把Detection任務(wù)檢測出來的文本行摳出來進行識別。
并且HALCON支持像上面圖片這樣傾斜的文字,下面是簡單的實現(xiàn)代碼和逐行解釋。
* 讀取圖片
read_image (Image, 'D:/Project/OCR_demo.jpg')
* 獲取顯示窗口的句柄
dev_get_window (WindowHandle)
* 設(shè)置文字的字體和大小
set_font (WindowHandle, 'Courier New-Bold-' + round(26))
* 創(chuàng)建OCR識別句柄
create_deep_ocr ('mode', 'auto', DeepOcrHandle)
* 創(chuàng)建CPU/GPU設(shè)備句柄
query_available_dl_devices ('runtime', 'cpu', DLDeviceHandle)
* 設(shè)置OCR使用的設(shè)備
set_deep_ocr_param (DeepOcrHandle, 'device', DLDeviceHandle)
* 記錄開始時間
count_seconds(StartTime)
* 執(zhí)行OCR
apply_deep_ocr (Image, DeepOcrHandle, 'auto', DeepOcrResult)
* 記錄結(jié)束時間
count_seconds(EndTime)
* 計算耗時
Duration := EndTime - StartTime
* 繪制文字
write_string (WindowHandle, '耗時'+Duration+'s')
* 獲取結(jié)果
get_dict_tuple (DeepOcrResult, 'words', WordsRes)
* 獲取文字區(qū)域的行坐標
get_dict_tuple (WordsRes, 'row', Rows)
* 獲取文字區(qū)域的列坐標
get_dict_tuple (WordsRes, 'col', Cols)
* 獲取文字區(qū)域的傾斜角度
get_dict_tuple (WordsRes, 'phi', Phis)
* 獲取文字區(qū)域的矩形長邊
get_dict_tuple (WordsRes, 'length1', Length1s)
* 獲取文字區(qū)域的矩形短邊
get_dict_tuple (WordsRes, 'length2', Length2s)
* 獲取識別文字結(jié)果
get_dict_tuple (WordsRes, 'word', Words)
* 設(shè)置繪制模式為畫輪廓
dev_set_draw('margin')
* 設(shè)置畫線的寬度
dev_set_line_width (2)
for Index := 0 to |Rows|-1 by 1
* 繪制帶方向的矩形
disp_rectangle2(WindowHandle, Rows[Index], Cols[Index], Phis[Index], Length1s[Index], Length2s[Index])
* 設(shè)置文字的坐標
set_tposition(WindowHandle, Rows[Index], Cols[Index])
* 繪制文字
write_string (WindowHandle, Words[Index])
endfor
上面的代碼運行結(jié)果如下,可以看到HALCON在CPU上的速度也是非??斓?。
導出C++
HALCON導出到C++也非常方便,只需要點擊
【文件】-【導出程序】
需要注意的點是,上面的HALCON代碼雖然在HALCON里運行沒有問題,但是直接導出C++運行是會報錯的。
因為上面使用的是HALCON自帶的模型,導出C++之后,程序里是不帶有這個模型的。所以需要將自帶的模型導出,然后設(shè)置成使用這個模型來進行識別。
使用以下HALCON代碼進行模型導出
* 創(chuàng)建自帶的OCR模型
create_deep_ocr ('mode', 'auto', DeepOcrHandle)
* 設(shè)置導出模型的路徑
Filename := 'D:/model.hdo'
* 導出模型
write_deep_ocr (DeepOcrHandle, Filename)
然后把上面的識別代碼從創(chuàng)建默認OCR識別模型句柄,改成讀取指定的模型。
* 創(chuàng)建OCR識別句柄
* create_deep_ocr ('mode', 'auto', DeepOcrHandle)
* 讀取指定的模型
read_deep_ocr ('D:/model.hdo', DeepOcrHandle)
再進行C++代碼導出,就可以使用了。
在C++工程里調(diào)用也非常簡單,只需要包含halcon.dll,halconcppdll,halcondl.dll即可。
案例
在實際項目中,如果文字足夠清晰,預處理足夠干凈,文本定位足夠準確的話,即使使用默認的模型也能達到非常高的精度。
比如下面的例子,通過內(nèi)容區(qū)域提取,透視變換,文本檢測,文本位置精細定位,背景分割過濾等手段,將文本區(qū)域精準提取出來之后,直接使用默認的模型也可以達到很好的效果。
文章來源:http://www.zghlxwxcb.cn/news/detail-815773.html
當然,在針對性的場景,通過標注對應(yīng)的數(shù)據(jù)集,并在預訓練模型的基礎(chǔ)上進行針對性訓練,可以達到一個更好的效果,這個步驟也很簡單,后面機會再展開講一下。文章來源地址http://www.zghlxwxcb.cn/news/detail-815773.html
到了這里,關(guān)于【OCR項目】之用HALCON的深度學習工具進行文字識別,并導出到C++調(diào)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!