【物体検出・セグメンテーション】Detectron2を用いて学習済みモデルを用いた推論を試す

物体検出やインスタンスセグメンテーション、パノプティックセグメンテーションの最新のモデルを実装するにはDetectron2がよさそうとのうわさを聞きつけ、少し触ってみました。

まずは、事前学習済みモデルを用いた推論についてみてみました。後でカスタムデータセットでの学習についても触っていきたいです。

こちらを参考にしました。

公式ドキュメント: https://detectron2.readthedocs.io/

レポジトリ: https://github.com/facebookresearch/detectron2

Model Zoo: https://github.com/facebookresearch/detectron2/blob/master/MODEL_ZOO.md

Google Colab Tutorial:https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5

おしながき

・Detectron2とは

・Model Zoo

・学習済みモデルを用いた推論

・モデル構造のみ拝借する

 

Detectron2 とは

Detetron2 は Facebook AI Research が提供するコンピュータビジョンのライブラリ。

Detectron初代は、Caffeフレームワークが使用されていたが、2でPyTorchになりました。

Instance Segmentation や Panoptic Segmentation 系の最新モデルも用意されています。

 

Model Zoo

こちらにDetectron2で学習済み重みが用意されているモデルを確認することができます。

以下が扱っている主なタスクです。

  • COCO Object Detection
  • COCO Instance Segmentation
  • COCO Person Keypoint Detection
  • COCO Panoptic Segmentation
  • LVIS Instance Segmentation
  • Cityscapes & Pascal VOC Object Detection, Instance Segmentation

 

学習済みモデルを用いた推論

推論、学習ともにColabのチュートリアルがわかりやすいです。

基本的に同じですが、自分が復習しやすいように整理します。

環境合わせ(Colab)

 

推論するデータの用意

こちらは、チャネルラストのnumpy.ndarray型で用意すればよいみたいです。

 

モデルの用意

既存のモデルを使用して、単純な推論のみを行いたい場合は、DefaultPredictorラッパーを使用します。

DefaultPredictorはモデルのロード、データの前処理などをラップしてくれいます。ただし、一枚の画像の入力を想定しているらしく、複数枚を推論させる場合は、forループを書く必要があるようです。

Mask RCNN Resnet50 FPN の場合

cfg.merge_from_file でモデル構成を記したyamlファイルを読み込みます。

cfg.MODEL.WEIGHTS で重みの初期値を指定します。

cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST では、推論時の信頼度の閾値を指定します。Mask R-CNNやFaster R-CNNの場合は、このメソッドで指定を行いますが、これはモデルに応じて変わります。例えばRetinaNetではcfg.MODEL.RETINANET.SCORE_THRESH_TESTで指定します。

また、NMSの閾値等細かく調整できて、こちらのConfig Referencesで確認することができます。

Faster RCNN Resnet50 FPN の場合

Keypoint RCNN Resnet50 FPN の場合

RetinaNet の場合

・・・とこのように引数を変えてあげて色々なモデルを試すことができます。

yamlファイルのパス一覧はこちら

 

推論と後処理

推論結果は、”instances”をキーに、各種値がvalueとして格納されています。

Visulizer を使用して、簡単に結果を表示することができます。

draw_instance_prediction では、インスタンスセグメンテーションにあわせて可視化をしてくれて、他にも draw_sem_seg(セマンティックセグメンテーション用)、draw_panoptic_seg_predictions(パノプティックセグメンテーション用)など用意されています。こちらから確認できます。

 

モデルだけ拝借する

モデル構造のみ拝借したい場合には、build_model()を使ってconfigファイルからモデルを作るとよいです。

ただ、これはCOCOデータセットでのモデルであるため、使用したい問題設定に合わせて出力のチャネル数等を変更する必要があります。

こちらのConfig Referencesでclass数を変更するものを確認して、適用します。

Faster R-CNNの場合は例えば cfg.MODEL.ROI_HEADS.NUM_CLASSES = 3として3クラス分類のモデルに変更できます。

また、以下のようにして必要な箇所のみ直接書き換えることも可能です。

 

 

というわけで、推論についてでした。

次はDetectron2を用いて自前のデータを学習させるやり方についても整理しようと思います。