
    y h5                         d dl Z d dlmZ d dlZd dlZd dlmZ  G d dej                        Z	 G d dej                        Z
 G d de	      Zy)	    N)ndimagec                   L     e Zd ZdZd fd	Zddej                  fdZd Z xZ	S )DiceLossz
    Loss function from https://arxiv.org/abs/1707.03237,
    where iou computation is introduced heatmap manner to measure the
    diversity bwtween tow heatmaps.
    c                 8    t         t        |           || _        y N)superr   __init__eps)selfr
   	__class__s     |/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/easyocr/DBNet/decoders/dice_loss.pyr	   zDiceLoss.__init__   s    h&(    predc                 z    |j                         dk(  sJ |j                                | j                  ||||      S )z
        pred: one or two heatmaps of shape (N, 1, H, W),
            the losses of tow heatmaps are added together.
        gt: (N, 1, H, W)
        mask: (N, H, W)
           )dim_compute)r   r   gtmaskweightss        r   forwardzDiceLoss.forward   s6     xxzQ*
*}}T2tW55r   c                    |j                         dk(  r|d d dd d d d f   }|d d dd d d d f   }|j                  |j                  k(  sJ |j                  |j                  k(  sJ | |j                  |j                  k(  sJ ||z  }||z  |z  j                         }||z  j                         ||z  j                         z   | j                  z   }dd|z  |z  z
  }|dk  sJ |S )Nr   r      g       @)r   shapesumr
   )r   r   r   r   r   intersectionunionlosss           r   r   zDiceLoss._compute   s    88:?1a
#DAq!QJBzzRXX%%%zzTZZ'''==DJJ...T>Dr	D(--/!!#rDyoo&77$((B3%--qyyr   )ư>r   )
__name__
__module____qualname____doc__r	   torchTensorr   r   __classcell__r   s   @r   r   r      s"    
6ELL 6r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )LeakyDiceLosszV
    Variation from DiceLoss.
    The coverage and union are computed separately.
    c                 F    t         t        |           || _        || _        y r   )r   r)   r	   r
   coverage_scale)r   r
   r+   r   s      r   r	   zLeakyDiceLoss.__init__2   s    mT+-,r   c                    |j                         dk(  r|d d dd d d d f   }|d d dd d d d f   }|j                  |j                  k(  sJ |j                  |j                  k(  sJ ||z  |z  j                         ||z  j                         | j                  z   z  }|dk  sJ d|z
  }||z  |z  j                         ||z  j                         | j                  z   z  }|dk  sJ d|z
  }|| j                  z  |z   }|t        ||      fS )Nr   r   r   )coverageexcede)r   r   r   r
   r+   dict)r   r   r   r   r-   r.   r   s          r   r   zLeakyDiceLoss.forward7   s   88:?1a
#DAq!QJBzzRXX%%%zzTZZ'''4K"$))+T	/@488/KL1}}x<+"'')dTk->->-@488-KL{{V$---6T8F;;;r   )r   g      @)r    r!   r"   r#   r	   r   r&   r'   s   @r   r)   r)   -   s    -
<r   r)   c                   >    e Zd ZdZg dZ	 	 d	dZd
dZd Zd Zd Z	y)InstanceDiceLossa  
    DiceLoss normalized on each instance.
    Input:
        pred: (N, 1, H, W)
        gt: (N, 1, H, W)
        mask: (N, H, W)
    Note: This class assume that input tensors are on gpu,
        while cput computation is required to find union areas.
    )meanr   noneNc                     t         j                  j                  |        || _        || _        || _        | j
                  d| _        | j
                  | j                  v sJ || _        || _        y )Nr2   )	nnModuler	   	threshold
iou_thresh	reduction	REDUCTIONmax_regionsr
   )r   r7   r8   r9   r;   r
   s         r   r	   zInstanceDiceLoss.__init__T   s_    
		4 "$">>!#DN~~///&r   c                 *   |j                         j                         j                         }g }g }t        |j                  d         D ]  }||   }| ||      }t        j                  |d         \  }}	t        | j                  |	      }	g }
t        d|	      D ]a  }t        j                  ||k(        j                  |j                        j                  t        j                        }|
j                  |       c |j                  |
        ||fS )z
        Args:
            tensor_on_gpu: (N, 1, H, W)
            blur: Lambda. If exists, each instance will be blured using `blur`.
        r   r   )cpudetachnumpyranger   r   labelminr;   r$   
from_numpytodevicetypefloat32append)r   tensor_on_gpublurtensorinstance_mapsinstance_countsbatch_indexinstance	lable_mapinstance_countinstance_mapindexs               r   rA   zInstanceDiceLoss.label`   s    ""$++-335 !4!4Q!78 	/Kk*H>(/hqk(B%I~ !1!1>BNLq.1 . ++!U*,,.B}/C/C,DTT%--EX ##H-.   .	/ o--r   c                     ||z  j                         }t        ||j                         z  ||j                         z        S r   )r   max)r   r   r   overlaps       r   iouzInstanceDiceLoss.ioux   s5    "9//#7TXXZ'2668);<<r   c                     ||S ||S ||z   S r    )r   destvalues      r   replace_or_addzInstanceDiceLoss.replace_or_add|   s     <L=Ke|r   c                 :   t         j                  j                          | j                  || j                  kD        \  }}| j                  |      \  }}g }t        |      D ]i  \  }}	||   }
|	|
d }t        t        t        |
                  }|	D ]  }d }t        |
      D ]  \  }}| j                  ||      | j                  kD  s&| j                  ||   d   ||   d   ||   ||z   dkD  j                  t         j                        z        }| j                  ||      }||v s|j                  |        |%| j                  ||   d   ||   d   ||   |z        }| j                  ||      } 	 |D ]:  }| j                  || j                  ||   d   ||   d   ||   |
|   z              }< |Y|j!                  |       l | j"                  dk(  r|}|S | j"                  dv sJ t        |      }t%        |      }| j"                  dk(  r||z  }|S )Nr   r3   )r   r2   r2   )r$   cudasynchronizerA   r7   	enumeratesetr@   lenrW   r8   r   rF   rG   r\   removerH   r9   r   )r   r   r   r   pred_label_maps_gt_label_mapslossesrN   gt_instance_mapspred_instance_mapssingle_lossmask_not_matchedgt_instance_mapinstance_lossinstance_indexpred_instance_map
match_lossr   counts                       r   r   zInstanceDiceLoss.forward   s   

 !ZZt~~(=>::b>q-6}-E &	+)K)!0!='+=+EK"5-?)@#AB#3 N $9BCU9V D5N$5xx 1?CdooU%)]] $[ 1! 4boa6H $[ 15F5X[\5\4b4bchcpcp4q q&s
 )-(;(;M:(V)-==,33NCD !($(MM -a0"[/!2D -?%AM #11+}MN  #3 U"11# -a0"[/!2D -0B>0RRTUU &k*M&	+P >>V#D  >>_444KEv;D~~'e|r   )g333333?g?Nd   r   r   )
r    r!   r"   r#   r:   r	   rA   rW   r\   r   rY   r   r   r1   r1   H   s-     (I@D&*
.0=7r   r1   )r$   torch.nnr5   r?   npcv2scipyr   r6   r   r)   r1   rY   r   r   <module>rw      sC       
 "ryy "J<BII <6rx rr   