|
|
|
@ -19,7 +19,6 @@ from __future__ import print_function
|
|
|
|
|
import paddle
|
|
|
|
|
from paddle import nn
|
|
|
|
|
from .det_basic_loss import DiceLoss
|
|
|
|
|
import paddle.fluid as fluid
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -27,9 +26,7 @@ class SASTLoss(nn.Layer):
|
|
|
|
|
"""
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self,
|
|
|
|
|
eps=1e-6,
|
|
|
|
|
**kwargs):
|
|
|
|
|
def __init__(self, eps=1e-6, **kwargs):
|
|
|
|
|
super(SASTLoss, self).__init__()
|
|
|
|
|
self.dice_loss = DiceLoss(eps=eps)
|
|
|
|
|
|
|
|
|
@ -53,10 +50,12 @@ class SASTLoss(nn.Layer):
|
|
|
|
|
score_loss = 1.0 - 2 * intersection / (union + 1e-5)
|
|
|
|
|
|
|
|
|
|
#border loss
|
|
|
|
|
l_border_split, l_border_norm = paddle.split(l_border, num_or_sections=[4, 1], axis=1)
|
|
|
|
|
l_border_split, l_border_norm = paddle.split(
|
|
|
|
|
l_border, num_or_sections=[4, 1], axis=1)
|
|
|
|
|
f_border_split = f_border
|
|
|
|
|
border_ex_shape = l_border_norm.shape * np.array([1, 4, 1, 1])
|
|
|
|
|
l_border_norm_split = paddle.expand(x=l_border_norm, shape=border_ex_shape)
|
|
|
|
|
l_border_norm_split = paddle.expand(
|
|
|
|
|
x=l_border_norm, shape=border_ex_shape)
|
|
|
|
|
l_border_score = paddle.expand(x=l_score, shape=border_ex_shape)
|
|
|
|
|
l_border_mask = paddle.expand(x=l_mask, shape=border_ex_shape)
|
|
|
|
|
|
|
|
|
@ -72,7 +71,8 @@ class SASTLoss(nn.Layer):
|
|
|
|
|
(paddle.sum(l_border_score * l_border_mask) + 1e-5)
|
|
|
|
|
|
|
|
|
|
#tvo_loss
|
|
|
|
|
l_tvo_split, l_tvo_norm = paddle.split(l_tvo, num_or_sections=[8, 1], axis=1)
|
|
|
|
|
l_tvo_split, l_tvo_norm = paddle.split(
|
|
|
|
|
l_tvo, num_or_sections=[8, 1], axis=1)
|
|
|
|
|
f_tvo_split = f_tvo
|
|
|
|
|
tvo_ex_shape = l_tvo_norm.shape * np.array([1, 8, 1, 1])
|
|
|
|
|
l_tvo_norm_split = paddle.expand(x=l_tvo_norm, shape=tvo_ex_shape)
|
|
|
|
@ -91,7 +91,8 @@ class SASTLoss(nn.Layer):
|
|
|
|
|
(paddle.sum(l_tvo_score * l_tvo_mask) + 1e-5)
|
|
|
|
|
|
|
|
|
|
#tco_loss
|
|
|
|
|
l_tco_split, l_tco_norm = paddle.split(l_tco, num_or_sections=[2, 1], axis=1)
|
|
|
|
|
l_tco_split, l_tco_norm = paddle.split(
|
|
|
|
|
l_tco, num_or_sections=[2, 1], axis=1)
|
|
|
|
|
f_tco_split = f_tco
|
|
|
|
|
tco_ex_shape = l_tco_norm.shape * np.array([1, 2, 1, 1])
|
|
|
|
|
l_tco_norm_split = paddle.expand(x=l_tco_norm, shape=tco_ex_shape)
|
|
|
|
@ -109,7 +110,6 @@ class SASTLoss(nn.Layer):
|
|
|
|
|
tco_loss = paddle.sum(tco_out_loss * l_tco_score * l_tco_mask) / \
|
|
|
|
|
(paddle.sum(l_tco_score * l_tco_mask) + 1e-5)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# total loss
|
|
|
|
|
tvo_lw, tco_lw = 1.5, 1.5
|
|
|
|
|
score_lw, border_lw = 1.0, 1.0
|
|
|
|
|