【PyTorch】WSL2でdetectron2を使ってみる

公開日:2021年11月14日
最終更新日:2022年8月26日

はじめに

Meta Research(Facebook Reserchから改名)が開発しているdetectron2を使ってみます。

Meta ResearchはPyTorchそのものも開発しているので本家のComputer Visionシステムと言ってもいいと思います。

環境

Ubuntu 20.04 LTS on WSL2 (Windows 11) 
RTX 3060 Laptop
CUDA Toolkit 11.3.1

WSL2とCUDAの設定に関してはこちらを参照して下さい。
touch-sp.hatenablog.com

detectron2のインストール

pipのみで可能でした。

pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
pip install opencv-python
pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu113/torch1.10/index.html

detectron2のインストールの途中でエラーが出るならおそらくpycocotoolsのインストールの部分だと思います。


こちらを参照して下さい。
touch-sp.hatenablog.com
最終的なバージョンはこの記事の最後に書いています。


後述するPythonスクリプトを実行した時にエラーは出ないけど画像が表示されないといった状況になればこちらを参照して下さい。
touch-sp.hatenablog.com


以下のエラーはWSL2を再起動するだけでなおることが多いです。

qt.qpa.xcb: could not connect to display :0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/mnt/wsl/PHYSICALDRIVE2p1/detectron_works/detectronenv/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb.

Object Detection(物体検出)

Pythonスクリプト

import cv2
from torchvision.datasets.utils import download_url
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog

img_url = 'https://raw.githubusercontent.com/zhreshold/mxnet-ssd/master/data/demo/person.jpg'
img_fname = img_url.split('/')[-1]
download_url(img_url, root = '.', filename = img_fname)
im = cv2.imread(img_fname)

model = 'COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml'
cfg = model_zoo.get_config(model, trained=True)
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7

predictor = DefaultPredictor(cfg)
outputs = predictor(im)

v = Visualizer(im, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
img_array = v.get_image()

cv2.imshow ('demo', img_array)
cv2.waitKey(0)
cv2.destroyAllWindows()

モデルの取得を以下のように書いているサイトが多いです。

model = 'COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml'
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(model))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(model)

しかしこの部分は以下のように簡潔に書けます。

model = 'COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml'
cfg = model_zoo.get_config(model, trained=True)

またBGR→RGB→BGRの変換を行っているサイトも多いです。
結局元に戻るので不要です。矩形や文字の色は変わってしまいますが。
以下の[:, :, ::-1]の部分です。

v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
img_array = v.get_image()[:, :, ::-1]

結果

Segmentation

Pythonスクリプト

import cv2
from torchvision.datasets.utils import download_url
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog

img_url = 'https://raw.githubusercontent.com/zhreshold/mxnet-ssd/master/data/demo/person.jpg'
img_fname = img_url.split('/')[-1]
download_url(img_url, root = '.', filename = img_fname)
im = cv2.imread(img_fname)

model = 'COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml'
cfg = model_zoo.get_config(model, trained=True)
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7

predictor = DefaultPredictor(cfg)
outputs = predictor(im)

v = Visualizer(im, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
img_array = v.get_image()

cv2.imshow ('demo', img_array)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果


Keypoint Detection

Pythonスクリプト

import cv2
from torchvision.datasets.utils import download_url
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog

img_url = 'http://images.cocodataset.org/val2017/000000458045.jpg'
img_fname = img_url.split('/')[-1]
download_url(img_url, root = '.', filename = img_fname)
im = cv2.imread(img_fname)

model = 'COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml'
cfg = model_zoo.get_config(model, trained=True)
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7

predictor = DefaultPredictor(cfg)
outputs = predictor(im)

v = Visualizer(im, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
img_array = v.get_image()

cv2.imshow ('demo', img_array)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果


参考にさせて頂いたサイト

yamayou-1.hatenablog.com

ライブラリのバージョン

absl-py==1.2.0
antlr4-python3-runtime==4.9.3
appdirs==1.4.4
black==21.4b2
cachetools==5.2.0
certifi==2022.6.15
charset-normalizer==2.1.1
click==8.1.3
cloudpickle==2.1.0
cycler==0.11.0
detectron2==0.6+cu113
fonttools==4.37.1
future==0.18.2
fvcore==0.1.5.post20220512
google-auth==2.11.0
google-auth-oauthlib==0.4.6
grpcio==1.47.0
hydra-core==1.2.0
idna==3.3
importlib-metadata==4.12.0
importlib-resources==5.9.0
iopath==0.1.9
kiwisolver==1.4.4
Markdown==3.4.1
MarkupSafe==2.1.1
matplotlib==3.5.3
mypy-extensions==0.4.3
numpy==1.23.2
oauthlib==3.2.0
omegaconf==2.2.3
opencv-python==4.6.0.66
packaging==21.3
pathspec==0.9.0
Pillow==9.2.0
pkg_resources==0.0.0
portalocker==2.5.1
protobuf==3.19.4
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycocotools==2.0.4
pydot==1.4.2
pyparsing==3.0.9
python-dateutil==2.8.2
PyYAML==6.0
regex==2022.8.17
requests==2.28.1
requests-oauthlib==1.3.1
rsa==4.9
six==1.16.0
tabulate==0.8.10
tensorboard==2.10.0
tensorboard-data-server==0.6.1
tensorboard-plugin-wit==1.8.1
termcolor==1.1.0
toml==0.10.2
torch==1.10.0+cu113
torchvision==0.11.1+cu113
tqdm==4.64.0
typing_extensions==4.3.0
urllib3==1.26.12
Werkzeug==2.2.2
yacs==0.1.8
zipp==3.8.1