
    Yh5                         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dS )	    N)ndimagec                   B     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                 d    t          t          |                                            || _        d S N)superr   __init__eps)selfr   	__class__s     r/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/easyocr/DBNet/decoders/dice_loss.pyr
   zDiceLoss.__init__   s*    h&&(((    Npredc                     |                                 dk    s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   s?     xxzzQ

}}T2tW555r   c                    |                                 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                                  }||z                                  ||z                                  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::??1aaa
#DAAAq!!!QQQJBzRX%%%%zTZ''''=DJ....T>Dr	D(--//!!##rDyoo&7&77$(B3%--qyyyyr   )r   r   )
__name__
__module____qualname____doc__r
   torchTensorr   r   __classcell__r   s   @r   r   r      sx         
     6 6EL 6 6 6 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.
    r         @c                 r    t          t          |                                            || _        || _        d S r   )r	   r)   r
   r   coverage_scale)r   r   r,   r   s      r   r
   zLeakyDiceLoss.__init__2   s4    mT""++---,r   c                    |                                 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                                  ||z                                  | j        z   z  }|dk    sJ d|z
  }||z  |z                                  ||z                                  | 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   s8   88::??1aaa
#DAAAq!!!QQQJBzRX%%%%zTZ''''4K"$))++T	/@/@48/KL1}}}}x<+"''))dTk->->-@-@48-KL{{{{V$--6T8F;;;;;r   )r   r*   )r    r!   r"   r#   r
   r   r&   r'   s   @r   r)   r)   -   sV         - - - - - -
< < < < < < <r   r)   c                   @    e Zd ZdZg dZ	 	 ddZdd	Zd
 Zd Zd Z	dS )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   none333333?皙?Nd   r   c                     t           j                            |            || _        || _        || _        | j        d| _        | j        | j        v sJ || _        || _        d S )Nr3   )	nnModuler
   	threshold
iou_thresh	reduction	REDUCTIONmax_regionsr   )r   r;   r<   r=   r?   r   s         r   r
   zInstanceDiceLoss.__init__T   sd    
	4   "$">!#DN~////&r   c                 b   |                                                                                                 }g }g }t          |j        d                   D ]}||         }| ||          }t          j        |d                   \  }}	t          | j        |	          }	g }
t          d|	          D ]d}t          j
        ||k                                  |j                                      t          j                  }|
                    |           e|                    |
           ||fS )z
        Args:
            tensor_on_gpu: (N, 1, H, W)
            blur: Lambda. If exists, each instance will be blured using `blur`.
        r   Nr   )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   rE   zInstanceDiceLoss.label`   s/    ""$$++--3355 !4Q!788 	/ 	/Kk*H4>>(/hqk(B(B%I~ !1>BBNLq.11 . . +!U*, ,,.B}/C,D,DTT%-EXEX ##H----  ....o--r   c                     ||z                                   }t          ||                                 z  ||                                 z            S r   )r   max)r   r   r   overlaps       r   iouzInstanceDiceLoss.ioux   s?    "9//##7TXXZZ'26688);<<<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        k              \  }}|                     |          \  }}g }t          |          D ]\  }}	||         }
|	|
d }t          t          t          |
                              }|	D ]}d }t          |
          D ]\  }}| 	                    ||          | j
        k    r|                     ||         d         ||         d         ||         ||z   dk                        t           j                  z            }|                     ||          }||v r|                    |           |8|                     ||         d         ||         d         ||         |z            }|                     ||          }	 |D ]T}|                     ||                     ||         d         ||         d         ||         |
|         z                      }U||                    |           | j        dk    r|}n9| j        dv sJ t          |          }t%          |          }| j        dk    r||z  }|S )Nr   r4   )r   r3   r3   )r$   cudasynchronizerE   r;   	enumeratesetrD   lenr[   r<   r   rJ   rK   r`   removerL   r=   r   )r   r   r   r   pred_label_maps_gt_label_mapslossesrR   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-E &	+ &	+)K)!0!='+=+EK"5-?)@)@#A#ABB#3 N N $9BCU9V9V D D5N$5xx 1?CCdoUU%)]] $[ 1! 4boa6H $[ 15F5X[\5\4b4bchcp4q4q q&s &s
 )-(;(;M:(V(V)-===,33NCCC ($(MM -a0"[/!2D -?%A %AM #11+}MM #3 U U"11# -a0"[/!2D -0B>0RRT TU U &k***>V##DD>_4444KKEv;;D~''e|r   )r5   r6   Nr7   r   r   )
r    r!   r"   r#   r>   r
   rE   r[   r`   r   r]   r   r   r2   r2   H   s          (''I@D&*
 
 
 
. . . .0= = =  7 7 7 7 7r   r2   )r$   torch.nnr9   rC   npcv2scipyr   r:   r   r)   r2   r]   r   r   <module>rz      s               



      " " " " "ry " " "J< < < < <BI < < <6r r r r rx r r r r rr   