o
    á,Ëhæ  ã                   @   s<   d dl Z d dlmZ d dlm  mZ G dd„ dejƒZdS )é    Nc                       sp   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd	d
„Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Z‡  ZS )ÚPSS_Lossc                    s*   t t| ƒ ¡  d| _td| d ƒ| _d S )Ngíµ ÷Æ°>zself.Ú_loss)Úsuperr   Ú__init__ÚepsÚevalÚ	criterion)ÚselfÚcls_loss©Ú	__class__© úZ/var/www/html/scripts/venv/lib/python3.10/site-packages/easyocr/DBNet/decoders/pss_loss.pyr      s   zPSS_Loss.__init__c                 C   sZ   t  || | ¡}t  || ¡t  || ¡ | j }dd| |  }|dkr+t||ƒ |S )Né   ç       @)ÚtorchÚsumr   Úprint)r	   ÚpredÚgtÚmÚintersectionÚunionÚlossr   r   r   Ú	dice_loss   s   "
zPSS_Loss.dice_lossc                 C   s,  |dk|dk }|dk|dk }|  ¡  ¡  ¡ }|  ¡  ¡  ¡ }|dks*||d k r1|  |||¡S t|d ƒ}|| }|| }	tj|	dd\}
}|
d |… }| ¡ }|j 	d¡ | 
¡ }| ¡ }|j 	d¡ | 
¡ }t ||f¡}t ||f¡}t || ¡}t |¡t |¡ | j }dd| |  }|S )	Nr   r   g      @é   T)Ú
descendingg      ð?r   )Úfloatr   Úitemr   Úintr   ÚsortÚcloneÚdataÚfill_ÚdetachÚcatr   )r	   r   r   r   Ú	pos_indexÚ	neg_indexÚpos_numÚneg_numÚpos_predÚneg_predÚneg_sortÚ_Úsampled_neg_predÚpos_gtÚneg_gtÚtpredÚtgtr   r   r   r   r   r   Údice_ohnm_loss   s.   zPSS_Loss.dice_ohnm_lossç      Ð?ç333333ã?c                 C   s†   |dk  ¡ }|dk  ¡ }|| t d|j |¡ d| | t |j|¡  }tj|||dd}	t |	| ¡| j| ¡   }
|
d9 }
|
S )Nr   r   Únone©ÚweightÚ	reductioné
   )r   r   Úpowr"   ÚFÚbinary_cross_entropyr   r   )r	   r   r   r   ÚalphaÚgammaÚpos_maskÚneg_maskÚmaskÚlr   r   r   r   Ú
focal_loss.   s   ÿÿÿÿzPSS_Loss.focal_lossc                 C   s˜   |  ¡ \}}}t |¡dksJ ‚|| ¡  }|| ¡  }|dk ¡ }	|	 ¡ d|	  ¡  ¡  d|	  ¡ |	 ¡  ¡   }||	  d¡ }tj	|||dd}
|
S )Nr   r   r   )r9   )
Úsizer   ÚmaxÚbyteÚsqueezer   r   r   r<   r=   )r	   r   r   r   ÚnÚhÚwÚ	pos_neg_pÚ	pos_neg_tr@   r   r   r   r   Úwbce_orig_loss9   s   ÿzPSS_Loss.wbce_orig_lossc           	      C   sf   |dk  ¡ | }|dk  ¡ | }|| ¡  | ¡  | }tj|||dd}t |¡| ¡ | j  }|S )Nr   r   r6   r7   )r   r   r<   r=   r   r   )	r	   r   r   r   r@   rA   rB   rC   r   r   r   r   Ú	wbce_lossE   s   zPSS_Loss.wbce_lossc                 C   s(   t j|||dd}|| ¡ | j  }|S )Nr   r7   )r<   r=   r   r   )r	   r   r   r   rC   r   r   r   r   Úbce_lossO   s   zPSS_Loss.bce_lossc                 C   ó    |   |||¡|  |||¡ d S ©Nr   )r   rP   ©r	   r   r   r   r   r   r   Údice_bce_lossT   ó    zPSS_Loss.dice_bce_lossc                 C   rQ   rR   )r3   rP   rS   r   r   r   Údice_ohnm_bce_lossW   rU   zPSS_Loss.dice_ohnm_bce_lossÚshrinkc              	   C   sj  |dkr|   |||¡}|S |dkrG|   ||d d …d d…d d …d d …f |¡}|d d …dd d …d d …f }t |d¡\}}||  |||¡7 }|S |dkr°|   |d d …d d…d d …d d …f |d d …d d…d d …d d …f |¡}	|d d …dd d …d d …f }t |d¡\}}|	|  |||¡7 }	|  |d d …dd d …d d …f |d d …dd d …d d …f |¡}
|	|
fS td|ƒS )NrW   Úpssé   r   Úbothé   zgt_type [%s] is not implemented)Úget_lossr   rF   r   ÚNotImplementedError)r	   r   r   rB   Úgt_typer   Úg_gÚg_pr-   Úpss_lossÚshrink_lossr   r   r   ÚforwardZ   s&   *F6ÿ
zPSS_Loss.forwardc                 C   sd   t  d¡}t| d¡ƒD ]#}||  |d d …|d d …d d …f |d d …|d d …d d …f |¡7 }q|S )Ng        r   )r   ÚtensorÚrangerE   r   )r	   r   r   rB   r   Úindr   r   r   r\   o   s   
DzPSS_Loss.get_loss)r4   r5   )rW   )Ú__name__Ú
__module__Ú__qualname__r   r   r3   rD   rN   rO   rP   rT   rV   rc   r\   Ú__classcell__r   r   r   r   r      s    


r   )r   Útorch.nnÚnnÚtorch.nn.functionalÚ
functionalr<   ÚModuler   r   r   r   r   Ú<module>   s    