1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure Applied AI Services Form Recognizer を Docker コンテナーで使ってみる (2) Custom Model

Last updated at Posted at 2022-04-04

Microsoft Azure の AI サービスである Cognitive Services | Applied AI Services は Web API として利用できるだけでなく、Docker コンテナーとして稼働させることが可能です。エッジデバイス にインストールして利用するといった用途が考えられ、ダイレクトに (Web を介さずに) 分析できるので速い、クラウドへ分析データを送信しないというメリットがあります。

今回はローカル PC で稼働する Docker 環境で利用できる Cognitive Services | Applied AI Services コンテナーのうち、 Form Recognizer (フォームデータ読み取りサービス) を稼働させ、使ってみる方法を紹介します。前回 (ID Document) に引き続き、カスタムモデルを作成して分析できる Custom コンテナーを使ってみます。

Form Recognizer は機能別にコンテナーが分かれており、別の機能を利用したり、Cognitie Services Computer Vision サービス (Read OCR) を利用したりする場合があります。

クラウドに分析データを送信することはありませんが、サービスの利用量を計上するためのインターネット接続が必要になる場合があります。(完全にオフライン環境で利用できるサービスは Private Preview で提供中)

Form Recognizer コンテナー (v2.1) は、2022月3月現在 Gated Preview (申込→承認されて利用可能に) のサービスで、予め申し込みが必要 なサービスです。

環境

以下の手順は、こちら↓の PC 環境で動作確認をしています;

Windows 11 Enterprise 21H2
x64 | Intel Core i7 | RAM 16 GB

Docker Desktop for Windows 4.6.1
Visual Studio Code 1.66
Windows PowerShell 7.2.2

Form Recognizer Sample Labeling tool for Windows (exe版, v2.1 GA)

準備

Form Recognizer を Docker コンテナーで使ってみる (1) ID Document と同じ手順で以下を準備しておきます。

Form Recognizer の Custom Model は Computer Vision サービスは不要です。

  • Azure サブスクリプション申し込み & Form Recgonizer サービス作成
    • Key, Endpoint の取得
  • Form Recognizer Studio へのアクセス
  • Form Recognizer Container: Gated Preview の申し込み
  • Docker 環境のインストール
    • Docker Desktop (& Docker) のインストール
    • Docker Compose のインストール(確認)

Form Recognizer Sample Labeling tool for Windows

Custom コンテナーを使って、カスタムモデル (オリジナルの分析モデル) を作成するには、ラベル付けツールが必要です。ローカルで稼働する Form Recognizer Sample Labeling tool をローカル環境で稼働させて使用します。学習データをローカル環境に保持できるのは Windows 版 exe 版 だけのようなので、こちらをダウンロードしてインストールしておきます。

手順

Form Recognizer は 機能別にコンテナーが分かれています。また、Form Recognizer の別のコンテナーのサービスを利用したりしているため、複数コンテナーを同時に起動して呼び出しを行う環境が必要になります。

こちらでは Docker Compose を使って、Form Recognizer Custom API コンテナーが利用できる環境を構築します。

Docker Compose 設定ファイルの作成

作業フォルダーを準備し、以下のようなフォルダー構成とファイルを作成していきます。

image.png

まずは、作業フォルダー (ここでは form-recognizer-custom) に outputshared という名前でフォルダーを作成しておきます。

.env の作成

作業フォルダーを Visual Studio Code で開きます。.env という名前で新規ファイルを作成し、以下をコピー&ペーストします。

SHARED_MOUNT_PATH="C:\\\YOUR_FOLDER\\form-recognizer-custom\\shared"
OUTPUT_MOUNT_PATH="C:\\\YOUR_FOLDER\\form-recognizer-custom\\output"
FORM_RECOGNIZER_ENDPOINT_URI="https://YOUR_FORMRECOGNIZER_NAME.api.cognitive.microsoft.com/"
FORM_RECOGNIZER_API_KEY="YOUR_FORMRECOGNIZER_KEY"
RABBITMQ_HOSTNAME="rabbitmq"
RABBITMQ_PORT=5672
NGINX_CONF_FILE="C:\\\YOUR_FOLDER\\form-recognizer-custom\\nginx.conf"

フォルダー名(YOUR_FOLDER)、Form Recognizer のエンドポイント(https://YOUR_FORMRECOGNIZER_NAME.api.cognitive.microsoft.com/) および キー(YOUR_FORMRECOGNIZER_KEY) はご自身のものに書き換えます。
.env を保存しておきます。

docker-compose.yml の作成

Visual Studio Code から docker-compose.yml という名前で新規ファイルを作成します。
以下をコピー&ペーストし、保存しておきます。

version: '3.3'
services:
 nginx:
  image: nginx:alpine
  container_name: reverseproxy
  volumes:
    - ${NGINX_CONF_FILE}:/etc/nginx/nginx.conf
  ports:
    - "5000:5000"
 rabbitmq:
  container_name: ${RABBITMQ_HOSTNAME}
  image: rabbitmq:3
  expose:
    - "5672"
 layout:
  container_name: azure-cognitive-service-layout
  image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/layout
  depends_on:
    - rabbitmq
  environment:
    eula: accept
    apikey: ${FORM_RECOGNIZER_API_KEY}
    billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
    Queue:RabbitMQ:HostName: ${RABBITMQ_HOSTNAME}
    Queue:RabbitMQ:Port: ${RABBITMQ_PORT}
    Logging:Console:LogLevel:Default: Information
    SharedRootFolder: /shared
    Mounts:Shared: /shared
    Mounts:Output: /output
  volumes:
    - type: bind
      source: ${SHARED_MOUNT_PATH}
      target: /shared
    - type: bind
      source: ${OUTPUT_MOUNT_PATH}
      target: /output
  expose:
    - "5000"

 custom-api:
  container_name: azure-cognitive-service-custom-api
  image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/custom-api
  restart: always
  depends_on:
    - rabbitmq
  environment:
    eula: accept
    apikey: ${FORM_RECOGNIZER_API_KEY}
    billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
    Logging:Console:LogLevel:Default: Information
    Queue:RabbitMQ:HostName: ${RABBITMQ_HOSTNAME}
    Queue:RabbitMQ:Port: ${RABBITMQ_PORT}
    SharedRootFolder: /shared
    Mounts:Shared: /shared
    Mounts:Output: /output
  volumes:
    - type: bind
      source: ${SHARED_MOUNT_PATH}
      target: /shared
    - type: bind
      source: ${OUTPUT_MOUNT_PATH}
      target: /output
  expose:
    - "5000"

 custom-supervised:
  container_name: azure-cognitive-service-custom-supervised
  image: mcr.microsoft.com/azure-cognitive-services/form-recognizer/custom-supervised
  restart: always
  depends_on:
    - rabbitmq
  environment:
    eula: accept
    apikey: ${FORM_RECOGNIZER_API_KEY}
    billing: ${FORM_RECOGNIZER_ENDPOINT_URI}
    CustomFormRecognizer:ContainerPhase: All
    CustomFormRecognizer:LayoutAnalyzeUri: http://azure-cognitive-service-layout:5000/formrecognizer/v2.1/layout/analyze
    Logging:Console:LogLevel:Default: Information
    Queue:RabbitMQ:HostName: ${RABBITMQ_HOSTNAME}
    Queue:RabbitMQ:Port: ${RABBITMQ_PORT}
    SharedRootFolder: /shared
    Mounts:Shared: /shared
    Mounts:Output: /output
  volumes:
    - type: bind
      source: ${SHARED_MOUNT_PATH}
      target: /shared
    - type: bind
      source: ${OUTPUT_MOUNT_PATH}
      target: /output

nginx.conf の作成

Visual Studio Code から nginx.conf という名前で新規ファイルを作成します。以下をコピー&ペーストし、保存しておきます。

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;
    client_max_body_size 90M;
    upstream docker-api {
        server azure-cognitive-service-custom-api:5000;
    }

    upstream docker-layout {
        server  azure-cognitive-service-layout:5000;
    }

    server {
        listen 5000;

        location = / {
            proxy_set_header Host $host:$server_port;
            proxy_set_header Referer $scheme://$host:$server_port;
            proxy_pass http://docker-api/;

        }

        location /status {
            proxy_pass http://docker-api/status;

        }

        location /ready {
            proxy_pass http://docker-api/ready;

        }

        location /swagger {
            proxy_pass http://docker-api/swagger;

        }

        location /formrecognizer/v2.1/custom/ {
            proxy_set_header Host $host:$server_port;
            proxy_set_header Referer $scheme://$host:$server_port;
            proxy_pass http://docker-api/formrecognizer/v2.1/custom/;

        }

        location /formrecognizer/v2.1/layout/ {
            proxy_set_header Host $host:$server_port;
            proxy_set_header Referer $scheme://$host:$server_port;
            proxy_pass http://docker-layout/formrecognizer/v2.1/layout/;

        }
    }
}

Docker 環境の起動

Visual Studio Code のターミナルから、docker-compose コマンドで環境を起動します。
5つコンテナーが起動するのでしばらく時間が掛かります。

> docker-compose up

無事起動すると、Docker Desktop から form-recognizer-custom およびその配下に5つのコンテナー (custom-api, custom-supervised, layout, reverseproxy, rabbitmq) が作成されているのが確認できます。

image.png

UI として動いている reverseproxy にアクセスします。Docker Desktop から OPEN IN BROWSER を選択、またはブラウザーから http://localhost:5000 を開きます。

image.png

Cognitive Services Container のページが表示されたら OK です。

image.png

ローカルコンテナーでの Custom Model 作成

学習データの準備

カスタムモデルを作成するための学習データ (画像 (jpg, png, pdf), 1 モデルあたり 5 枚以上) を準備します。Doker 環境作成時に作成した 作業フォルダー\shared の配下にサブフォルダーを作成し、学習データを保存しておきます。

image.png

Form Recognizer Sample Labeling tool を使ったラベル付けとカスタムモデル作成

Form Recognizer Sample Labeling tool を起動します。

まずは、学習データを取得するフォルダーの設定 (Connection) を行います。
左端バーの Connection アイコンをクリックします。

image.png

Connection Settings のページで、以下の情報を入力します。

  • Display Name : 接続名 (ご自身が識別しやすい名前を) (ここでは localfolder)
  • Local File system : [Browse] をクリックして、学習用データを入れるローカルフォルダーを選択します。Docker 環境作成時に作成しておいた 作業フォルダー\shared を指定します。(ここでは C:\・・・・・\form-recognizer\shared)

[Save Connection] をクリックして保存します。

image.png

学習用データのフォルダーは、Docker 環境時に作成した 作業フォルダー\shared を必ず指定してください。Docker 環境で稼働している Form Recognizer Custom API (カスタムモデル学習&作成) は、これ以外のローカルフォルダーにアクセスすることができません

作成、保存した Connection が一覧に表示されたら、左端バーの Home アイコンからトップページに戻ります。

image.png

トップページから Use Custom ... をクリックします。

image.png

New Project をクリックして、新規プロジェクト (Form Recgonizer カスタムモデル) を作成します。

image.png

Project Settings 画面で以下の情報を入力します。

  • Display Name : プロジェクト名 (ご自身で識別しやすいものを。学習データのサブフォルダー名 にしておくと分かりやすいかと) ここでは receipt202203
  • Source connection : 前の手順で作成した接続名 (ここでは localfolder)
  • Folder Path : 学習データのサブフォルダー名。ここでは receipt202203
  • Form Recogizer service URI : ローカルで稼働中の Form Recognizer エンドポイント (これまでの手順通りなら http://localhost:5000)
  • API Key : ローカルに保存しておいた Form Recognizer キー

[Save Project] をクリックしてプロジェクトを作成します。

image.png

Tag Editor 画面に遷移し、画像が読み込まれます。(OCR, Layout が読み込まれるため、Docker コンテナーが稼働しているローカル環境によっては時間が掛かります。)
OCR と Layout によって、文字認識されている箇所は黄色の枠、フォーム(表)は 表のマークが表示されます。

image.png

右上の + (Add new tag) をクリックして、ラベルタグを追加します。
タグ名を入力してEnter、でタグが作成されます。

image.png

画像で文字認識されている枠をクリックして選択し (選択した枠は緑色で表示されます)、その状態でタグをクリックすると、認識されている文字がタグに紐づけられます。黄色の枠がタグの色に替わり、タグの方に認識された文字が表示されたらOKです。

image.png

同様に、タグを追加 → 文字をタグ付けを繰り返して、抽出したいエリアの文字列をタグ付けします。

image.png

他の画像も同じ手順でタグ付けを行います。
全部終わったら、画面左バーの上から3つ目のアイコン (Train) をクリックして、モデルの学習に進みます。

image.png

Train a new model の画面で、Model name(ご自分で識別しやすいものをつけてください) を入力して、[Train] をクリックすると、カスタムモデルの学習が始まります。

image.png

学習が終了すると、Train Result が表示され、精度などの情報を見ることができます。
作成したモデルをテストするには、画面左バーの上から5つ目のアイコン(Analyze) をクリックします。

image.png

Choose an image to analyze with の欄でテスト画像を選択し、[Run Analysis] をクリックします。

ローカルフォルダーの画像を使いたい場合は、Docker 環境時に作成した 作業フォルダー\shared 配下に保存しておき、選択してください。

しばらくして分析結果が表示されることを確認してください。

image.png

Docker 環境の停止

Visual Studio Code のコンソールで Ctrl+C をクリックして、環境を停止します。

次回からは Docker Desktop の Start ボタンからも起動することができます。(停止も可能です)
image.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?