實習筆記(一):使用Azure VM訓練與分析Azure Form Recognizer

AppleHank
15 min readOct 27, 2020

本篇為實習期間接觸Azure服務的簡單筆記之一,並不會講述特別的技巧。老實說微軟的文件寫得還算不錯,但由於文件繁雜所以將整個流程整理起來並解釋一些文件內沒有提到的部分。本篇只會簡單講述Azure服務與Form Recognizer以及VM的相關架設與使用方法,以及如何透過REST API訓練/分析Form Recognizer。

Azure

為微軟提出的雲端服務平台,基本上可以跟GCP一樣裡面有很多神奇的工具可以使用,包含了VM、App Service、甚至是Machine Learning的模型,微軟也有撰寫許多文件提供教學與參考。

Azure可提供的服務內容

Azure Form Recognizer

Form Recognizer是一個基於光學辨識所建立的ML模型,它能夠將表單上的文字以極高的準確率輸出成Json檔。其中最驚豔的部分在於通常只需要五份訓練集(Trainning set)就能夠建立一個準確率100%的模型。其運作原理如下。

當我們input了記載著許多文字的PDF檔、Json檔、圖片(jpeg,png)給模型後,模型會透過OCR(光學字元辨識)抓出每一個文字在檔案中的X,Y軸座標,接著根據使用者手動標記的Tag與對應的Value記住這個檔案的哪一個座標上的文字代表著什麼Tag,以及這個Tag對應的Value。之後我們需要使用模型時,只需要input一個Tag/Value的文字位置與訓練集在相同位置檔案,也就是同版型的檔案,就可以得到一個Json檔。但也因為如此,一個Form Recognizer的模型只能用於某一特定版型的檔案。

Azure也提供Blob Container讓使用者存取要訓練的檔案,以及App Service讓使用者可以透過介面標記Tag/Value,整個訓練流程非常簡單,甚至可以不需要碰到程式碼。接下來以操作流程來詳細介紹運作方式,在操作前請先申請好Azure的帳號。

整體來說的流程如下:在Azure Portal(入口網站)建立Form Recognizer(模型)的resource、Storage Account(訓練集的儲存位置)的resource與Container、App Service(標記的介面)的resource > 將訓練集上傳至Storage Account的Container > 下載Azure 儲存體總管 > 透過App Service標記Key/Value > 透過App Service/Rest API訓練模型並取回結果(Json檔)。

建立Form Recognizer resource

建立Storage account resource與Container

建立完後,在Azure Portal點選剛剛建立的Storage account

接著點選下方的Container,進入後新增一個Container,這個Container將會存放待會要標記的資料

建立好後,點選左側Settings > CORS來設定CORS(Cross-origin resource sharing)的規則,使其他服務可以操作這個Storage Account。填入如下圖,Allowed methods中的選項全部都要勾選,最後按下Save。

設定完成後於此處下載範例檔案,我們下載sample_data_without_labels.zip

下載好後將裡面的sample_data_with_labels > v2_0 > Train 的內容上傳到剛剛建立好的Container,並將Test資料夾解壓縮到電腦上。這邊的v2.0和v2.1差別在於v2.1的辨識器有能力辨識Boolean變數,就是表格勾選與否,以及支援的語言更多種,支援語言的Reference會補充在最下方。

下載Azure 儲存體總管

建立App Service resource

處理完Container後我們可以建立Azure Web App Service的resource,用以建立標記工具。Reference如下

使用App Service標記資料

建立好後,我們先看看標記工具的介面。從Azure Portal點選剛剛建立好的App Service,進入App Service,如下圖

App Service介面

在這邊,一個模型要被訓練或分析資料都是需要經由Project來操作的,我們點選New Project。

New Project介面

這邊除了必填項目外,還要填上API Key。API Key跟Form recognizer service URL位置如下圖。KEY1跟2可以當成API Key,而ENDPOINT則是Form recognizer service URL

Form Recognizer介面

雖然要填入的資料在下面的Reference中都有介紹到,但這邊需要特別介紹其中的Source connection。

在講解之前,要在複習一下Form Recognizer的概念。每一個Form Recognizer的模型都是藉由光學字元辨識的結果來訓練/分析的,一個模型只能處理同一種版面的檔案,若是有不同版型的檔案,就應該要另外訓練不同的模型。而訓練集的檔案會放在Container內來訓練, 因此同一個Container底下會存放相同版型的檔案。所以一個Project內的模型只應該用到一個Container。

Source connection:source代表這個Project要連結的Container,所以這邊需要我們提供想要連接的Containner的connection權限。我們可以在左邊的icon中點選最下面的Connections > new connection 來建立新的connection。

來到Connections介面後點選New Connection

這邊填入必填的項目就可以,一樣在以下的Reference中都有提到

其中SAS URL需要從我們剛剛下載的Azure 儲存體總管中獲得。開啟Azure 儲存體總管,從總管視窗中選取Storage Accounts > (建立的Storage Accounts的名稱) > Blob Containers > (建立的Container名稱) > 對建立的Container點選右鍵 > 取得共用存取簽章 > 設立有效時間,權限勾選讀取、寫入、刪除、清單 > 建立 > 複製URL,URL就是我們要的SAS URL。這邊要特別注意的是,有效時間過了之後,這個Key就不能用了,因此對應的Project也不能再存取這個Container。

Container在儲存體總管中的路徑
通常Project權限錯誤都是發生在這邊

在New Project介面中將Display name、Source connection、Form recognizer service URL,以及API Key填妥後,就可以開始標記了。如果出錯則有可能是以下問題之一:

一、Container的SAS URL的權限沒有選好、已經超過結束時間

二、Form Recognizer的API Key已經被重新產生。

三、Storage Account的CORS權限沒有設定好

標記檔案

進入Project後會自動產生OCR檔案,OCR檔案使我們能夠透過點選表單上的文字來標記。標記方法如下

於右側的Tags選單中新增Tag > 點選表單上的文字 > 點選剛剛新增的Tag,這樣就標記好Tag對應的value了。

在Reference中有更詳細的標記限制等規範,如下

訓練模型與分析資料

接著從左側的icon中點選Train,操作後就能將模型訓練好。

Train介面

訓練好後,從左側icon中點選Analyze,上傳剛剛下載的Test中的檔案,就能將結果以Json檔案回傳,結果如下

documentResults這個節點是我們主要關心的資料,其中fields底下的ID、Receipt No與Sold To這些欄位就是分析的檔案中我們標記的資料,每一個欄位中都有value與位置。接下來我們就能夠以程式碼處理這個Json檔拿到我們想要的資料。

你可能會想說,一次上傳一個檔案上去好慢好麻煩,有更快的方法嗎?

有!就是透過REST API

透過REST API訓練模型與分析

我們可以將上面訓練模型的流程透過以下的方式解釋

  1. 透過REST API POST的方式將含有訓練集的Container傳給遠端的Azure From Recognizer並訓練
  2. Azure訓練好模型後產生對應的模型ID與存取的網址,透過REST API GET的方式取得網址,就可以呼叫這個模型
  3. 透過REST API POST的方式將想要分析的資料傳給這個模型
  4. 模型分析好後產生Json,透過REST API GET的方式抓取下來

我們就可以透過程式碼自動上傳許多文件給模型分析,而不用慢慢一個一個上傳。Reference如下

具體的程式碼微軟寫得非常詳細,甚至只要改幾個地方就可以操作。但微軟提供的範例只能一次POST一個檔案給模型分析,如果手上有幾百個檔案想要分析,就會浪費許多時間在等待Response。這部分可以透過Async的方式來解決。在之後我會補上我的Github讓大家參考。另外,如果害怕使用Rest API會發生環境錯誤,可以透過Azure的VM操作。

Azure VM

一樣是從Azure Portal建立一個VM的resource,建立好後透過以下的方式SSH進去。

首先設定DNSname,從Azure Portal到VM的介面後,於Overview介面底下選取DNSname設置,Reference如下

ssh方式與參數如下

透過Windows的cmd:ssh vm_username@DNS_name

vm_username:vm中的使用者名稱

DNS_name:剛剛設置好的DNS

或是從Azure VM的介面中點選Settings底下的Connect,也有更詳細的做法。

補充(筆記)一些VM的操作:

  1. 從本機(Windows10)複製檔案到VM中

scp localpath vm_username@DNSname:path

localpath:想傳送的檔案

path:目標路徑

範例:scp C:\Users\user\Desktop\Azure\sample_data_with_labels\v2_0\Test\Invoice_6.pdf azureuser@example.japanwest.cloudapp.azure.com:/home/azureuser

若是要複製資料夾,只要在scp後面加上 -r 就可以。Reference如下

後記(也可以當作廢話)

原本寫得極度簡短,想說反正也沒什麼人看就Publish出去了,結果沒想到有好心的前輩幫忙轉發到FB上的Azure社團,也幫忙補充了目前支持的語言種類如下面的連結,真的是非常感謝。

另外公司有提到2.1目前還在preview的狀態,可能還不是那麼穩定,所以目前做的案子是用2.0在做的,也許在選擇版本的時候可以取捨一下。

--

--

AppleHank
AppleHank

Written by AppleHank

寫一些輕鬆的文章就好~ | 歡迎來信 LeeAppleHank@gmail.com

No responses yet