一、需求描述:
信息智能化時代,大部分中小企業都用上了ERP等辦公軟件,數字化紙質內容,軟件化管理數據,做到無紙化辦公。但仔細觀察,中小企業還是有一些工作流程可以進行改進的。
例如,公司進行人員應聘時,都是先打印應聘表格,然後讓應聘人員填寫內容,最後由文員將應聘表格的內容輸入到ERP系統內。其中,文員將應聘內容輸入到ERP系統內,這個步驟是相當耗時費力的,如果當天應聘人員比較多,那將花費文員大量的時間去輸入應聘信息。
如果能夠利用百度的手寫文字識別功能,結合【IOCR自定義模板文字識別】,智能識別應聘表格內容,並將識別結果填入對應的軟件、或是生成相應的EXCEL等電子文檔,那麼文員只需要校對一下識別的內容是否正確,就能一鍵保存/導入,很快的做好應聘信息錄入工作,大量減輕文員的錄入工作。
以此類推,像請假條、辦公採購單,員工日工資明細等一些表格都可以通過百度手寫文字識別的方法來進行智能識別,極大降低文員的工作量,提高文員的工作效率。
二、應用價值:
利用百度【手寫文字識別】功能,結合【IOCR自定義模板文字識別】,AI前後文判斷智能糾錯等功能,可大大降低文員文字錄入工作量,提高文員工作效率,適合大部分中小企業。
如果能將【手寫文字識別】功能離線化,或者可以單獨部署到企業自己的服務器上去,那將具有更大的應用前景。
三、使用攻略
說明:本文采用C# 語言,開發環境爲.Net Core 2.1。
1、平臺接入
具體接入方式比較簡單,可以參考度友愛小妞寶的帖子,可參考到【創建應用程序】這一步驟(主要獲取APPID等信息,調用時會用的),後面的使用由於我是採用.Net Core 平臺的C#、SDK方案,故有些不同,有時間的話,我會另寫一個教程出來:https://ai.baidu.com/forum/topic/show/867951 (感謝度友愛小妞寶)
2、接口調用說明
文字識別接入官方說明文檔(C#,SDK方案):https://ai.baidu.com/docs#/OCR-Csharp-SDK/top
(1)接口描述
對手寫中文漢字、數字進行識別。
(2)安裝文字識別 C# SDK
方法一:使用Nuget管理依賴 (推薦)
在NuGet中搜索 Baidu.AI,安裝最新版即可。
packet地址 https://www.nuget.org/packages/Baidu.AI/
方法二:下載安裝
文字識別 C# SDK目錄結構
Baidu.Aip ├── net35 │ ├── AipSdk.dll // 百度AI服務 windows 動態庫 │ ├── AipSdk.xml // 註釋文件 │ └── Newtonsoft.Json.dll // 第三方依賴 ├── net40 ├── net45 └── netstandard2.0 ├── AipSdk.deps.json └── AipSdk.dll
1.在官方網站下載C# SDK壓縮工具包:http://ai.baidu.com/sdk#ocr
2.解壓後,將 AipSdk.dll 和 Newtonsoft.Json.dll 中添加爲引用。
(3)新建交互類
// 設置APPID/AK/SK var APP_ID = "你的 App ID"; var API_KEY = "你的 Api Key"; var SECRET_KEY = "你的 Secret Key"; var client = new Baidu.Aip.Ocr.Ocr(API_KEY, SECRET_KEY); client.Timeout = 60000; // 修改超時時間
(4)調用代碼
public void HandwritingDemo() { var image = File.ReadAllBytes("圖片文件路徑"); // 調用手寫文字識別,可能會拋出網絡等異常,請使用try/catch捕獲 var result = client.Handwriting(image); Console.WriteLine(result); // 如果有可選參數 var options = new Dictionary<string, object>{ {"recognize_granularity", "big"} }; // 帶參數調用手寫文字識別 result = client.Handwriting(image, options); Console.WriteLine(result); }
(5)返回示例
{ "log_id": 620759800, "words_result": [ { "location": { "left": 56, "top": 0, "width": 21, "height": 210 }, "words": "3" } ], "words_result_num": 1 }
四、示例關鍵代碼
1、前臺.cshtml 頁面佈局關鍵代碼
<div class="row"> <div class="col-md-12"> <form method="post" enctype="multipart/form-data"> <div class="form-group col-md-12"> <label asp-for="FileUpload" class="control-label">選擇圖片:</label> <input asp-for="FileUpload" type="file" class="form-control" style="height:auto" /> <span asp-validation-for="FileUpload" class="text-danger"></span> </div> <div class="text-center"> <input type="submit" class="btn btn-outline-primary" value="手寫文字識別" asp-page-handler="Handwriting" /> </div> </form> </div> <hr /> <div class="col-md-8"> <img src="@Model.curPath" width="100%" /> </div> <hr /> <div class="col-md-4"> @foreach (string m in Model.msg) { <p>@m</p> } </div> </div>
2、後臺.cshtml.cs調用關鍵代碼
[BindProperty] [Required] public IFormFile FileUpload { get; set; } private readonly IHostingEnvironment HostingEnvironment; public List<string> msg = new List<string>(); public string curPath { get; set; } public async Task<IActionResult> OnPostHandwritingAsync() { msg = new List<string>(); // Perform an initial check to catch FileUpload class attribute violations. if (!ModelState.IsValid) { return Page(); } string webRootPath = HostingEnvironment.WebRootPath;//wwwroot目錄 var fileDir = Path.Combine(webRootPath, "服務器圖片保存相對位置,如://BaiduPicture//"); if (!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } string extension = Path.GetExtension(FileUpload.FileName); string imgName = Guid.NewGuid().ToString("N") + extension; var filePath = Path.Combine(webRootPath, "服務器圖片保存相對位置,如://BaiduPicture//", imgName); curPath = Path.Combine("服務器圖片相對位置(需要在 Startup.cs 文件中的 Configure()中先進行設置,開啓虛擬目錄映射功能),如:/BaiduPicture/", imgName); using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { await FileUpload.CopyToAsync(fileStream); } // 設置APPID/AK/SK var client = new Baidu.Aip.Ocr.Ocr("你的 Api Key", "你的 SECRET Key"); var image = System.IO.File.ReadAllBytes(filePath); // 調用手寫文字識別, 圖片參數爲本地圖片,可能會拋出網絡等異常,請使用try/catch捕獲 var result = client.Handwriting(image);//手寫文字識別 List<JToken> msgList = result["words_result"].ToList(); msg.Add("手寫文字識別結果: "); foreach (JToken ms in msgList) { msg.Add(ms["words"].ToString()); } return Page(); }
五、效果測試
1、頁面:
2、識別結果:
(1)
(2)
說明:因爲攻略主要介紹如何使用手寫文字識別功能,所以對文字處理這塊不進行深入操作。如果想進一步提高識別結果,可以採取將識別結果輸出爲字符串,然後使用正則表達式提取相應的文字內容,或者進一步導出爲EXCEL文件等。
六、改進建議
1、存在的問題:
(1)部分內容,正常情況下,應該將其識別爲兩條記錄的,結果最後變成了一條記錄,特別是【文字-數字-文字-數字】這樣的行信息組合的時候,如果文字、數字的距離較近,很容易將數字和文字識別在一起了,需要改進。
(2)再如像“娘”這樣偏旁部首是單獨的字組成的字時,會識識別成“女良”兩個字,這點也需要改進。(感謝度友134******14的提醒)
(3)目前對稍微潦草的字跡識別率還不是很高,需要改進。
由於計算機、手機等電子設備的普及,大部分人都習慣了打字,手寫情況大大減少,由此導致很大一部分人寫的字龍飛鳳舞,比較難以識別(我寫的字就很潦草,有時候連自己都無法認出來。。。),而且目前來說,中小企業應聘人員的綜合教育水平普遍較低(普工招的比較多),有的甚至不會寫字,所以導致手寫文字各種各樣。經過測試,百度手寫文字識別能力雖然比較優秀了,但是離真正應用到實際工作中去還是有一定的距離的。
2、改進建議
(1)結合【IOCR自定義模板文字識別】功能,智能識別模板內容,格式化提取內容,方便開發人員調用(目前好像已支持手寫數字識別,希望能更快增加支持手寫文字識別)。
(2)如果能格式化輸出內容,或一鍵導出EXCEL電子文檔等功能,則更加方便跟EPR等軟件的對接。
(3)可以運用AI技術,結合前後文智能識別錯別字,修正錯誤或語句問題,提高識別結果。
(4)若能將【手寫文字識別】功能離線話,或可以部署到企業自己的服務器上去,會有更多的企業願意嘗試,也能將【手寫文字識別】功能運用到【財務報表】等保密性要求較強的方向中去。