BoxInst: High-Performance Instance Segmentation with Box Annotations
paper:https://arxiv.org/abs/2012.02310
GitHub:https://github.com/aim-uofa/AdelaiDet
文章实现了仅通过矩形框,即可完成实例分割任务,并且有非常不错的效果。极大节省了分割任务的成本。
感谢沈春华老师团队
上图第一行:同一目标在分割任务中的mask和检测任务中的box在水平和垂直方向上的投影一致,因此设计了投影损失。上图第二行:计算像素与其8个相邻像素(步长为2)之间的颜色相似度。若同为背景或者前景,相似度高;若不同属于前景或者背景,相似度低。因此设计了成对项损失。基于这两个损失完成通过box训练可预测mask的模型。
1、投影损失:
其中b为真实框,为b在x轴上的投影,
为b在y轴上的投影,
和
分别为在x和y轴上的一维mask。
其中,m为预测mask,b为真实框,为m在x轴上的投影,
为m在y轴上的投影。计算预测mask和真实框在x、y轴上的投影损失。
2、颜色损失:
蓝线:颜色相似度高于阈值的边缘中正边缘的比例;红线:监督的正边缘占所用正边的比例。横轴:颜色相似度阈值(计算基于COCO数据集)。
任意两像素的相似度计算公式:
相似度损失公式:
为颜色相似度阈值,当
大于等于
时,
=1;当
小于
时,
=0。
代表两个像素同为前景或者同为背景。
训练自己的数据集:
1.在detectron2/detectron2/data/datasets/builtin.py中注册数据集。
_PREDEFINED_SPLITS_COCO["coco"] = {
"coco_2014_train": ("coco/train2014", "coco/annotations/instances_train2014.json"),
"coco_2014_val": ("coco/val2014", "coco/annotations/instances_val2014.json"),
"coco_2014_minival": ("coco/val2014", "coco/annotations/instances_minival2014.json"),
"coco_2014_minival_100": ("coco/val2014", "coco/annotations/instances_minival2014_100.json"),
"coco_2014_valminusminival": (
"coco/val2014",
"coco/annotations/instances_valminusminival2014.json",
),
"coco_2017_train": ("coco/train2017", "coco/annotations/instances_train2017.json"),
"coco_2017_val": ("coco/val2017", "coco/annotations/instances_val2017.json"),
"coco_2017_test": ("coco/test2017", "coco/annotations/image_info_test2017.json"),
"coco_2017_test-dev": ("coco/test2017", "coco/annotations/image_info_test-dev2017.json"),
"coco_2017_val_100": ("coco/val2017", "coco/annotations/instances_val2017_100.json"),
#增加自己的数据集
"coco_our_train": ("coco_our/train2017", "coco_our/annotations/our_train.json"),
"coco_our_val": ("coco_our/val2017", "coco_our/annotations/our_val.json"),
}
2.将数据coco_our放到Adelaidet/datasets/下,结构如下:
./datasets
----coco_our
--------annotations
------------our_train.json
------------our_val.json
--------train2017
--------val2017
3.在detectron2/detectron2/data/datasets/builtin_meta.py中注册数据集类别。
COCO_CATEGORIES_our = [
{"color": [220, 20, 60], "isthing": 1, "id": 0, "name": "car"},
{"color": [119, 11, 32], "isthing": 1, "id": 1, "name": "truck"},
{"color": [0, 0, 142], "isthing": 1, "id": 2, "name": "road"},
{"color": [0, 0, 230], "isthing": 1, "id": 3, "name": "person"},
{"color": [106, 0, 228], "isthing": 1, "id": 4, "name": "bus"},
]
4.将detectron2/detectron2/data/datasets/builtin_meta.py中COCO_CATEGORIES修改为COCO_CATEGORIES_our。
def _get_coco_instances_meta():
thing_ids = [k["id"] for k in COCO_CATEGORIES_our if k["isthing"] == 1]
thing_colors = [k["color"] for k in COCO_CATEGORIES_our if k["isthing"] == 1]
assert len(thing_ids) == 18, len(thing_ids)
# Mapping from the incontiguous COCO category id to an id in [0, 79]
thing_dataset_id_to_contiguous_id = {k: i for i, k in enumerate(thing_ids)}
thing_classes = [k["name"] for k in COCO_CATEGORIES_our if k["isthing"] == 1]
ret = {
"thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id,
"thing_classes": thing_classes,
"thing_colors": thing_colors,
}
return ret
5.修改Adelaidet/adet/config/default.py中的NUM_CLASSES为你的类别数。
_C.MODEL.BASIS_MODULE.NUM_CLASSES = 5
6.修改Adelaidet/configs/BoxInst/Base-BoxInst.yaml中的训练路径,batch_size等
DATASETS:
TRAIN: ("coco_our_train",)
TEST: ("coco_our_val",)
SOLVER:
IMS_PER_BATCH: 2
BASE_LR: 0.01
STEPS: (60000, 80000)
MAX_ITER: 90000
7.开始训练
python tools/train_net.py --config-file configs/BoxInst/MS_R_50_1x.yaml --num-gpus 2 OUTPUT_DIR training_dir/BoxInst_MS_R_50_1x
8.测试
python demo/demo.py config-file configs/BoxInst/MS_R_50_3x.yaml input input1.jpg input2.jpg opts MODEL.WEIGHTS BoxInst_MS_R_50_3x.pth
如有错误欢迎指出,谢谢观看!