49
46

More than 1 year has passed since last update.

自前データをアノテーションしてMask R-CNNを学習させる

Last updated at Posted at 2020-02-06

Instance Segmentation(物体検出+セグメンテーション) をするために
- 自前データをアノテーション
- Mask R-CNNを学習
ということを行なったのですが、他に役立つ記事が見当たらず苦労したので
メモ程度ですが僕が行なった手順を共有します。

Mask R-CNNについての解説は省略します。
以下を参考にしてください。
最新のRegion CNN(R-CNN)を用いた物体検出入門 ~物体検出とは? R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN~

Mask R-CNNの実装は以下のレポジトリを利用しています。
https://github.com/facebookresearch/maskrcnn-benchmark

Labelmeによるデータ作成

https://github.com/wkentaro/labelme
基本的には上の README.mdの通りです
以下にざっとまとめます

インストール

$ pip install labelmeでも入るのですが、後ほどデータ変換でスクリプトを使うので git clone します

$ git clone https://github.com/wkentaro/labelme.git
$ cd labelme
$ pip install -e .

起動

クラス名を改行で羅列したclass.txtを作成してください。データの変換の際にエラーが出るかもなので一行目に__ignore__を追加します。
例:

classes.txt
__ignore__
person
bicycle
car
...

以下のコマンドでlabelmeを起動します

$ labelme <データフォルダのpath> --labels <classes.txtのpath> --nodata

アノテーション

物体の境界をポチポチクリックしていくだけでできます。
以下サイトが参考になります。非常に簡単にアノテーションができます。
セマンティックセグメンテーションの実装方法 -データの準備-

データ形式変換

作成されたアノテーションデータ、元画像をMask R-CNN用に変換します。

$ cd labelme/examplts/instance_segmentation
$ ./labelme2coco.py <データフォルダのpath> <作成するディレクトリ名> --labels <classes.txt>

これによって
<作成するディレクトリ名>/JPEGImages ・・・画像が入ったディレクトリ
<作成するディレクトリ名>/annotations.json ・・・アノテーション情報が記されたjsonファイル
が作成されます

maskrcnnを学習させる

インストール

https://github.com/facebookresearch/maskrcnn-benchmark
上をREADME.mdにしたがってインストール

以下の記事が参考になります。
Pytorch1.1+MaskRCNNで自前データ訓練(1)

データ配置

データをmaskrcnnが読み込める位置に配置する

上で作成した
JPEGImages,
annotations.json

maskrcnn_benchmark/datasets/<新ディレクトリ名>/
に配置

データ登録

maskrcnn_benchmark/config/paths_catalog.pyDATASETS に以下を追加

COCO形式であることを読み込ませるために、"新データ名"COCOを含ませるようにしてください。

"新データ名" : {
    "img_dir" : "<新ディレクトリ名>"
    "ann_file" : "<新ディレクトリ名>/annotations.json"
} 

学習実行

以上の処理で、学習用 ,テスト用 のデータを登録してください。

以下にて学習を開始できるはずです。

$ python tools/train_net.py --config-file configs/e2e_mask_rcnn_R_50_FPN_1x.yaml DATASETS.TRAIN "(\"<新データ名(学習用)>\",)" DATASETS.TEST "(\"<新データ名(テスト用)>\",)"

--config-fileconfigs/から指定することで、ネットワーク構造等のconfigを指定できます。
学習率バッチサイズを変更したいときは、実行時に記すことで変更できます

例:

$ python tools/train_net.py --config-file configs/e2e_mask_rcnn_R_50_FPN_1x.yaml DATASETS.TRAIN "(\"<新データ名(学習用)>\",)" DATASETS.TEST "(\"<新データ名(テスト用)>\",)" SOLVER.BASE_LR 0.0025 SOLVER.IMS_PER_BATCH 2 TEST.IMS_PER_BATCH 1

SOLVER.BASE_LR : 学習スタート時の学習率 (逓減していきます )
SOLVER.IMS_PER_BATCH : 学習時バッチサイズ
TEST.IMS_PER_BATCH : テスト時バッチサイズ

全パラメータは
maskrcnn_benchmark/config/defaults.py
に書いてあります。

注意点

同じラベルの別物体が1つの物体として認識されてしまう

labelmeのデータ変換時に、デフォルトだとまとめて1つの物体として認識するようになっています。
別々に認識させたい場合は、labelme2coco.pyを以下にしたがって修正してください。
https://github.com/wkentaro/labelme/issues/419#issuecomment-511853597

セグメンテーションが一つの物体にしか行われない

学習の際にPytorchのバージョンによってラベルが全て一つの物体に対して作成されてしまうようです。

maskrcnn_benchmark/data/datasets/coco.py#L94
の挙動が予期せぬものとなっていることがあるので
target = target.clip_to_image(remove_empty=True)
target = target.clip_to_image(remove_empty=False)
に変更してください。

 
 
以上になります。
ありがとうございました!

49
46
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
46