Cityscapesのfineレベルのデータから、poleとbuildingのクラスをインスタンス化するためには、cityscapesscriptsを使用します。以下は一般的な手順です。
cityscapesscriptsのjson2instanceImg.pyでいけるようです.
ただし,helpers/labels.pyでhasInstanceでインスタンス化したい対象(ここではpoleとbuilding)をTrueにしておかねばなりません.
(車や道路などはdefaultでインスタンス化されてます.poleやbuildingはされてません)
Terminalにおいて
PYTHONPATHの設定(export PYTHONPATH="${PYTHONPATH}:/my/new/path"
)後に
python json2instanceImg.py /mnt/c/Users/survey/Desktop/CITYSCAPES_DATASET/gtFine_trainvaltest/gtFine/train/aachen/aachen_000000_000019_gtFine_polygons.json /mnt/c/Users/survey/Desktop/CITYSCAPES_DATASET/gtFine_trainvaltest/gtFine/train/aachen/aachen_000000_000019_gtFine_polygons22345.png
#!/bin/bash
# Root directory where your json files are stored
root_dir="/mnt/c/Users/survey/Desktop/CITYSCAPES_DATASET_pole_building/gtFine_trainvaltest/gtFine/"
# Iterate over train, val and test directories
for data_split in train val test
do
# Iterate over each city directory in the data split
for city in $(ls $root_dir/$data_split)
do
# Get the city directory path
city_dir="$root_dir/$data_split/$city"
# Iterate over each json file in the city directory
for json_file in $city_dir/*_polygons.json
do
# Construct the png filename from the json filename
png_file="${json_file%_polygons.json}_instanceIds.png"
# If png file already exists, delete it
if [ -f "$png_file" ]; then
rm $png_file
fi
# Run the python script
python json2instanceImg.py $json_file $png_file
done
done
done
このスクリプトはCityscapesデータセットの全部の画像(というかjsonファイル)に対して適用されます。poleとbuildingのインスタンスだけが訓練データとして扱われ、他のすべてのインスタンスは無視されます。
どうやら,labelTrainIds.pngは,自分で作成する必要があるようです.ここに書いてました.
CITYSCAPES_DATASET=/path/to/abovementioned/cityscapes python cityscapesscripts/preparation/createTrainIdLabelImgs.py
CITYSCAPES_DATASET=datasets/CITYSCAPES_DATASET_pole_building/gtFine_trainvaltest python cityscapesscripts/preparation/createTrainIdLabelImgs.py
まずは,ここを参考にするべきか
次に、Detectron2のMask R-CNNを使用して転移学習を行います。Cityscapesの学習済みモデルを使用し、上記で作成した教師データに対して学習します。
./train_net.py \
--config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \
--num-gpus 1 SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025~
Getting Started with Detectron2では,上記のようにかかれているが,cityscapesならばconfigsファイルは
configs/Cityscapes/mask_rcnn_R_50_FPN.yamlを適用するのでは?
そして,OUTPUT_DIR: "checkpoints/model"を追記.しなければ学習後の重みを保存しない
export CUDA_VISIBLE_DEVICES=0,1 python train_net.py --config-file ../configs/Cityscapes/mask_rcnn_R_50_FPN_TL.yaml --num-gpus 1 SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025
from detectron2.data.datasets import register_coco_instances
from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg
from detectron2 import model_zoo
# 教師データセットの登録
register_coco_instances("my_dataset_train", {}, "path_to_your_dataset.json", "path_to_your_images")
# 設定の準備
cfg = get_cfg()
# Mask R-CNNの設定
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
# Cityscapesの学習済みモデルを使用
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
# 新たな教師データセットの指定
cfg.DATASETS.TRAIN = ("my_dataset_train",)
# 学習の開始
trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()
ここでの主なポイントは、設定(cfg)においてCityscapesの学習済みモデルを指定し、新たに作成した教師データセットを訓練データとして指定することです。
このパイプラインは非常に基本的なものであり、多くの設定や詳細が省略されています。Detectron2とcityscapesscriptsの公式ドキュメンテーションを確認して、より詳細な設定を行ってください。また、データのパス、設定のパラメータ等はあなたの環境に合わせて適宜修正してください。
export CUDA_VISIBLE_DEVICES=0,1 python train_net.py --config-file ../configs/Misc/panoptic_fpn_R_101_dconv_cascade_gn_3x.yaml --num-gpus 1 SOLVER.IMS_PER_BATCH 2 SOLVER.BASE_LR 0.0025 --opts MODEL.WEIGHTS ../checkpoints/model_final_be35db.pkl