Skip to content

Commit 8233c9c

Browse files
NicolasHugpmeier
andauthored
Properly handle maskrcnn and keypoints w.r.t. V2 in detection references (#7742)
Co-authored-by: Philip Meier <[email protected]>
1 parent 1402eb8 commit 8233c9c

File tree

2 files changed

+29
-34
lines changed

2 files changed

+29
-34
lines changed

references/detection/coco_utils.py

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import copy
21
import os
32

43
import torch
@@ -10,24 +9,6 @@
109
from torchvision.datasets import wrap_dataset_for_transforms_v2
1110

1211

13-
class FilterAndRemapCocoCategories:
14-
def __init__(self, categories, remap=True):
15-
self.categories = categories
16-
self.remap = remap
17-
18-
def __call__(self, image, target):
19-
anno = target["annotations"]
20-
anno = [obj for obj in anno if obj["category_id"] in self.categories]
21-
if not self.remap:
22-
target["annotations"] = anno
23-
return image, target
24-
anno = copy.deepcopy(anno)
25-
for obj in anno:
26-
obj["category_id"] = self.categories.index(obj["category_id"])
27-
target["annotations"] = anno
28-
return image, target
29-
30-
3112
def convert_coco_poly_to_mask(segmentations, height, width):
3213
masks = []
3314
for polygons in segmentations:
@@ -219,7 +200,7 @@ def __getitem__(self, idx):
219200
return img, target
220201

221202

222-
def get_coco(root, image_set, transforms, mode="instances", use_v2=False):
203+
def get_coco(root, image_set, transforms, mode="instances", use_v2=False, with_masks=False):
223204
anno_file_template = "{}_{}2017.json"
224205
PATHS = {
225206
"train": ("train2017", os.path.join("annotations", anno_file_template.format(mode, "train"))),
@@ -233,9 +214,12 @@ def get_coco(root, image_set, transforms, mode="instances", use_v2=False):
233214

234215
if use_v2:
235216
dataset = torchvision.datasets.CocoDetection(img_folder, ann_file, transforms=transforms)
236-
# TODO: need to update target_keys to handle masks for segmentation!
237-
dataset = wrap_dataset_for_transforms_v2(dataset, target_keys={"boxes", "labels", "image_id"})
217+
target_keys = ["boxes", "labels", "image_id"]
218+
if with_masks:
219+
target_keys += ["masks"]
220+
dataset = wrap_dataset_for_transforms_v2(dataset, target_keys=target_keys)
238221
else:
222+
# TODO: handle with_masks for V1?
239223
t = [ConvertCocoPolysToMask()]
240224
if transforms is not None:
241225
t.append(transforms)
@@ -249,9 +233,3 @@ def get_coco(root, image_set, transforms, mode="instances", use_v2=False):
249233
# dataset = torch.utils.data.Subset(dataset, [i for i in range(500)])
250234

251235
return dataset
252-
253-
254-
def get_coco_kp(root, image_set, transforms, use_v2=False):
255-
if use_v2:
256-
raise ValueError("KeyPoints aren't supported by transforms V2 yet.")
257-
return get_coco(root, image_set, transforms, mode="person_keypoints")

references/detection/train.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import torchvision.models.detection
2929
import torchvision.models.detection.mask_rcnn
3030
import utils
31-
from coco_utils import get_coco, get_coco_kp
31+
from coco_utils import get_coco
3232
from engine import evaluate, train_one_epoch
3333
from group_by_aspect_ratio import create_aspect_ratio_groups, GroupedBatchSampler
3434
from torchvision.transforms import InterpolationMode
@@ -42,10 +42,16 @@ def copypaste_collate_fn(batch):
4242

4343
def get_dataset(is_train, args):
4444
image_set = "train" if is_train else "val"
45-
paths = {"coco": (args.data_path, get_coco, 91), "coco_kp": (args.data_path, get_coco_kp, 2)}
46-
p, ds_fn, num_classes = paths[args.dataset]
47-
48-
ds = ds_fn(p, image_set=image_set, transforms=get_transform(is_train, args), use_v2=args.use_v2)
45+
num_classes, mode = {"coco": (91, "instances"), "coco_kp": (2, "person_keypoints")}[args.dataset]
46+
with_masks = "mask" in args.model
47+
ds = get_coco(
48+
root=args.data_path,
49+
image_set=image_set,
50+
transforms=get_transform(is_train, args),
51+
mode=mode,
52+
use_v2=args.use_v2,
53+
with_masks=with_masks,
54+
)
4955
return ds, num_classes
5056

5157

@@ -68,7 +74,12 @@ def get_args_parser(add_help=True):
6874
parser = argparse.ArgumentParser(description="PyTorch Detection Training", add_help=add_help)
6975

7076
parser.add_argument("--data-path", default="/datasets01/COCO/022719/", type=str, help="dataset path")
71-
parser.add_argument("--dataset", default="coco", type=str, help="dataset name")
77+
parser.add_argument(
78+
"--dataset",
79+
default="coco",
80+
type=str,
81+
help="dataset name. Use coco for object detection and instance segmentation and coco_kp for Keypoint detection",
82+
)
7283
parser.add_argument("--model", default="maskrcnn_resnet50_fpn", type=str, help="model name")
7384
parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu Default: cuda)")
7485
parser.add_argument(
@@ -171,6 +182,12 @@ def get_args_parser(add_help=True):
171182
def main(args):
172183
if args.backend.lower() == "datapoint" and not args.use_v2:
173184
raise ValueError("Use --use-v2 if you want to use the datapoint backend.")
185+
if args.dataset not in ("coco", "coco_kp"):
186+
raise ValueError(f"Dataset should be coco or coco_kp, got {args.dataset}")
187+
if "keypoint" in args.model and args.dataset != "coco_kp":
188+
raise ValueError("Oops, if you want Keypoint detection, set --dataset coco_kp")
189+
if args.dataset == "coco_kp" and args.use_v2:
190+
raise ValueError("KeyPoint detection doesn't support V2 transforms yet")
174191

175192
if args.output_dir:
176193
utils.mkdir(args.output_dir)

0 commit comments

Comments
 (0)