結果として、指定した3つのクラスを正確に検出することができました。
このプロジェクトは、YOLOv9 を参考にして作成されています。
Google Colabは、GPUへの無料アクセスを提供するクラウドベースのプラットフォームであり、この記事は、Google ColabのGPUを使って、ディープラーニングモデルの学習を行なっていました。
自分で買い物の領収書が200枚以上の領収書を収集して、その中は、比較的綺麗なと折り目ないの125枚を選び、使います。
アノテーションツールにはいくつかの選択肢がありますが、最初にLabelImgとLabelmeを試しました。しかし、比較した結果、ウェブベースのRoboflowが非常に使いやすいことが分かりました。今回はRoboflowを使用してアノテーションを行いました。
Roboflowについて Roboflowはデータセットのアノテーションを簡単かつ迅速に行い、さまざまなモデルの学習に適した形式に変換できるソリューションを提供しています。
ここでは、125枚の領収書写真のデータをRoboflowにアップロードしました。
このプロジェクトでは、領収書から以下の3つのラベルを作ります:『合計』、『日付』、『電話番号』。そのため、それぞれのラベル名を入力し、各領収書サンプルのアノテーションを作ります。
アノテーションが完了したら、いくつかの前処理を行います。例えば、データセットを学習用、推論用、テスト用に分割りします。また、画像を640x640サイズにリサイズします(現在のYOLOv9は640x640サイズの画像しか処理できないため、このステップは必須です)。
これらの前処理を行った結果、データセットの87枚が学習用、26枚を推論用、12枚はテスト用として準備されました。
データセットの作成が完了したら、Roboflowの「Export Dataset」オプションを使用して、YOLO v9モデル用のデータセットをエクスポートできます。エクスポートしたデータセットコードを取得し、このコードをColab上で使用してモデルの学習を行います。
それでは、Colab上でYOLO v9モデルを使用してデータセットをどのように学習するかを見ていきましょう。 まず、Colabの「ランタイムのタイプを変更」オプションからハードウェアアクセラレータをT4 GPUに変更します。その後、YOLOv9のリポジトリをGithubからGoogleドライブにクローンする必要があります。そのために、Googleドライブをマウントしてリポジトリをクローンし、以下のコードを使用して必要なファイルやパッケージをすべてインストールします。
from google.colab import drive
drive.mount('/content/drive')
Clone YOLO v9 repository into your Google Drive.
!git clone https://github.com/WongKinYiu/yolov9
%cd yolov9
!pip install -r requirements.txt -q
リポジトリをクローンして必要なファイルをインストールした後、ディレクトリを作成し、以下のコードを実行してすべての重み(モデル)をダウンロードして保存することができます。
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-c.pt
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-c.pt
!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-e.pt
次に、Roboflowで作成したデータセットをインポートします,その前に、Roboflowパッケージをインストールする必要があります。
!pip install roboflow
from roboflow import Roboflow
rf = Roboflow(api_key="xxxxxxx")
project = rf.workspace().project("projectname")
version = project.version(version number)
dataset = version.download("yolov9")
その後、データセットを使ってYOLOモデルを学習するための学習コードを実行します。ここでは、gelan-c weight.ptを使用してデータセットを学習します。学習を始める前に、モデルの設定ファイル(ここでは gelan-c.yaml)内のアンカー数を、データセットでアノテーションしたラベルの数に変更してください(この記事は3と使います)。モデルをより正確にするために、100エポックで学習を行いました。ただし、必要に応じてエポック数を変更することも可能です。
%cd {HOME}/yolov9
!python train.py \
--batch 8 --epochs 100 --img 640 --device 0 --min-items 0 --close-mosaic 15 \
--data invoice_extraction-3/data.yaml \
--weights {HOME}/weights/gelan-c.pt \
--cfg models/detect/gelan-c.yaml \
--hyp hyp.scratch-high.yaml
これでモデルの学習が完了しました。モデルを100エポックで学習した結果、全クラスにおいて平均適合率(mean average precision)が0.96という良好な精度を達成しました。
Accuracy and Precision of the trained YOLO-v9 model Graph showing the model performance!python detect.py \
--img 640 --conf 0.5 --device 0 \
--weights {HOME}/yolov9/runs/train/exp2/weights/best.pt \
--source {HOME}/yolov9/test/images
import glob
from IPython.display import Image, display
for image_path in glob.glob(f'{HOME}/yolov9/runs/detect/exp2/*.jpg')[:3]:
display(Image(filename=image_path, width=600))
print("\n")