in easycv/models/loss/set_criterion/set_criterion.py [0:0]
def forward(self, mask_dict, aux_num):
"""
compute dn loss in criterion
Args:
mask_dict: a dict for dn information
training: training or inference flag
aux_num: aux loss number
"""
losses = {}
if self.training and 'output_known_lbs_bboxes' in mask_dict:
known_labels, known_bboxs, output_known_class, output_known_coord, num_tgt = self.prepare_for_loss(
mask_dict)
l_dict = self.tgt_loss_labels(output_known_class[-1], known_labels,
num_tgt, 0.25)
l_dict = {
k + '_dn':
v * (self.weight_dict[k] if k in self.weight_dict else 1.0)
for k, v in l_dict.items()
}
losses.update(l_dict)
l_dict = self.tgt_loss_boxes(output_known_coord[-1], known_bboxs,
num_tgt)
l_dict = {
k + '_dn':
v * (self.weight_dict[k] if k in self.weight_dict else 1.0)
for k, v in l_dict.items()
}
losses.update(l_dict)
else:
losses['loss_bbox_dn'] = torch.as_tensor(0.).to('cuda')
losses['loss_giou_dn'] = torch.as_tensor(0.).to('cuda')
losses['loss_ce_dn'] = torch.as_tensor(0.).to('cuda')
if aux_num:
for i in range(aux_num):
# dn aux loss
if self.training and 'output_known_lbs_bboxes' in mask_dict:
l_dict = self.tgt_loss_labels(output_known_class[i],
known_labels, num_tgt, 0.25)
l_dict = {
k + f'_dn_{i}': v *
(self.weight_dict[k] if k in self.weight_dict else 1.0)
for k, v in l_dict.items()
}
losses.update(l_dict)
l_dict = self.tgt_loss_boxes(output_known_coord[i],
known_bboxs, num_tgt)
l_dict = {
k + f'_dn_{i}': v *
(self.weight_dict[k] if k in self.weight_dict else 1.0)
for k, v in l_dict.items()
}
losses.update(l_dict)
else:
l_dict = dict()
l_dict['loss_bbox_dn'] = torch.as_tensor(0.).to('cuda')
l_dict['loss_giou_dn'] = torch.as_tensor(0.).to('cuda')
l_dict['loss_ce_dn'] = torch.as_tensor(0.).to('cuda')
l_dict = {
k + f'_{i}': v *
(self.weight_dict[k] if k in self.weight_dict else 1.0)
for k, v in l_dict.items()
}
losses.update(l_dict)
return losses