[Donut] ClovaAI開発のDonutで文書分類、情報抽出、VQA

2022年8月28日日曜日

Artificial Intelligence

本記事では、LINE CLOVA OCRを開発するCLOVA AIが発表した文書理解AI Docutを用いて文書分類、情報抽出、VQAを行う方法をご紹介します。

アイキャッチ

Donut

概要

Donutは、Document Understanding Transformerは、Transformerベースの文書理解技術です。

Donutの特徴は、OCRエンジンを必要せずOCR freeで、文書分類、情報抽出、Visual Question Answering(VQA)を実現している点です。これにより、OCRの高い計算コストやOCRエラーによる後継プロセスのエラーなどの問題を解消しています。Donutでは、画像をTransformerによるエンコーダー・デコーダーを用いてそれぞれのタスクに応じたデコードを実現しています。

アイキャッチ

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、文書画像から情報抽出

デモ(Colaboratory)

それでは、実際に動かしながらDonutによる文書分類などを行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めに、ライブラリをインストールします。

!pip install donut-python

最後にライブラリをインポートします。

import torch
from PIL import Image

from donut import DonutModel

import IPython
import pprint

以上で環境セットアップは完了です。

テスト画像のセットアップ

続いて、モデルに入力するテスト画像をセットアップします。

!rm -rf test_01.jpg

# 英語のスライド
!wget -c https://media.slidesgo.com/storage/162635/conversions/1-market-share-infographics-thumb.jpg \
      -O ./test_01.jpg

input_img_path = './test_01.jpg'

本記事では、以下の画像を使用します。

テスト画像

Document Classification

それでは、初めに文書分類を行います。
まず学習済みモデルのロードをロードします。

pretrained_model = DonutModel.from_pretrained("naver-clova-ix/donut-base-finetuned-rvlcdip")

if torch.cuda.is_available():
    pretrained_model.half()
    device = torch.device("cuda")
    pretrained_model.to(device)
else:
    pretrained_model.encoder.to(torch.bfloat16)

pretrained_model.eval()

ロードしたモデルに画像を入力します。

task_prompt = "<s_rvlcdip>"

input_img = Image.open(input_img_path)
output = pretrained_model.inference(image=input_img, prompt=task_prompt)["predictions"][0]

出力結果は以下の通りです。RVL-CLIPで学習している本モデルですが、問題なくpresentationに分類されています。

pprint.pprint(output)
# {'class': 'presentation'}

Document Information Extraction

次に、文書から情報抽出を行います。
実行方法を先ほどと同じで、モデルとpromptが異なるのみです。

pretrained_model = DonutModel.from_pretrained("naver-clova-ix/donut-base-finetuned-cord-v2")

if torch.cuda.is_available():
    pretrained_model.half()
    device = torch.device("cuda")
    pretrained_model.to(device)
else:
    pretrained_model.encoder.to(torch.bfloat16)

pretrained_model.eval()

task_prompt = "<s_cord-v2>"

input_img = Image.open(input_img_path)
output = pretrained_model.inference(image=input_img, prompt=task_prompt)["predictions"][0]

出力結果は以下の通りです。
こちらは、CORDと呼ばれるレシートのデータセットでトレーニングしているためスライドの情報抽出としては精度がいまいちです。

pprint.pprint(output)
{'menu': {'cnt': '1',
          'nm': 'Market Share Infographics',
          'price': {'cnt': '1', 'unitprice': 'a gas giant and'},
          'unitprice': 'Rupiter'},
 'sub_total': {'cnt': '1', 'price': 'Mercury', 'unitprice': '30%'}}

Document Visual Question Answering

次に、文書画像と質問を与えてモデルに回答してもらうVQAを行います。
実行方法を先ほどと同じで、モデルとpromptが異なるのみです。

pretrained_model = DonutModel.from_pretrained("naver-clova-ix/donut-base-finetuned-docvqa")

if torch.cuda.is_available():
    pretrained_model.half()
    device = torch.device("cuda")
    pretrained_model.to(device)
else:
    pretrained_model.encoder.to(torch.bfloat16)

pretrained_model.eval()

task_name = "docvqa"
task_prompt = "<s_docvqa><s_question>{user_input}</s_question><s_answer>"

question = "What has the highest market share?" # @param {type:"string"}
user_prompt = task_prompt.replace("{user_input}", question)

input_img = Image.open(input_img_path)
output = pretrained_model.inference(input_img, prompt=user_prompt)["predictions"][0]

出力結果は以下の通りです。
35%を見落としていますね。

pprint.pprint(output)
{'answer': '30%', 'question': 'What has the highest market share?'}

まとめ

本記事では、本記事では、LINE CLOVA OCRを開発するCLOVA AIが発表した文書理解AI Docutを用いて文書分類、情報抽出、VQAを行う方法をご紹介しました。
公開済みモデルの精度はこれからといった印象ですが、アーキテクチャ設計自体が新しいのでこれからの発展に注目です。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - OCR-free Document Understanding Transformer

2. GitHub - clovaai/donut

AIエンジニア向けフリーランスならここがおすすめです

まずは無料会員登録

プロフィール

自分の写真
製造業に勤務する傍ら、日々AIの技術動向を調査しブログにアウトプットしています。 AIに関するご相談やお仕事のご依頼はブログのお問い合わせフォームか以下のアドレスまでお気軽にお問い合わせください。 bhupb13511@yahoo.co.jp

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology