Correct IOU method

Hello, I want to calculate intersection over union accuracy for segmentation. I have to method for IOU but I obtain something different. Can you help me?

Untitled 
#Method1
def jaccard_loss(logits, true, eps=1e-7):
  Args:
    true: a tensor of shape [B, H, W] or [B, 1, H, W].
    logits: a tensor of shape [B, C, H, W]. Corresponds to
      the raw output or logits of the model.
    eps: added to the denominator for numerical stability.
  Returns:
    jacc_loss: the Jaccard loss.
  """
  num_classes = logits.shape[1]
  if num_classes == 1:
    true_1_hot = torch.eye(num_classes + 1)[true.squeeze(1)]
    true_1_hot = true_1_hot.permute(0, 3, 1, 2).float()
    true_1_hot_f = true_1_hot[:, 0:1, :, :]
    true_1_hot_s = true_1_hot[:, 1:2, :, :]
    true_1_hot = torch.cat([true_1_hot_s, true_1_hot_f], dim=1)
    pos_prob = torch.sigmoid(logits)
    neg_prob = 1 - pos_prob
    probas = torch.cat([pos_prob, neg_prob], dim=1)
  else:
    true_1_hot = torch.eye(num_classes)[true.squeeze(1)]
    true_1_hot = true_1_hot.permute(0, 3, 1, 2).float()
    probas = F.softmax(probas, dim=1)
  true_1_hot = true_1_hot.type(logits.type())
  dims = (0,) + tuple(range(2, true.ndimension()))
  intersection = torch.sum(probas * true_1_hot, dims)
  cardinality = torch.sum(probas + true_1_hot, dims)
  union = cardinality - intersection
  jacc_loss = (intersection / (union + eps)).mean()
  return jacc_loss
  
  
  #Method2
def. ...
   loop dataset
       intersection = np.logical_and(mask, lbl_pred)
       union = np.logical_or(mask, lbl_pred)
       iou_score = np.sum(intersection.cpu().detach().numpy()) / np.sum(union.cpu().detach().numpy())
       to += iou_score
    return to/size

First method give me iou = 0,3 second iou= 0,56