Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add use_nms option #318

Merged
merged 4 commits into from Nov 30, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion mmpose/datasets/datasets/top_down/topdown_aic_dataset.py
Expand Up @@ -54,7 +54,7 @@ def __init__(self,
self.use_gt_bbox = data_cfg['use_gt_bbox']
self.bbox_file = data_cfg['bbox_file']
self.image_thr = data_cfg['image_thr']

self.use_nms = data_cfg.get('use_nms', True)
self.soft_nms = data_cfg['soft_nms']
self.nms_thr = data_cfg['nms_thr']
self.oks_thr = data_cfg['oks_thr']
Expand Down
19 changes: 11 additions & 8 deletions mmpose/datasets/datasets/top_down/topdown_coco_dataset.py
Expand Up @@ -64,7 +64,7 @@ def __init__(self,
self.use_gt_bbox = data_cfg['use_gt_bbox']
self.bbox_file = data_cfg['bbox_file']
self.image_thr = data_cfg['image_thr']

self.use_nms = data_cfg.get('use_nms', True)
self.soft_nms = data_cfg['soft_nms']
self.nms_thr = data_cfg['nms_thr']
self.oks_thr = data_cfg['oks_thr']
Expand Down Expand Up @@ -344,7 +344,7 @@ def evaluate(self, outputs, res_folder, metric='mAP', **kwargs):
num_joints = self.ann_info['num_joints']
vis_thr = self.vis_thr
oks_thr = self.oks_thr
oks_nmsed_kpts = []
valid_kpts = []
for image_id in kpts.keys():
img_kpts = kpts[image_id]
for n_p in img_kpts:
Expand All @@ -361,15 +361,18 @@ def evaluate(self, outputs, res_folder, metric='mAP', **kwargs):
# rescoring
n_p['score'] = kpt_score * box_score

nms = soft_oks_nms if self.soft_nms else oks_nms
keep = nms(list(img_kpts), oks_thr, sigmas=self.sigmas)
if self.use_nms:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if self.use_nms and len(img_kpts) > 0:

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to discussion, nms will always return values if input is non-empty

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We might need these lines in case of len(img_kpts)=0.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see the code posted above

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Em,,, I mean it's very likely that "img_kpts = kpts[image_id]" gets an empty list [ ], in the case of which nms will return an empty list [ ] and "if len(keep) == 0: valid_kpts.append(img_kpts)" would be necessary.
2020-11-29 23-47-14屏幕截图

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, so nms does not guarantee that the return be non-empty when img_kpts is non-empty?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, now I get the point. I erroneously thought that [img_kpts[_keep] for _keep in keep] would raise raise if keep=[] and img_kpts=[], but it won't.
2020-11-30 08-28-08屏幕截图
And sure nms does guarantee that. I was talking about the empty case but now it's also not a problem. So if len(keep) == 0: valid_kpts.append(img_kpts) is unnecessary in both cases. I will rm these lines.

nms = soft_oks_nms if self.soft_nms else oks_nms
keep = nms(list(img_kpts), oks_thr, sigmas=self.sigmas)

if len(keep) == 0:
oks_nmsed_kpts.append(img_kpts)
if len(keep) == 0:
valid_kpts.append(img_kpts)
else:
valid_kpts.append([img_kpts[_keep] for _keep in keep])
else:
oks_nmsed_kpts.append([img_kpts[_keep] for _keep in keep])
valid_kpts.append(img_kpts)

self._write_coco_keypoint_results(oks_nmsed_kpts, res_file)
self._write_coco_keypoint_results(valid_kpts, res_file)

info_str = self._do_python_keypoint_eval(res_file)
name_value = OrderedDict(info_str)
Expand Down
Expand Up @@ -49,7 +49,7 @@ def __init__(self,
self.use_gt_bbox = data_cfg['use_gt_bbox']
self.bbox_file = data_cfg['bbox_file']
self.image_thr = data_cfg['image_thr']

self.use_nms = data_cfg.get('use_nms', True)
self.soft_nms = data_cfg['soft_nms']
self.nms_thr = data_cfg['nms_thr']
self.oks_thr = data_cfg['oks_thr']
Expand Down
Expand Up @@ -52,7 +52,7 @@ def __init__(self,
self.use_gt_bbox = data_cfg['use_gt_bbox']
self.bbox_file = data_cfg['bbox_file']
self.image_thr = data_cfg['image_thr']

self.use_nms = data_cfg.get('use_nms', True)
self.soft_nms = data_cfg['soft_nms']
self.nms_thr = data_cfg['nms_thr']
self.oks_thr = data_cfg['oks_thr']
Expand Down
Expand Up @@ -61,7 +61,7 @@ def __init__(self,
self.use_gt_bbox = data_cfg['use_gt_bbox']
self.bbox_file = data_cfg['bbox_file']
self.image_thr = data_cfg['image_thr']

self.use_nms = data_cfg.get('use_nms', True)
self.soft_nms = data_cfg['soft_nms']
self.nms_thr = data_cfg['nms_thr']
self.oks_thr = data_cfg['oks_thr']
Expand Down
24 changes: 13 additions & 11 deletions mmpose/datasets/datasets/top_down/topdown_posetrack18_dataset.py
Expand Up @@ -65,7 +65,7 @@ def __init__(self,
self.use_gt_bbox = data_cfg['use_gt_bbox']
self.bbox_file = data_cfg['bbox_file']
self.image_thr = data_cfg['image_thr']

self.use_nms = data_cfg.get('use_nms', True)
self.soft_nms = data_cfg['soft_nms']
self.nms_thr = data_cfg['nms_thr']
self.oks_thr = data_cfg['oks_thr']
Expand Down Expand Up @@ -165,7 +165,7 @@ def evaluate(self, outputs, res_folder, metric='mAP', **kwargs):
num_joints = self.ann_info['num_joints']
vis_thr = self.vis_thr
oks_thr = self.oks_thr
oks_nmsed_kpts = defaultdict(list)
valid_kpts = defaultdict(list)
for image_id in kpts.keys():
img_kpts = kpts[image_id]
for n_p in img_kpts:
Expand All @@ -181,17 +181,19 @@ def evaluate(self, outputs, res_folder, metric='mAP', **kwargs):
kpt_score = kpt_score / valid_num
# rescoring
n_p['score'] = kpt_score * box_score

nms = soft_oks_nms if self.soft_nms else oks_nms
keep = nms(list(img_kpts), oks_thr, sigmas=self.sigmas)

if len(keep) == 0:
oks_nmsed_kpts[image_id].append(img_kpts)
if self.use_nms:
nms = soft_oks_nms if self.soft_nms else oks_nms
keep = nms(list(img_kpts), oks_thr, sigmas=self.sigmas)

if len(keep) == 0:
valid_kpts[image_id].append(img_kpts)
else:
valid_kpts[image_id].append(
[img_kpts[_keep] for _keep in keep])
else:
oks_nmsed_kpts[image_id].append(
[img_kpts[_keep] for _keep in keep])
valid_kpts[image_id].append(img_kpts)

self._write_posetrack18_keypoint_results(oks_nmsed_kpts, gt_folder,
self._write_posetrack18_keypoint_results(valid_kpts, gt_folder,
pred_folder)

info_str = self._do_python_keypoint_eval(gt_folder, pred_folder)
Expand Down