AI 請求書認識を実現する PaddleOCR ベースの Asp.net Core アプリケーション

AI 請求書認識を実現する PaddleOCR ベースの Asp.net Core アプリケーション

簡単な紹介

ユーザーは、認識する必要のある写真を一括でアップロードします。アップロードが成功すると、システムは Hangfire バックグラウンド ジョブを開始し、PaddleOCR サービスを呼び出して結果を返します。このプロセスは、マイクロサービス アーキテクチャ モデルに似ています。

パドルOCR

PaddleOCR は Baidu AI チームのオープンソース プロジェクトです。すべての無料オープンソース OCR プロジェクトの中で、最も認識効果の高いプロジェクトです。PaddleOCR を通じて詳細を知ることができます。Python 開発の経験がない場合、環境の展開で問題が発生する可能性がありますが、ほとんどの場合、解決策を見つけることができます。

デモ https://razor.i247365.net/invoices/index

ユーザーは、識別するファイルを一括でアップロードします。仮想マシンのパフォーマンスが非常に低いため、自動識別のためにシステム バックグラウンドにアップロードすることしかできません。

システムが認識を完了すると、自動的にユーザーに通知し、ステータスを変更します。ユーザーは認識結果をプレビューできます。

動作環境

  • .net 5.0>
  • Python 3.7>
  • ASP.NET Core Razor ページ アプリケーション 5.0 ソース コード ブランチ (features\invoice_ocr) RazorPageCleanArchitecture\features\invoice_ocr
  • PaddleOCR Web API (CentOS Alibaba Cloud ホスト) PaddlePaddle/PaddleOCR
  • Hangfire ダッシュボード HangfireIO/Hangfire

テクノロジースタック

  • ASP.NET コア
  • JQuery/Javascript で
  • 簡単UI
  • パイソン

PaddleOCR環境をインストールする

PaddleOCR は glibc 2.23 で動作することがテストされています。他の glibc バージョンをテストしたり、glic 2.23 をインストールしたりすることもできます。

PaddleOCR 作業環境

  • パドルパドル 2.0.0
  • python3.7
  • glibc2.23 より
  • cuDNN 7.6+ (GPU)

PaddleOCR を実行するには、提供されている docker を使用することをお勧めします。docker と nvidia-docker の使用に関する詳細については、リンクを参照してください。

予測コードを Mac または Windows で直接実行する場合は、手順 2 から開始できます。

1. (推奨) Docker 環境を準備します。この画像を初めて使用する場合は、自動的にダウンロードされます。しばらくお待ちください。

 # 作業ディレクトリに切り替える
cd /ホーム/プロジェクト
# 初回実行時には Docker コンテナを作成する必要があります。再度実行するときに現在のコマンドを実行する必要はありません。
# ppocr という名前の Docker コンテナを作成し、現在のディレクトリをコンテナの/ paddle ディレクトリにマップします

CPU環境でdockerを使用する場合は、nvidia - dockerの代わりにdockerを使用してdockerを作成します。
sudo docker run --name ppocr -v $PWD:/paddle --network=host -it paddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82 /bin/bash

CUDA10を使用する場合は、以下のコマンドを実行してコンテナを作成し、dockerコンテナの共有メモリshm - sizeを64Gに設定します。32G以上に設定することをお勧めします。
sudo nvidia - docker run --name ppocr -v $PWD:/paddle --shm-size=64G --network=host -it paddlepaddle/paddle:latest-dev-cuda10.1-cudnn7-gcc82 /bin/bash

[ DockerHub ] ( https://hub.docker.com/r/paddlepaddle/paddle/tags/ )にアクセスして、 マシンに適したイメージ取得することできます

# ctrl + P + Q で Docker コンテナを終了し、次のコマンドを使用して Docker コンテナに再度入ります
sudo docker コンテナ exec -it ppocr / bin / bash

2. PaddlePaddle 2.0をインストールする

 pip3 インストール--upgrade pip

マシンに CUDA9 または CUDA10 がインストールされている場合は、次のコマンドを実行してインストールします。
python3 - m pip install paddlepaddle - gpu == 2.0.0 - i https://mirror.baidu.com/pypi/simple

マシンがCPUの場合は、次のコマンドを実行してインストールします。

python3 - m pip install paddlepaddle == 2.0.0 - i https://mirror.baidu.com/pypi/simple

詳しいバージョン要件については [ インストールドキュメント] ( https://www.paddlepaddle.org.cn/install/quick )の手順参照してください

3. PaddleOCRリポジトリのコードをクローンする

  推奨 git clone https://github.com/PaddlePaddle/PaddleOCR

ネットワークの問題によりプルが失敗した場合は、Code Cloud でのホスティングを使用することもできます。

git クローンhttps://gitee.com/paddlepaddle/PaddleOCR

注意: CodeCloud でホストされているコードは、この GitHub プロジェクトの更新をリアルタイムで同期できない可能性があります。3 5日の遅延があります。まずは推奨される方法を使用してください。

4. サードパーティのライブラリをインストールする

 cd パドルOCR
pip3 インストール-r要件.txt

**ご質問がございましたらメッセージを残していただければお手伝いいたします**

## キーコード分析
httpClient は PaddleOCR API を呼び出す
自動失敗再試行戦略を開始する
```js
サービス.AddHttpClient ( "ocr" , c =>
{
c .BaseAddress =新しい Uri ( "https://paddleocr.i247365.net/predict/ocr_system" ) ;
c .DefaultRequestHeaders .Accept .Add (新しい MediaTypeWithQualityHeaderValue ( "application/json" ) ) ;
}
.AddTransientHttpErrorPolicy (ポリシー=>ポリシー.WaitAndRetryAsync ( 3 _ => TimeSpan .FromMilliseconds ( 1000 ) ) ) ; ;

パブリック void 認識( int id )
{
( var client = _httpClientFactory .CreateClient ( "ocr" ) )を使用します
{
var 請求書= _context.Invoices.Find ( id ) ;
var imgfile = Path .Combine ( Directory .GetCurrentDirectory ( ) , invoice .AttachmentUrl ) ;
var bytes = File.ReadAllBytes ( imgfile ) ;
文字列 base64string = .ToBase64String (バイト)に変換します
var response = client .PostAsJsonAsync < dynamic > ( "" , new { images = new string [ ] { base64string } } ) .Result ;
}
コンソール.WriteLine ( $ "{id}、完了しました。" ) ;
}

請求書情報の解析は、現在でも、請求金額、請求日、請求書番号などの必須フィールドを正規表現で照合するという比較的不器用な方法が使用されています。これは無料であり、有料サービスのようなよりスマートな照合を提供していないためです。ここでは、十分なデータがあれば、自己学習によってよりスマートな認識を実現できるはずだと考えています。そこで、ラベル フィールドを残しました。その目的は、まず対応するフィールド列を手動で設定し、次に座標データを通じてトレーニングすることです。

 if (応答.StatusCode == System .Net .HttpStatusCode .OK )
{
var result = response .Content .ReadAsStringAsync ( ) .Result ;
var ocr_result = JsonSerializer .Deserialize < ocr_result > (結果) ;
var ocr_status = "" ;
invoice.Status = "完了" ;
請求書の結果= ocr_result.status ;
ocr_result .status == "000" 場合
{
foreach ( var collection in ocr_result . results )
{
foreach ( var コレクション内のアイテム)
{
var rawdata =新しい InvoiceRawData ( )
{
信頼度= item.confidence
請求書ID = id
テキスト= item.text
Text_Region = JsonSerializer .Serialize (項目.text_region )
} ;
if ( item .text .Contains ( "請求書番号" ) )
{
var regex =新しい Regex ( "\\d*$" ) ;
var mc = regex .Match ( item .text ) ;
if ( mc . 成功)
{
請求書.InvoiceNo = mc .Value ;
}
}
if ( item .text .Contains ( "請求日" ) )
{
var regex = new Regex ( "\\d{4}年\\d{2}月\\d{2}日" ) ;
var mc = regex .Match ( item .text ) ;
if ( mc . 成功)
{
請求書.InvoiceDate = Convert .ToDateTime ( mc .Value .Replace ( "Year" , "/" ) .Replace ( "Month" , "/" ) .Replace ( "Day" , "" ) ) ;
}
}
if (項目.テキスト.Contains ( "%" ) )
{
var regex = new Regex ( "^\\d*.\\d*" ) ;
var mc = regex .Match ( item .text ) ;
if ( mc . 成功)
{
請求書.TaxRate = 小数点.Parse ( mc .Value ) ;
}
}
if ( item .text .Contains ( "¥" ) )
{
var regex = new Regex ( "\\d.\\d*" ) ;
var mc = regex .Match ( item .text ) ;
if ( mc . 成功)
{
請求書.Amount = 小数点.Parse ( mc .Value ) ;
}
}
_context .InvoiceRawDatas .Add ( rawdata ) ;
}
}
ocr_status = ocr_result.status ;

}
_context .SaveChangesAsync (デフォルト) .Wait ( ) ;
_hubContext.Clients.All.SendAsync ( SignalR.OCRTaskCompleted 新しい{ invoiceNo = invoice.InvoiceNo } ) ;



}

キャンバスフレーム注釈認識結果

 データ.map ( (項目,インデックス) => {
$ ( '#rawdata_table > tbody' ) .append ( ` < tr >< td > $ { index + 1 } </ td >< td > $ { item .Text } </ td >< td ></ td ></ tr > ` ) ;
var points = JSON .parse ( item .Text_Region ) ;
ctx .lineWidth = "5" ;
ctx .strokeStyle = "#00ff00" ;
ctx .textAlign = '左' ;
ctx .textBaseline = 'top' ;
ctx .fillStyle = "#ff0000" ;
ctx .font = "太字 13px verdana、サンセリフ" ;
ctx .fillText (項目.Text ポイント[ 0 ] [ 0 ] ポイント[ 0 ] [ 1 ] - 15 ) ;
ctx .beginPath ( ) ;
ctx .moveTo (ポイント[ 0 ] [ 0 ] ポイント[ 0 ] [ 1 ] ) ;
ctx .lineTo (ポイント[ 1 ] [ 0 ] ポイント[ 1 ] [ 1 ] ) ;
ctx .lineTo (ポイント[ 2 ] [ 0 ] ポイント[ 2 ] [ 1 ] ) ;
ctx .lineTo (ポイント[ 3 ] [ 0 ] ポイント[ 3 ] [ 1 ] ) ;
ctx .closePath ( ) ;
ctx .stroke ( ) ;
} ) ;

シンプルでカッコいいと思いませんか?

やっと

星をあげてください!⭐

このプロジェクトが気に入ったり、使用したりしている場合は、星を付けてください。ありがとうございます!

RazorPageCleanArchitecture\features\invoice_ocr:https://github.com/neozhu/RazorPageCleanArchitecture


<<:  ついに誰かが教師あり学習を明確にした

>>:  AI技術のアップグレード:2022年に最も人気のある人工知能技術トップ10

ブログ    
ブログ    
ブログ    

推薦する

...

人工知能を活用して顧客サービスを向上させる方法

顧客エンゲージメント、パーソナライゼーションなど、5 つの異なる領域で AI を使用して顧客サービス...

...

ガートナー、2023年の中国のデータ分析と人工知能技術の成熟度曲線を発表

ガートナーは、2026年までに中国のホワイトカラー職の30%以上が再定義され、生成AIを活用し管理す...

...

人工知能は、研究論文の合理的で興味深く、科学的に価値のあるタイトルを生成できるかもしれない。

人工知能(AI)技術は、将来の研究論文に対して、説得力があり、面白く、科学的な見出しを生成できること...

Stability AI、GPUなしでローカルで実行できるStable Code 3Bモデルをリリース

文芸グラフィックの分野で非常に人気となっている Stability AI は、本日、2024 年向け...

...

人工知能の将来の発展における4つの主要なトレンドについての簡単な議論

[[349269]] 2020年に世界的パンデミックが発生し、世界が完全にひっくり返る前から、人工知...

未来はAIエンジニアの手に。しかし変革を成功させるのは簡単ではない

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

顔認識の過去と現在

顔認識技術はもともとSFの世界のコンセプトでした。しかし、過去 10 年間で、顔認識技術は現実のもの...

数百万の量子ビットを実現するにはどうすればよいでしょうか?量子コンピューティング企業がユニバーサル量子コンピューティングソリューションを拡大

光ファイバーを光子のメモリとして使用し、光子メモリを使用してフォールトトレラント量子コンピューティン...

...

マスク氏はOpenAIを訴えた。彼らはAGIを作成し、それをマイクロソフトにライセンス供与したが、これは設立協定に対する露骨な裏切りである。

つい先日、「劇的な対立に耽溺する」マスク氏は新たな行動を起こした。共同設立者の一人であるOpenAI...

...