
    9i5                         S SK r S SKJr  S SKrS SKrS SKJr   " S S\R                  5      r	 " S S\R                  5      r
 " S S\	5      rg)	    N)ndimagec                   \   ^  \ rS rSrSrSU 4S jjrS	S\R                  4S jjrS r	Sr
U =r$ )
DiceLoss   z
Loss function from https://arxiv.org/abs/1707.03237,
where iou computation is introduced heatmap manner to measure the
diversity bwtween tow heatmaps.
c                 6   > [         [        U ]  5         Xl        g N)superr   __init__eps)selfr   	__class__s     `/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/easyocr/DBNet/decoders/dice_loss.pyr
   DiceLoss.__init__   s    h&(    predc                 x    UR                  5       S:X  d   UR                  5       5       eU R                  XX45      $ )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   forwardDiceLoss.forward   s2     xxzQ*
*}}Tt55r   c                    UR                  5       S:X  a  US S 2SS S 2S S 24   nUS S 2SS S 2S S 24   nUR                  UR                  :X  d   eUR                  UR                  :X  d   eUb   UR                  UR                  :X  d   eXC-  nX-  U-  R                  5       nX-  R                  5       X#-  R                  5       -   U R                  -   nSSU-  U-  -
  nUS::  d   eU$ )Nr   r      g       @)r   shapesumr   )r   r   r   r   r   intersectionunionlosss           r   r   DiceLoss._compute   s    88:?1a
#DAq!QJBzzRXX%%%zzTZZ'''==DJJ...>D	D(--/!!#ryoo&77$((B3%--qyyr   )r   )ư>r   )__name__
__module____qualname____firstlineno____doc__r
   torchTensorr   r   __static_attributes____classcell__r   s   @r   r   r      s'    
6ELL 6 r   r   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )LeakyDiceLoss-   zJ
Variation from DiceLoss.
The coverage and union are computed separately.
c                 B   > [         [        U ]  5         Xl        X l        g r   )r	   r/   r
   r   coverage_scale)r   r   r2   r   s      r   r
   LeakyDiceLoss.__init__2   s    mT+-,r   c                    UR                  5       S:X  a  US S 2SS S 2S S 24   nUS S 2SS S 2S S 24   nUR                  UR                  :X  d   eUR                  UR                  :X  d   eX-  U-  R                  5       X#-  R                  5       U R                  -   -  nUS::  d   eSU-
  nX-  U-  R                  5       X-  R                  5       U R                  -   -  nUS::  d   eSU-
  nX@R                  -  U-   nU[        XES94$ )Nr   r   r   )coverageexcede)r   r   r   r   r2   dict)r   r   r   r   r5   r6   r!   s          r   r   LeakyDiceLoss.forward7   s   88:?1a
#DAq!QJBzzRXX%%%zzTZZ'''K"$))+	/@488/KL1}}x<+"'')dk->->-@488-KL{{V---6T8;;;r   )r2   r   )r#   g      @)	r$   r%   r&   r'   r(   r
   r   r+   r,   r-   s   @r   r/   r/   -   s    -
< <r   r/   c                   J    \ rS rSrSr/ SQr  SS jrSS jrS rS r	S	 r
S
rg)InstanceDiceLossH   z
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                     [         R                  R                  U 5        Xl        X l        X0l        U R
                  c  SU l        U R
                  U R                  ;   d   eX@l        XPl        g )Nr<   )	nnModuler
   	threshold
iou_thresh	reduction	REDUCTIONmax_regionsr   )r   rA   rB   rC   rE   r   s         r   r
   InstanceDiceLoss.__init__T   sU    
		4 "$">>!#DN~~///&r   c                 0   UR                  5       R                  5       R                  5       n/ n/ n[        UR                  S   5       H  nX6   nUb  U" U5      n[
        R                  " US   5      u  p[        U R                  U	5      n	/ n
[        SU	5       Hb  n[        R                  " X:H  5      R                  UR                  5      R                  [        R                  5      nU
R                  U5        Md     UR                  U
5        M     XE4$ )zo
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minrE   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   rL   InstanceDiceLoss.label`   s     ""$++-335 !4!4Q!78K*H>(/hqk(B%I !1!1>BNLq.1 ++!*,,.B}/C/C,DTT%--EX ##H- 2   . 9 --r   c                 ~    X-  R                  5       n[        X1R                  5       -  X2R                  5       -  5      $ r   )r   max)r   r   r   overlaps       r   iouInstanceDiceLoss.ioux   s/    9//#7XXZ'668);<<r   c                     Uc  U$ Uc  U$ X-   $ r    )r   destvalues      r   replace_or_addInstanceDiceLoss.replace_or_add|   s    <L=K|r   c                 F   [         R                  R                  5         U R                  XR                  :  5      u  pEU R                  U5      u  pe/ n[        U5       GHm  u  pXH   n
U	b  U
c  M  S n[        [        [        U
5      5      5      nU	 H  nS n[        U
5       H  u  nnU R                  UU5      U R                  :  d  M(  U R                  X   S   X(   S   X8   UU-   S:  R                  [         R                  5      -  5      nU R                  UU5      nX;   d  M  UR                  U5        M     Uc"  U R                  X   S   X(   S   X8   U-  5      nU R                  X5      nM      U H7  nU R                  UU R                  X   S   X(   S   X8   X   -  5      5      nM9     Uc  GM\  UR!                  U5        GMp     U R"                  S:X  a  UnU$ U R"                  S;   d   e[        U5      n[%        U5      nU R"                  S:X  a  UU-  nU$ )Nr   r=   )r   r<   r<   )r)   cudasynchronizerL   rA   	enumeratesetrK   lenrc   rB   r   rQ   rR   ri   removerS   rC   r   )r   r   r   r   pred_label_maps_gt_label_mapslossesrY   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   InstanceDiceLoss.forward   sD   

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