[Transfiner] Transfinerで高精細インスタンスセグメンテーション

2022年6月8日水曜日

Artificial Intelligence

本記事では、Transfinerと呼ばれる機会学習手法を用いて、インスタンスセグメンテーションを行う方法をご紹介します。

アイキャッチ
出典: SysCV/transfiner

Transfiner

概要

Transfinerは、Transformerベースのインスタンスセグメンテーション手法です。

Transfinerでは、画像領域をQuadtreeとして表現します。
RoIピラミッド状のIncoherent RegionsにQuadtreeを構築し、3段階のツリーから得られるSequential Quadtree NodesをQuadtree Transformerに入力しています。

Quadtreeに表現されているようにエラーが発生しやすいツリーノードを自己修復することで、マスクの品質を向上させています。

この方法によりTransfinerでは、3つのベンチマーク(COCO, BDD100K, Cityscapes)で従来手法を上回る予測精度を示したとされています。

overview
出典: Mask Transfiner for High-Quality Instance Segmentation

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

本記事では上記手法を用いて、インスタンスセグメンテーションを行っていきます。

デモ(Colaboratory)

それでは、実際に動かしながらインスタンスセグメンテーションを行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

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

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

環境セットアップ

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

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

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

%cd /content

!git clone https://github.com/SysCV/transfiner.git

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

%cd /content

# pytorch 1.7.1
!pip install torch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 > /dev/null

# ninja
!wget https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip > /dev/null
!sudo unzip ninja-linux.zip -d /usr/local/bin/ > /dev/null
!sudo update-alternatives --install /usr/bin/ninja ninja /usr/local/bin/ninja 1 --force > /dev/null

# Coco api and visualization dependencies
!pip install yacs cython matplotlib tqdm > /dev/null
!pip install opencv-python==4.4.0.40 > /dev/null
# Boundary dependency
!pip install scikit-image > /dev/null
!pip install kornia==0.5.11 > /dev/null
# gdown
!pip install --upgrade --no-cache-dir gdown > /dev/null

# install pycocotools. Please make sure you have installed cython.
!git clone https://github.com/cocodataset/cocoapi.git
%cd /content/cocoapi/PythonAPI
!python setup.py build_ext install > /dev/null

%cd /content/transfiner/
!python3 setup.py build develop > /dev/null
!pip install PyYAML==6.0 > /dev/null

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

import os
import gdown
from google.colab import files

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

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

学習済みモデルをGoogle Driveからダウンロードします。

%cd /content/transfiner
!mkdir pretrained_model

download_path = './pretrained_model/output_3x_transfiner_r50.pth'
if not os.path.exists(download_path):
  gdown.download('https://drive.google.com/uc?id='+'1EA9pMdUK6Ad9QsjaZz0g5jqbo_JkqtME', download_path, quiet=False)

インスタンスセグメンテーション

それではインスタンスセグメンテーションを行います。

初めに、レポジトリに格納されているテストイメージを入力します。 以下では、sample_imgs配下の画像すべてにインスタンスセグメンテーションを実行しています。

%cd /content/transfiner

!python3 demo/demo.py --config-file configs/transfiner/mask_rcnn_R_50_FPN_3x.yaml \
  --input 'demo/sample_imgs/*.jpg' \
  --output 'vis_coco_r50_sample/' \
  --opts MODEL.WEIGHTS ./pretrained_model/output_3x_transfiner_r50.pth

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

from IPython.display import Image as iPythonImage
iPythonImage('/content/transfiner/vis_coco_r50_sample/000000360661.jpg')
result1

その他の予測結果は以下の通りです。

result2
result3

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

続いて任意の画像を入力していみます。
本記事ではぱくたそ様の画像を使用させていただきます。

%cd /content/transfiner

# 使用画像 https://www.pakutaso.com/20160452095post-7493.html
!wget -c https://www.pakutaso.com/shared/img/thumb/SAYA160312500I9A3721_TP_V4.jpg \
      -O demo/sample_imgs/test1.jpg

任意の画像をインスタンスセグメンテーション

用意した画像をインスタンスセグメンテーションします。

%cd /content/transfiner

!python3 demo/demo.py --config-file configs/transfiner/mask_rcnn_R_50_FPN_3x.yaml \
  --input 'demo/sample_imgs/test1.jpg' \
  --output 'vis_coco_r50_sample/' \
  --opts MODEL.WEIGHTS ./pretrained_model/output_3x_transfiner_r50.pth

iPythonImage('/content/transfiner/vis_coco_r50_sample/test1.jpg')

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

result4

机やパソコンの検出がやや甘いですが、人物は精細に検出できています。
何を正確に検出したいかによって追加の学習が必要そうです。

まとめ

本記事では、Transfinerと呼ばれる機械学習手法を用いて、任意の画像をインスタンスセグメンテーションを行う方法をご紹介しました。

本手法は検出するオブジェクト形状が複雑な場合や、隣接している場合に効果を発揮すると考えられます。

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


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

参考文献

1.  論文 - Mask Transfiner for High-Quality Instance Segmentation

2. GitHub - SysCV/transfiner

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology