Ahogrammer

Deep Dive Into NLP, ML and Cloud

軽量な画像分類器を用いた業務画像の分類

文書の解析をするためのPythonパッケージであるDoclingのドキュメントを何気なく眺めていたら、Picture classificationなる機能があることに気がついた。どうやら、文書中の画像を以下のカテゴリに分類できるようだ。

リポジトリのコードを掘っていくと、実態としてはEfficientNetをファインチューニングしたモデルであることがわかった。そのサイズ、なんとたったの16MB。以前に以下の記事で使ったモデルが5GBあることを考えると、圧倒的に小さい。これだけ小さいなら、会社の貧弱なラップトップでも動きそうだ。

hironsan.hatenablog.com

そういうわけで試してみる。

準備

パッケージをインストールしておく。

pip install -q docling

画像の分類

モデルをダウンロードしたら、DocumentFigureClassifierPredictorにモデルのパスを渡してやる。今回はデバイスとしてCPUを指定しているが、GPUでも動作するはず。分類器を用意できたら、PillowのImageかNumPyの多次元配列のリストをpredictメソッドに渡すことでカテゴリを予測できる。

from docling.models.utils.hf_model_download import download_hf_model
from docling_ibm_models.document_figure_classifier_model.document_figure_classifier_predictor import DocumentFigureClassifierPredictor
from PIL import Image

# モデルのダウンロード
artifacts_path = download_hf_model(
    repo_id="ds4sd/DocumentFigureClassifier",
    revision="v1.0.1",
    local_dir=None,
    force=False,
    progress=True,
)

# 分類器の用意
document_picture_classifier = DocumentFigureClassifierPredictor(
    artifacts_path=str(artifacts_path),
    device="cpu",
    num_threads=4
)

# 画像の読み込み
filepath = "画像のパス.png"
image = Image.open(filepath)

# 予測
document_picture_classifier.predict(images=[image])

予測をすると、以下のようにスコア付きのカテゴリを出力してくれる。

[[('bar_chart', 0.9999836683273315),
  ('other', 1.614028587937355e-05),
  ('pie_chart', 1.0606347444763742e-07),
  ('map', 5.6198214082314735e-08),
  ('screenshot', 2.5053370933392216e-08),
  ('logo', 8.692216724170976e-09),
  ('bar_code', 4.440278367212613e-09),
  ('line_chart', 4.1925121152530664e-09),
  ('remote_sensing', 2.8389877115841955e-09),
  ('signature', 9.013164103954807e-10),
  ('flow_chart', 3.8304373561892646e-10),
  ('chemistry_markush_structure', 2.167793444751709e-10),
  ('icon', 1.7314336075990866e-10),
  ('stamp', 7.987029093659004e-11),
  ('qr_code', 1.940070847028519e-11),
  ('chemistry_molecular_structure', 1.0466177403911647e-11)],

4つの画像を分類した結果を次の表に示す。画像としては棒グラフ、折れ線グラフ、フローチャート、そして人間の画像を用意した。予測結果としては、もっともスコアの高いカテゴリを選んだ。結果を見ると、すべての画像が正しく分類されていることがわかる。

画像 種類 予測

[4]より引用
棒グラフ bar_chart

[4]より引用
折れ線グラフ line_chart
フローチャート flow_chart
その他 other

CPUでも軽快に動作して素晴らしいのだが、残念なことに論文を見ても分類性能が書かれておらずよくわからなかった。Future workのところで、このモデルらしき機能に言及しているので、そのうちどこかで公開されることを願って気長に待つことにしよう。

参考資料