主頁 >  其他 > 基于OCR進行Bert獨立語意糾錯實踐

基于OCR進行Bert獨立語意糾錯實踐

2023-04-08 07:53:38 其他

摘要:本案例我們利用視頻字幕識別中的文字檢測與識別模型,增加預訓練Bert進行糾錯

本文分享自華為云社區《Bert特調OCR》,作者:杜甫蓋房子,

做這個專案的初衷是發現圖比較糊/檢測框比較長的時候,OCR會有一些錯誤識別,所以想對識別結果進行糾錯,一個很自然的想法是利用語意資訊進行糾錯,其實在OCR訓練時加入語意資訊也有不少作業,感興趣的朋友可以了解一下,為了更大程度復用已有的專案,我們決定保留現有OCR單元,在之后加入獨立語意糾錯模塊進行糾錯,

本案例我們利用視頻字幕識別中的文字檢測與識別模型,增加預訓練Bert進行糾錯,最終效果如下:

我們使用ModelBox Windows SDK進行開發,如果還沒有安裝SDK,可以參考ModelBox端云協同AI開發套件(Windows)設備注冊篇、ModelBox端云協同AI開發套件(Windows)SDK安裝篇完成設備注冊與SDK安裝,

技能開發

這個應用對應的ModelBox版本已經做成模板放在華為云OBS中,可以用sdk中的solution.bat工具下載,接下來我們給出該應用在ModelBox中的完整開發程序:

1)下載模板

執行.\solution.bat -l可看到當前公開的技能模板:

███@DESKTOP-UUVFMTP MINGW64 /d/DEMO/modelbox-win10-x64-1.5.1
$ ./solution.bat -l
start download desc.json
 3942.12KB/S, percent=100.00%
Solutions name:
mask_det_yolo3
...
doc_ocr_db_crnn_bert

結果中的doc_ocr_db_crnn_bert即為檔案識別應用模板,下載模板:

███@DESKTOP-UUVFMTP MINGW64 /d/DEMO/modelbox-win10-x64-1.5.1
$ ./solution.bat -s doc_ocr_db_crnn_bert
...

solution.bat工具的引數中,-l 代表list,即列出當前已有的模板名稱;-s 代表solution-name,即下載對應名稱的模板,下載下來的模板資源,將存放在ModelBox核心庫的solution目錄下,

2)創建工程

ModelBox sdk目錄下使用create.bat創建doc_ocr工程

███@DESKTOP-UUVFMTP MINGW64 /d/DEMO/modelbox-win10-x64-1.5.1
$ ./create.bat -t server -n doc_ocr -s doc_ocr_db_crnn_bert
sdk version is modelbox-win10-x64-1.5.1
success: create doc_ocr in D:\DEMO\modelbox-win10-x64-1.5.1\workspace

create.bat工具的引數中,-t 表示創建事務的類別,包括工程(server)、Python功能單元(Python)、推理功能單元(infer)等;-n 代表name,即創建事務的名稱;-s 代表solution-name,表示將使用后面引數值代表的模板創建工程,而不是創建空的工程,

workspace目錄下將創建出doc_ocr工程,工程內容如下所示:

doc_ocr
|--bin
│  |--main.bat:應用執行入口
│  |--mock_task.toml:應用在本地執行時的輸入輸出配置,此應用為http服務
|--CMake:存放一些自定義CMake函式
|--data:存放應用運行所需要的圖片、視頻、文本、配置等資料
│  |--char_meta.txt:字形拆解檔案,用來計算字形相似度
│  |--character_keys.txt:OCR演算法的字符集合
│  |--GB2312.ttf:中文字體檔案
│  |--test_http.py:應用測驗腳本
│  |--text.jpg:應用測驗圖片
│  |--vocab.txt:tokenizer組態檔
|--dependence
│  |--modelbox_requirements.txt:應用運行依賴的外部庫在此檔案定義,本應用依賴pyclipper、Shapely、pillow等工具包
|--etc
│  |--flowunit:應用所需的功能單元存放在此目錄
│  │  |--cpp:存放C++功能單元編譯后的元件,此應用沒有C++功能單元
│  │  |--bert_preprocess:bert預處理功能單元,條件功能單元,判斷是否需要糾錯
│  │  |--collapse_position:歸攏單句糾錯結果
│  │  |--collapse_sentence:歸攏全文糾錯結果
│  │  |--det_post:文字檢測后處理功能單元
│  │  |--draw_ocr:ocr結果繪制功能單元
│  │  |--expand_img:展開功能單元,展開文字檢測結果
│  │  |--expand_position:展開功能單元,展開bert預處理結果
│  │  |--match_position:匹配糾錯結果
│  │  |--ocr_post:ocr后處理功能單元
|--flowunit_cpp:存放C++功能單元的源代碼,此應用沒有C++功能單元
|--graph:存放流程圖
│  |--doc_ocr.toml:默認流程圖,http服務
│  |--modelbox.conf:modelbox相關配置
|--hilens_data_dir:存放應用輸出的結果檔案、日志、性能統計資訊
|--model:推理功能單元目錄
│  |--bert:Bert推理功能能單元
│  │  |--bert.toml:語意推理組態檔
│  │  |--bert.onnx:語意推理模型
│  |--det:文字檢測推理功能單元
│  │  |--det.toml:文字檢測推理功能單元的組態檔
│  │  |--det.onnx:文字檢測onnx模型
│  |--ocr:文字識別推理功能單元
│  │  |--ocr.toml:文字識別推理功能單元的組態檔
│  │  |--ocr.onnx:文字識別onnx模型
|--build_project.sh:應用構建腳本
|--CMakeLists.txt
|--rpm:打包rpm時生成的目錄,將存放rpm包所需資料
|--rpm_copyothers.sh:rpm打包時的輔助腳本

3)查看流程圖

doc_ocr工程graph目錄下存放流程圖,默認的流程圖doc_ocr.toml與工程同名,將流程圖可視化:

圖示中,灰色部分為預置功能單元,其余顏色為我們實作的功能單元,其中綠色為一般通用功能單元,紅色為推理功能單元,藍色為條件功能單元,黃色為展開歸攏功能單元,HTTP接收圖解碼后做預處理,接著是文字檢測,模型后處理得到檢測框,經過條件功能判斷,檢測到文字的圖送入展開功能單元,切圖進行文字識別,文字識別結果送入bert預處理單元判斷是否需要進行糾錯,如需糾錯則再展開并行進行語意推理,不需要糾錯的就直接進行結果繪制并回傳,而未檢測到文字的幀則直接回傳,

4)核心邏輯

本應用核心邏輯中的文字檢測與識別可以參考【ModelBox OCR實戰營】視頻字幕識別中的相關介紹,本文重點介紹文字糾錯部分,

首先查看糾錯預處理功能單元bert_preprocess

def process(self, data_context):
    in_feat = data_context.input("in_feat")
    out_feat = data_context.output("out_feat")
    out_bert = data_context.output("out_bert")

    for buffer_feat in in_feat:
        ocr_data = json.loads(buffer_feat.as_object())['ocr_result']
        score_data = json.loads(json.loads(buffer_feat.as_object())['result_score'])

        text_to_process = []
        text_to_pass = []
        err_positions = []
        for i, (sent, p) in enumerate(zip(ocr_data, score_data)):
            if not do_correct_filter(sent, self.max_seq_length):
                text_to_pass.append((i, sent))
            else:
                err_pos = find_err_pos_by_prob(p, self.prob_threshold)
                if not err_pos:
                    text_to_pass.append((i, sent))
                else:
                    text_to_process.append(sent)
                    err_positions.append(err_pos)
        if not text_to_process:
            out_feat.push_back(buffer_feat)
        else:
            out_dict = []
            texts_numfree = [self.number.sub(lambda m: self.rep[re.escape(m.group(0))], s) for s in text_to_process]
            err_positions = check_error_positions(texts_numfree, err_positions)
            if err_positions is None:
                err_positions = [range(len(d)) for d in texts_numfree]
            batch_data = BatchData(texts_numfree, err_positions, self.tokenizer, self.max_seq_length)
            input_ids, input_mask, segment_ids, masked_lm_positions = batch_data.data
            ...
    return modelbox.Status.StatusCode.STATUS_SUCCESS

預處理單元對通過do_correct_filter函式對OCR結果進行判斷,只對大于3個字的中文字符進行糾錯:

def do_correct_filter(text, max_seq_length):
    if re.search(re.compile(r'[a-zA-ZA-Za-z]'), text):
        return False
    if len(re.findall(re.compile(r'[\u4E00-\u9FA5]'), text)) < 3:
        return False
    if len(text) > max_seq_length - 2:
        return False
    return True

通過find_err_pos_by_prob函式定位需要糾錯的字符,只對OCR置信度小于閾值的字符進行糾錯:

def find_err_pos_by_prob(prob, prob_threshold):
    if not prob:
        return []
    err_pos = [i for i, p in enumerate(prob) if p < prob_threshold]
    return err_pos

如有需要糾錯的字符,則將該句編碼,進行語意推理,

語意推理后,通過collapse_position對推理結果進行解碼,在match_position功能單元中使用shape_similarity函式計算語意推理結果與OCR結果的字符相似度:

def shape_similarity(self, char1, char2):
    decomp1 = self.decompose_text(char1)
    decomp2 = self.decompose_text(char2)
    similarity = 0.0
    ed = edit_distance(safe_encode_string(decomp1), safe_encode_string(decomp2))
    normalized_ed = ed / max(len(decomp1), len(decomp2), 1)
    similarity = max(similarity, 1 - normalized_ed)
    return similarity

其中,decompose_text函式將單個漢字編碼為筆劃級別的IDS,如:

華: ???丿丨?乚丿?一丨

+----+
           | ?  |
           +----+
        化         十
      +----+     +----+
      | ?  |    | ?  |
      +----+     +----+
   亻       七  一      丨
 +----+    +----+
 | ?  |   | ?  |
 +----+    +----+
丿     丨  乚      丿

計算語意推理結果字符與原OCR結果字符相似度之后,綜合語意推理置信度與相似度判斷是否接收糾錯結果:

def accept_correct(self, confidence, similarity):
    if confidence + similarity >= self.all_conf \
        and confidence  >= self.confidence_conf \
            and similarity >= self.similarity_conf:
        return True
    return False

5)三方依賴庫

本應用依賴pyclipper、Shapely、pillow等工具包,ModelBox應用不需要手動安裝三方依賴庫,只需要配置在dependence\modelbox_requirements.txt,應用在編譯時會自動安裝,

技能運行

在專案目錄下執行.\bin\main.bat運行應用,為了方便觀察糾錯結果,我們將日志切換為info:

███@DESKTOP-UUVFMTP MINGW64 /d/DEMO/modelbox-win10-x64-1.5.1/workspace/doc_ocr
$ ./bin/main.bat default info
...
[2022-12-27 15:20:40,043][ INFO][httpserver_sync_receive.cc:188 ] Start server at http://0.0.0.0:8083/v1/ocr_bert

另起終端,進入專案data目錄下,運行test_http.py腳本進行測驗:

███@DESKTOP-UUVFMTP MINGW64 /d/DEMO/modelbox-win10-x64-1.5.1/workspace/doc_ocr/data
$ python test_http.py

可以在技能運行日志中觀察到接受的糾錯結果:

[2022-12-27 15:22:40,700][ INFO][match_position\match_position.py:51  ] confidence: 0.99831665, similarity: 0.6470588235294117, 柜 -> 相

同時,在data目錄下可以看到應用回傳的結果圖片:

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/549433.html

標籤:其他

上一篇:ChatGPT 與 Midjourney 強強聯手,讓先秦阿房宮重現輝煌!

下一篇:關于博客園絕境求商的一點點感想!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more