はじめに
前回は Yolact-Edge について、学習方法と推論方法にてついて説明しました。
今回は次世代AIライブラリである Detectron2 について、その推論方法を説明していきます。
主にセグメンテーションのライブラリとなります。
あとで掲載しますが、detectron2 の github を参考にしています。
前提条件
前提条件は、以下の通りです。
- OS は Linux または、WSL2
- Python >= 3.7 ※3.8.10を使用します。
- PyTorch == 1.11.0+cu113 ※ バージョンを合わせる必要があります。
- OpenCV >= 4.5 ※4.5.5を使用します。
- CUDA-Toolkit == 11.3.1
Detectron2 をインストール
早速、Detectron2 をインストールしていきます。
こちらを参考に、進めていきます。
cd ~/
python3 -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu113/torch1.10/index.html
上記を実行するだけで、インストールできます。
続いて、github からデモプログラムを取得します。ついでに、画像データも取得します。
mkdir ~/detectron2-dev
cd ~/detectron2-dev
git clone -b v0.6 https://github.com/facebookresearch/detectron2.git
cd detectron2/demo
wget http://images.cocodataset.org/val2017/000000439715.jpg -q -O input.jpg
Detectron2 で推論を実行する準備
早速、推論を実行していきます。
まずは、デモプログラムから動かしていきます。
cd ~/detectron2-dev/detectron2/demo
python3 demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --input input.jpg --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
以下のような出力があれば、成功です。
ターミナルには
[11/15 22:01:24 detectron2]: input.jpg: detected 15 instances in 1.02s
このように、推論速度も表示されていると思います。
Detectron2 の推論
こちらを参考に進めていきます。
cd ~/detectron2-dev/detectron2/demo
touch detectron_test.py
code .
起動した VSCode で、detectron_test.py に以下の内容を記載します。
import torch, detectron2
TORCH_VERSION = ".".join(torch.__version__.split(".")[:2])
CUDA_VERSION = torch.__version__.split("+")[-1]
print("torch: ", TORCH_VERSION, "; cuda: ", CUDA_VERSION)
print("detectron2:", detectron2.__version__)
# Some basic setup:
# Setup detectron2 logger
import detectron2
from detectron2.utils.logger import setup_logger
setup_logger()
# import some common libraries
import numpy as np
import os, json, cv2, random
# import some common detectron2 utilities
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog, DatasetCatalog
print("start")
# display test image
im = cv2.imread("./input.jpg")
print(im.shape)
cv2.imshow("frame", im)
cfg = get_cfg()
# add project-specific config (e.g., TensorMask) here if you're not running a model in detectron2's core library
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # set threshold for this model
# Find a model from detectron2's model zoo. You can use the https://dl.fbaipublicfiles... url as well
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)
outputs = predictor(im)
print(outputs["instances"].pred_classes)
print(outputs["instances"].pred_boxes)
v = Visualizer(im, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]))
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2.imshow("result", out.get_image())
cv2.waitKey(0)
まずは、動かして結果を確認してみましょう。
python3 detectron_test.py
このように表示されれば問題ありません。
Detectron2 の推論コードを確認
コードを確認していきます。
im = cv2.imread("./input.jpg")
print(im.shape)
cv2.imshow("frame", im)
画像を読み込んで、画像サイズと画像を表示します。
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # set threshold for this model
# Find a model from detectron2's model zoo. You can use the https://dl.fbaipublicfiles... url as well
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
get_cfg クラスは、Detectron2 の設定用クラスです。簡単にデータローダーの作成や、モデルの読み込み、しきい値の管理等ができます。
今後、カスタムデータで学習する記事も出しますので、そちらでより細かい設定を見ていけたらと思います。
predictor = DefaultPredictor(cfg)
outputs = predictor(im)
DefaultPredictor は推論用のクラスです。こちらに先ほど作成した get_cfg のインスタンスを渡す必要があります。
PyTorch の model = torch.hub.load… みたいな使い方と考えてください。
predictor は DefaultPredictor のインスタンスで、predictor(opencv画像) で推論することができます。PyTorch の model(image) みたいな使い方ができます。というか、内部ではそうなっています。
print(outputs["instances"].pred_classes)
print(outputs["instances"].pred_boxes)
outputs の変数の中身を確認できます。
他にも、.scores や、.pred_masks も確認できます。
v = Visualizer(im, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]))
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2.imshow("result", out.get_image())
MetadataCatalog.get(cfg.DATASETS.TRAIN[0]) は、class や class_id が格納されています。使用するモデルによって変更していきます。
draw_instance_predictions は predictor の推論結果を使用して、画像にマスクや矩形を表示してくれます。非常に便利です。
自分で描画したい場合は、yolact-edge のコードが参考になると思います。
おわりに
今回は Detectron2 の推論方法と推論コードについて説明しました。
次世代AIライブラリなので非常に便利です。
使用できるモデルもかなり多くありますね。github で確認できます。
次回は、Detectron2 の他のモデルの使用方法か、訓練方法について説明します。
コメント