「PDFドキュメントを使用したオブジェクト検出のためのカスタムDetectron2モデルの訓練と展開(パート1:訓練)」

「PDFドキュメントを活用したオブジェクト検出のためのカスタムDetectron2モデルの訓練及び展開(パート1:訓練)」

機械にPDFを人間のように見ることを学ばせる方法

私は半年以上にわたり、 PDF ドキュメントを機械が読み取れるようにすることで、少なくとも見出し/タイトル(セクションを指定するテキスト)をドキュメントから抽出し、それに関連する内容と共に、ある程度の関係性のあるデータ構造を形成することで、ビジネスケースを解決しようと試みてきました。最初は、テキストとテキスト特徴(フォント、フォントサイズ、太さなど)を使用してドキュメントの構造を分類するために、畳み込みニューラルネットワーク(CNN)と再帰型ニューラルネットワーク(RNN)の組み合わせを使用しました。Rahman & Finin によってこのためのフレームワークが実装され、さらに Long Short-Term Memory(LSTM)を使用して各セクションの意味的分類を推論するというものです。直面した問題は、同様のフレームワークを使用して正確なモデルを作成するために、十分なデータを準備して注釈付けする時間やエネルギーがなかったことです。

一人でこのプロセスをはるかに簡単にするために、私はコンピュータビジョンに頼りました!PDFからテキストとテキスト特徴を抽出し、この方法でドキュメント構造を推論する代わりに、PDFのページを画像に変換し、オブジェクト検出によってドキュメントの構造を視覚的に推測し、その推測(例:ページのヘッダー)と関連する内容(例:ヘッダーの内容)にOCRを行います。この記事では、Detectron2を使用して同じことを行う方法を紹介します。

Detectron2はFacebook AI Researchが提供する次世代のライブラリで、コンピュータビジョンアプリケーションの構築プロセスを簡素化します。コンピュータビジョンのさまざまな用途(画像認識、セマンティックセグメンテーション、オブジェクト検出、インスタンスセグメンテーション)において、この記事ではオブジェクト検出のためのカスタムDetectron2モデルのトレーニングを行います。このモデルはバウンディングボックスの使用によって他と区別されます。トレーニングが完了すると、アプリケーションをDocker化し、Heroku/AWSにデプロイする方法や、メモリ管理やバッチ推論などの他のトピックも探求します。これにより、スクリプトとモデルを特定のユースケースにカスタマイズするのに役立ちます。

この記事に沿って進むためには、以下を事前に持っていることが役立ちます:

  • Pythonの強力な知識
  • DjangoとDockerのデプロイプロセスに関する知識(パート2で説明します)
  • AWSの使用方法についての知識

Detectron2のインストール

MacまたはLinuxユーザーの場合、次のコマンドを実行するだけで簡単です:

pip install torchvision && pip install "detectron2@git+https://github.com/facebookresearch/[email protected]#egg=detectron2"

このコマンドはライブラリをコンパイルするため、少し待つ必要があります。GPUサポートを備えたDetectron2をインストールする場合は、公式のDetectron2インストール手順を参照して詳細な情報をご確認ください。

ただし、Windowsユーザーの場合、このプロセスは少し手間がかかりますが、私自身ではWindowsでこれを行うことができました。

PythonのLayout Parserパッケージによってここで示された手順に注意してください(PDFの構造/内容推論のための独自のDetectron2モデルのトレーニングに興味がなく、事前に注釈付きデータに頼りたい場合にも役立つパッケージです!これは確かに時間を節約できますが、特定のユースケースでは、独自のモデルをトレーニングすることでより正確で小型のモデルを作成できることがわかります。これはデプロイ時のメモリ管理に役立ちます。後ほど詳しく説明します)。Detectron2と一緒に pycocotoolsもインストールしてください。このパッケージはDetectron2モデルのトレーニングに必要なデータの読み込み、解析、可視化をサポートします。

ローカルのDetectron2インストールは、この記事シリーズのパート2で使用されます。この記事では、Detectron2のトレーニングのために後ほどAWS EC2インスタンスを使用します。

ディテクトロン2カスタムトレーニング-LabelMeを使用した注釈

画像の注釈には2つの要素が必要です:(1)注釈を付ける画像と(2)注釈ツール。注釈を付けるためのすべての画像が入ったディレクトリを作成しますが、もし私のユースケースに従ってPDF画像を使用したい場合は、PDFのディレクトリを作成し、pdftoimageパッケージをインストールしてください。

pip install pdf2image

そして、次のスクリプトを使用して各PDFページを画像に変換します:

import osfrom pdf2image import convert_from_path# Assign input_dir to PDF dir, ex: "C://Users//user//Desktop//pdfs"input_dir = "##"# Assign output_dir to the dir you’d like the images to be saved"output_dir = "##"dir_list = os.listdir(input_dir)index = 0while index < len(dir_list):    images = convert_from_path(f"{input_dir}//" + dir_list[index])    for i in range(len(images)):        images[i].save(f'{output_dir}//doc' + str(index) +'_page'+ str(i) +'.jpg', 'JPEG')    index += 1

画像のディレクトリができたら、LabelMeツールを使用します。インストール手順はこちらをご覧ください。インストール後、コマンドラインまたはターミナルからlabelmeコマンドを実行します。これにより、以下のレイアウトのウィンドウが表示されます:

左側の「ディレクトリを開く」オプションをクリックし、画像が保存されているディレクトリを開きます(このディレクトリを「train」とします)。LabelMeはディレクトリ内の最初の画像を開き、それぞれの画像に注釈を付けることができます。画像上で右クリックすると、ポリゴンを作成してオブジェクトの周りにポイントをクリックしたり、直角を保ちながらオブジェクトをキャプチャするための矩形を作成するなど、さまざまな注釈オプションが表示されます。

バウンディングボックス/ポリゴンが配置されたら、LabelMeはラベルを要求します。以下の例では、ページ上の各ヘッダーインスタンスのラベルヘッダーを提供しました。複数のラベルを使用して、画像内で見つかるさまざまなオブジェクト(PDFの例ではタイトル/ヘッダー、表、段落、リストなど)を識別することもできますが、私の目的では、ヘッダー/タイトルを識別し、モデルの推論後にそれぞれのヘッダーと関連する内容を算出します(Part 2を参照)。

注釈が付けられたら、保存ボタンをクリックし、次の画像に進みます。Detectron2は最小限のデータで推論を行うのに優れているため、初期トレーニングとテストに最大100枚の画像に注釈を付けても問題ありません。その後、モデルの精度を向上させるために、さらに注釈を付けてトレーニングを行うこともできます(ただし、複数のラベルカテゴリに対してモデルをトレーニングする場合は、データセットを増やして精度を向上させる必要があります)。

trainディレクトリ内の各画像に注釈が付けられたら、これらの画像/注釈ペアの約20%をtestという別のディレクトリに移動しましょう。

機械学習に詳しい方は、テスト/トレーニング/検証の分割(60-80%トレーニングデータ、10-20%検証データ、10-20%テストデータ)が必要であるという経験的なルールがあります。この目的のために、私たちは20%のテストデータと80%のトレーニングデータというテスト/トレーニングの分割を行います。

ディテクトロン2カスタムトレーニング-COCOフォーマット

注釈のフォルダができたら、labelmeの注釈をCOCO形式に変換する必要があります。GitHubリポジトリにあるlabelme2coco.pyファイルを使用して変換することができます。このスクリプトはTony607からリファクタリングされたものであり、ポリグラム注釈と矩形注釈の両方をCOCO形式に変換します(初期のスクリプトは矩形注釈を正しくCOCO形式に変換できませんでした)。

labelme2coco.pyファイルをダウンロードしたら、ターミナルで次のコマンドを実行してください:

python labelme2coco.py path/to/train/folder

そして、train.jsonファイルが出力されます。testフォルダに対しても同じコマンドを2回実行し、labelme2coco.pyの172行目を編集して既定の出力名をtest.jsonに変更してください(さもなければtrain.jsonファイルが上書きされます)。

Detectron2 カスタムトレーニング — EC2

アノテーションの面倒な作業が終わったので、楽しいところ、トレーニングに進むことができます!

もしコンピュータがNvidia GPUの機能を備えていない場合、AWSを使用してEC2インスタンスを起動する必要があります。Detectron2モデルはCPU上でもトレーニングできますが、これを試すと非常に長い時間がかかることがわかります。一方、GPUベースのインスタンスでNvidia CUDAを使用すれば、数分でモデルをトレーニングできます。

まず、AWSコンソールにサインインしてください。サインイン後、検索バーで「EC2」と入力してEC2ダッシュボードに移動します。ここから、画面左側の「Instances」をクリックし、次に「Launch Instances」ボタンをクリックします。

インスタンスに必要な最低限の詳細は以下の通りです:

  • 名前
  • Amazon Machine Image (AMI):ソフトウェアの設定を指定します。CUDAやTorchなど、CUDAとDetectron2に必要な追加の依存関係やパッケージを持つGPUとPyTorchの機能を備えたAMIを使用してください。このチュートリアルに従う場合は、Ubuntu AMIを使用してください。私はAMI-Deep Learning AMI GPU PyTorch 2.1.0 (Ubuntu 20.04)を使用しました。
  • インスタンスタイプ:ハードウェアの設定を指定します。参考のためにインスタンスタイプのガイドをご覧ください。パフォーマンス最適化のインスタンス(PまたはGインスタンスファミリー)を使用します。私はp3.2xlargeを使用しました。これには、必要な計算パワー、特にGPUの機能がすべて備わっています。

注意:Pファミリーのインスタンスは、基本ユーザーが高性能なインスタンスに直接アクセスできないため、AWSカスタマーサービスにクォータの増加を要求する必要があります。p3.2xlargeインスタンスを使用する場合は、クォータの増加を8 vCPUにリクエストする必要があります。

  • キーペア(ログイン)を指定します。既にキーペアを持っていない場合は、作成してp3keyなどの名前を付けてください。

  • 最後に、ストレージの設定を行います。AMIとインスタンスタイプが同じ場合、デフォルトのスタートストレージが45GBになっているはずです。トレーニングデータセットのサイズに応じて必要な容量(60GB以上など)に増やして、インスタンスに十分なスペースがあるようにします。

インスタンスを起動して、EC2ダッシュボードでインスタンスIDのハイパーリンクをクリックして表示します。インスタンスが実行中の場合、コマンドプロンプトウィンドウを開き、次のコマンドを使用してEC2インスタンスにSSH接続します(太字のテキストを(1).pemキーペアへのパスと(2)EC2インスタンスのアドレスに置き換えることを忘れずに):

ssh -L 8000:localhost:8888 -i C:\path\to\p3key.pem [email protected]

新しいホストなので、以下のメッセージには「yes」と答えてください:

そしてUbuntuは、AWS AMIからの事前パッケージ化された仮想環境であるPyTorchとともに起動します。以下の2つのコマンドを使用して、venvをアクティベートし、プリインストールされたjupyterノートブックを起動します:

これにより、ブラウザにコピーして貼り付けるためのURLが返されます。localhostを含むものをコピーし、8888を8000に変更します。これにより、次のようなJupyter Notebookに移動します:

私のgithubリポジトリから、Detectron2_Tutorial.ipynbファイルをノートブックにアップロードします。ここから、Detectron2を完全にインストールするために、インストールヘッダーの下の行を実行します。その後、インストールが効果を持つようにランタイムを再起動します。

再起動したノートブックに戻ったら、トレーニングプロセスを開始する前にいくつかの追加ファイルをアップロードする必要があります:

  • githubリポジトリからのutils.pyファイル。これはDetectron2の構成詳細を.ipynbファイルに提供するものです(興味がある場合は、構成の詳細についてはこちらのドキュメントを参照してください)。また、このファイルには.ipynbファイルで参照されているplot_samples関数も含まれていますが、それらは両方のファイルでコメントアウトされています。トレーニングデータのプロットを見たい場合は、これをコメント解除して使用することもできます。ただし、plot_samples機能を使用するためには、さらにcv2をインストールする必要があります。
  • labelme2coco.pyスクリプトを使用して作成されたtrain.jsonおよびtest.jsonファイルの両方。
  • Train画像ディレクトリとTest画像ディレクトリの両方のzipファイル(ディレクトリを圧縮すると、ノートブックに1つのアイテムのみをアップロードできます。labelme注釈ファイルをディレクトリに保持しておくことはトレーニングに影響しません)。これらの両方のzipファイルをアップロードした後、ノートブックの右上隅にある(1)新規および(2)ターミナルをクリックしてノートブックでターミナルを開き、次のコマンドを使用して各ファイルを解凍し、ノートブック内に別々のTrainディレクトリとTestディレクトリの画像を作成します:
! unzip ~/train.zip -d ~/! unzip ~/test.zip -d ~/

最後に、.ipynbファイルのTrainingセクションのノートブックセルを実行します。最後のセルは、以下に示すような応答を出力します:

これにより、トレーニングに使用される画像の量とトレーニングデータセットで注釈付けされたインスタンスの数(ここではトレーニング前に”タイトル”カテゴリの470のインスタンスが見つかりました)が表示されます。その後、Detectron2はデータをシリアライズし、構成(utils.py)で指定されたバッチごとにデータを読み込みます。

トレーニングが開始されると、Detectron2がイベントを表示します:

これにより、推定されるトレーニング時間の残り、Detectron2によって実行されたイテレーションの数、そして特に精度を監視するために重要なtotal_lossなどの情報がわかります。total_lossは他の損失計算の指標であり、モデルの予測が単一の例に対してどれだけ悪かったかを示します。モデルの予測が完璧な場合、損失はゼロです。そうでなければ、損失は大きくなります。モデルが完璧でなくても心配しないでください!モデルの精度を向上させるために追加の注釈付きデータを追加するか、モデルの最終トレーニングされた推論に高いスコア(推論が正確であるとモデルがどれだけ自信を持っているかを示す)を使用することができます。

完了すると、ノートブックにoutputというディレクトリが作成され、トレーニングイベントとメトリックに関連するファイル、モデルのチェックポイントを記録するファイル、および最後にmodel_final.pthという.pthファイルが含まれるobject detectionというサブディレクトリが作成されます。これは保存されたトレーニングされたDetectron2モデルであり、これを使用してデプロイされたアプリケーションで推論を行うことができます!AWS EC2インスタンスをシャットダウンまたは削除する前に、これをダウンロードするようにしてください。

model_final.pth を持っているので、Machine Learning(機械学習)を使用したアプリケーションのデプロイメントプロセスをカバーする「Part 2: デプロイメント」記事に従って進めましょう。このプロセスを効率的に行うためのいくつかの重要なヒントもご紹介します。

特に明記されていない限り、この記事で使用されているすべての画像は著者によるものです。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more