[GLIP] 機械学習で任意のテキストをキーに物体検出

2022年6月18日土曜日

Artificial Intelligence

本記事では、機械学習手法GLIPを用いてテキスト入力に基づいた物体検出を行う方法をご紹介します。

アイキャッチ
出典: GLIPv2: Unifying Localization and Vision-Language Understanding

GLIP

概要

GLIPv2は、物体検出やインスタンスセグメンテーションなどのローカライゼーションタスク(localization task)とVisula Question Answering(VQA)や画像キャプションなどのVision-Language understanding taskの両方に対応するマルチタスクな機械学習手法です。

GLIPv2はObject Detection, Instance Segmentation, VL Grounding, VQA, Image Captionを事前トレーニングなどを用いて効率的な統合を実現しています。

この相互学習により、それぞれのタスクが相互に予測精度を向上させローカライゼーションタスクと、VL understandingタスクにおいてSOTAを達成しています。

overview
出典: GLIPv2: Unifying Localization and Vision-Language Understanding

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

本記事では上記手法を用いて、入力したテキストに応じた物体検出を行っていきます。

デモ(Colaboratory)

それでは、実際に動かしながら入力テキストに応じた物体検出を行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

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

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

環境セットアップ

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

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

初めにGithubからソースコードを取得します。

%cd /content

!git clone https://github.com/microsoft/GLIP.git

次にライブラリをインストールします。

%cd /content/GLIP

!pip install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
!pip install einops shapely timm yacs tensorboardX ftfy prettytable pymongo
!pip install transformers

!python setup.py build develop --user

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

%cd /content/GLIP

import matplotlib.pyplot as plt
import matplotlib.pylab as pylab

import requests
from io import BytesIO
from PIL import Image
import numpy as np
pylab.rcParams['figure.figsize'] = 20, 12
from maskrcnn_benchmark.config import cfg
from maskrcnn_benchmark.engine.predictor_glip import GLIPDemo

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

学習済みモデルのセットアップ

続いて学習済みモデルをダウンロードします。

%cd /content/GLIP
!mkdir MODEL

!wget -c https://penzhanwu2bbs.blob.core.windows.net/data/GLIPv1_Open/models/glip_tiny_model_o365_goldg_cc_sbu.pth \
      -O MODEL/glip_tiny_model_o365_goldg_cc_sbu.pth

あわせて、画像の入出力系のユーティリティ関数を定義しておきます。

def load(url):
    """
    Given an url of an image, downloads the image and
    returns a PIL image
    """
    response = requests.get(url)
    pil_image = Image.open(BytesIO(response.content)).convert("RGB")
    # convert to BGR format
    image = np.array(pil_image)[:, :, [2, 1, 0]]
    return image

def imshow(img, caption):
    plt.imshow(img[:, :, [2, 1, 0]])
    plt.axis("off")
    plt.figtext(0.5, 0.09, caption, wrap=True, horizontalalignment='center', fontsize=20)

モデルのロード

続いて、モデルを定義し、先ほどダウンロードした重みをロードします。

%cd /content/GLIP

config_file = "configs/pretrain/glip_Swin_T_O365_GoldG.yaml"
weight_file = "MODEL/glip_tiny_model_o365_goldg_cc_sbu.pth"

cfg.local_rank = 0
cfg.num_gpus = 1
cfg.merge_from_file(config_file)
cfg.merge_from_list(["MODEL.WEIGHT", weight_file])
cfg.merge_from_list(["MODEL.DEVICE", "cuda"])

glip_demo = GLIPDemo(
  cfg,
  min_image_size=800,
  confidence_threshold=0.7,
  show_mask_heatmaps=False,
)

物体検出

それでは、物体検出を行っていきます。

まず、検出に用いる画像と検出のキーとなるテキストを入力します。
今回はこちらの画像を使用させていただきます。

img_url = 'https://www.pakutaso.com/shared/img/thumb/smIMGL4174_TP_V.jpg' #@param {type:'string'}
caption = 'yellow fruit' #@param {type:'string'}

最後に物体検出を実行します。

glip_demo.color = 128

image = load(img_url)
result, _ = glip_demo.run_on_web_image(image, caption, 0.5)
imshow(result, caption)

検出結果は以下の通りです。

result1

入力したテキストに応じて黄色のフルーツが検出されています。

続いて、Fruit that a woman has in her right handを入力した結果は以下の通りです。

result2

テキストの意味を理解しフルーツの中から右手のフルーツのみが検出されています。また右手、女性も検出されています。

まとめ

本記事では、GLIPを用いて任意のテキストに応じた物体検出をご紹介しました。
複数のタスクが統合され、固定のクラスによる物体検出と比べ、汎用性が向上しています。

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


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

参考文献

1.  論文 - GLIPv2: Unifying Localization and Vision-Language Understanding

2. GitHub - microsoft/GLIP

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

まずは無料会員登録

プロフィール

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

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology