
    y h9%                        d dl Z d dlZd dlmZ  G d d      Z G d dej
                        Z G d dej
                        Z G d d	ej
                        Z G d
 dej
                        Z	 G d dej
                        Z
 G d de
      Z G d dej
                        Z G d dej
                        Z G d dej
                        Zy)    Nc                       e Zd ZdZd Zd Zy)SegDetectorLossBuildera  
    Build loss functions for SegDetector.
    Details about the built functions:
        Input:
            pred: A dict which contains predictions.
                thresh: The threshold prediction
                binary: The text segmentation prediction.
                thresh_binary: Value produced by `step_function(binary - thresh)`.
            batch:
                gt: Text regions bitmap gt.
                mask: Ignore mask,
                    pexels where value is 1 indicates no contribution to loss.
                thresh_mask: Mask indicates regions cared by thresh supervision.
                thresh_map: Threshold gt.
        Return:
            (loss, metrics).
            loss: A scalar loss value.
            metrics: A dict contraining partial loss values.
    c                 .    || _         || _        || _        y N)
loss_class	loss_argsloss_kwargs)selfr   argskwargss       /home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/easyocr/DBNet/decoders/seg_detector_loss.py__init__zSegDetectorLossBuilder.__init__   s    $!    c                      t        t        j                  t           | j                        | j
                  i | j                  S r   )getattrsysmodules__name__r   r   r	   )r
   s    r   buildzSegDetectorLossBuilder.build!   s3    >ws{{8,doo>cRVRbRbccr   N)r   
__module____qualname____doc__r   r    r   r   r   r      s    ("
dr   r   c                   *     e Zd ZdZd fd	Zd Z xZS )DiceLossJ
    DiceLoss on binary.
    For SegDetector without adaptive module.
    c                 P    t         t        |           ddlm}  ||      | _        y N   r   )superr   r   	dice_lossloss)r
   epsLoss	__class__s      r   r   zDiceLoss.__init__+   s    h&(/I	r   c                 V    | j                  |d   |d   |d         }|t        |      fS Nbinarygtmask)r"   r#   dictr
   predbatchr#   s       r   forwardzDiceLoss.forward0   0    yyhteFmDTD)))r   ư>r   r   r   r   r   r1   __classcell__r&   s   @r   r   r   %   s    

*r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )BalanceBCELossr   c                 N    t         t        |           ddlm}  |       | _        y )Nr   BalanceCrossEntropyLoss)r!   r9   r   balance_cross_entropy_lossr<   r#   )r
   r$   r<   r&   s      r   r   zBalanceBCELoss.__init__;   s    nd,.G+-	r   c                 V    | j                  |d   |d   |d         }|t        |      fS r(   r,   r.   s       r   r1   zBalanceBCELoss.forward@   r2   r   r3   r5   r7   s   @r   r9   r9   5   s    
.
*r   r9   c                   *     e Zd ZdZd fd	Zd Z xZS )AdaptiveDiceLosszZ
    Integration of DiceLoss on both binary
        prediction and thresh prediction.
    c                 j    t         t        |           ddlm}  ||      | _         ||      | _        y r   )r!   r@   r   r"   r   	main_lossthresh_loss)r
   r$   r   r&   s      r   r   zAdaptiveDiceLoss.__init__K   s+    .0'!##C=r   c                     t        |t              sJ d|v sJ d|v sJ |d   }|d   }|d   }|d   }| j                  |||      }| j                  |||      }||z   }	|	t        ||      fS )Nr)   thresh_binaryr*   r+   )rB   rC   )
isinstancer-   rB   rC   )
r
   r/   r0   r)   rE   r*   r+   rB   rC   r#   s
             r   r1   zAdaptiveDiceLoss.forwardQ   s    $%%%4$&&&h_-4[V}NN62t4	&&}b$?;&TI;GGGr   r3   r5   r7   s   @r   r@   r@   E   s    
)Hr   r@   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )AdaptiveInstanceDiceLossz<
    InstanceDiceLoss on both binary and thresh_bianry.
    c                    t         t        |           ddlm}m}  |       | _         |       | _         |       | _         |       | _	        t        j                  t        t        j                  t        j                  d            t        j                  t        j                  d            t        j                  t        j                  d            t        j                  t        j                  d                        | _        y )Nr   )InstanceDiceLossr   )mainthreshmain_instancethresh_instance)r!   rH   r   r"   rJ   r   rB   main_instance_lossrC   thresh_instance_lossnnParameterDictr-   	Parametertorchonesweights)r
   
iou_threshrL   rJ   r   r&   s        r   r   z!AdaptiveInstanceDiceLoss.__init__e   s    &689!"2"4#:$4$6!''ejjm,<<

1.,,uzz!}5LLA7	)9 :r   c                 ^    ||z  t        j                  t        j                  |            z   S r   )rT   logsqrt)r
   weightr#   s      r   partial_lossz%AdaptiveInstanceDiceLoss.partial_lossr   s#    f}uyyF);<<<r   c                 <   | j                  |d   |d   |d         }| j                  |d   |d   |d         }| j                  |d   |d   |d         }| j                  |d   |d   |d         }| j	                  | j
                  d   |      | j	                  | j
                  d   |      z   | j	                  | j
                  d   |      z   | j	                  | j
                  d   |      z   }t        ||||	      }|j                  | j
                         ||fS )
Nr)   r*   r+   rE   rK   rL   rM   rN   )rB   rC   rO   rP   )rB   rC   rO   rP   r\   rV   r-   update)	r
   r/   r0   rB   rC   rO   rP   r#   metricss	            r   r1   z AdaptiveInstanceDiceLoss.forwardu   s<   NN4>5;fN	&&tO'<eDk5QW=Y!44NE$Kv8#88!5;f ?  f!5yA""4<<#9;GH""4<<#@BTUV ""4<<0A#BDXYZ #1!5	7
 	t||$W}r   )g?g333333?)r   r   r   r   r   r\   r1   r6   r7   s   @r   rH   rH   `   s    :=r   rH   c                   *     e Zd ZdZd fd	Zd Z xZS )
L1DiceLosszA
    L1Loss on thresh, DiceLoss on thresh_binary and binary.
    c                 ~    t         t        |           t        |      | _        ddlm}  |       | _        || _        y )Nr$   r   
MaskL1Loss)r!   ra   r   r@   r"   l1_lossre   l1_scale)r
   r$   rg   re   r&   s       r   r   zL1DiceLoss.__init__   s/    j$(*)c2'!| r   c                     | j                  ||      \  }}| j                  |d   |d   |d         \  }}|| j                  |z  z   } |j                  di | ||fS )NrL   
thresh_mapthresh_maskr   )r"   rf   rg   r^   )r
   r/   r0   r"   r_   rf   	l1_metricr#   s           r   r1   zL1DiceLoss.forward   sp    !^^D%8	7!\\NE,/}1EG 4==722##W}r   r4   
   r5   r7   s   @r   ra   ra      s    !r   ra   c                       e Zd ZdZddZy)FullL1DiceLossz
    L1loss on thresh, pixels with topk losses in non-text regions are also counted.
    DiceLoss on thresh_binary and binary.
    c                     t         j                  j                  |        t        |      | _        ddlm}  |       | _        || _        y )Nrc   r   )BalanceL1Loss)rQ   Moduler   r@   r"   rf   rq   rg   )r
   r$   rg   rq   s       r   r   zFullL1DiceLoss.__init__   s3    
		4 )c2*$ r   Nrl   )r   r   r   r   r   r   r   r   ro   ro      s    
!r   ro   c                   *     e Zd ZdZd fd	Zd Z xZS )L1BalanceCELossz
    Balanced CrossEntropy Loss on `binary`,
    MaskL1Loss on `thresh`,
    DiceLoss on `thresh_binary`.
    Note: The meaning of inputs can be figured out in `SegDetectorLossBuilder`.
    c                     t         t        |           ddlm} ddlm} ddlm}  ||      | _         |       | _         |       | _	        || _
        || _        y Nr   r    rd   r;   rc   )r!   rt   r   r"   r   rf   re   r=   r<   bce_lossrg   	bce_scaler
   r$   rg   rx   r   re   r<   r&   s          r   r   zL1BalanceCELoss.__init__   F    ot-/''G!c*!|/1 "r   c                 V   | j                  |d   |d   |d         }t        |      }d|v rx| j                  |d   |d   |d         \  }}| j                  |d   |d   |d         }||d	<   || j                  |z  z   || j
                  z  z   } |j                  d
i | ||fS |}||fS )Nr)   r*   r+   rw   rL   ri   rj   rE   rC   r   )rw   r-   rf   r"   rg   rx   r^   )	r
   r/   r0   rw   r_   rf   rk   r"   r#   s	            r   r1   zL1BalanceCELoss.forward   s    ==hteFmL)t!%d8neL>QSXYfSg!hGYtO'<eDk5QW=YI%.GM"t}}w66DNN9RRDGNN'Y' W} DW}r   r4   rm      r5   r7   s   @r   rt   rt      s    
#r   rt   c                   *     e Zd ZdZd fd	Zd Z xZS )L1BCEMiningLosszx
    Basicly the same with L1BalanceCELoss, where the bce loss map is used as
        attention weigts for DiceLoss
    c                     t         t        |           ddlm} ddlm} ddlm}  ||      | _         |       | _         |       | _	        || _
        || _        y rv   )r!   r   r   r"   r   rf   re   r=   r<   rw   rg   rx   ry   s          r   r   zL1BCEMiningLoss.__init__   rz   r   c                    | j                  |d   |d   |d   d      \  }}| j                  |d   |d   |d         \  }}||j                         z
  |j                         |j                         z
  z  }| j	                  |d	   |d   |d   |d
z         }t        |      }||d<   || j                  |z  z   || j                  z  z   }	 |j                  di | |	|fS )Nr)   r*   r+   T)return_originrL   ri   rj   rE   r   )rV   r|   rC   r   )	rw   rf   minmaxr"   r-   rg   rx   r^   )
r
   r/   r0   rw   bce_maprf   rk   r"   r_   r#   s
             r   r1   zL1BCEMiningLoss.forward   s     MM$x.%+uV}8< * >'!\\$x.%:MuUbOcdW[[]*w{{}w{{}/LMNN!5;&M7Q; # 0	 )!*4==722X5NN##W}r   r}   r5   r7   s   @r   r   r      s    

#r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )L1LeakyDiceLossz[
    LeakyDiceLoss on binary,
    MaskL1Loss on thresh,
    DiceLoss on thresh_binary.
    c                     t         t        |           ddlm}m} ddlm}  ||      | _         |       | _         ||      | _	        || _
        y )Nr   )r   LeakyDiceLossrd   )coverage_scalerc   )r!   r   r   r"   r   r   rf   re   rB   rC   rg   )r
   r$   r   rg   r   r   re   r&   s          r   r   zL1LeakyDiceLoss.__init__   s?    ot-/6'&nE!|#, r   c                    | j                  |d   |d   |d         \  }}| j                  |d   |d   |d         }| j                  |d   |d   |d         \  }} |j                  d	i |d|i ||z   || j                  z  z   }||fS )
Nr)   r*   r+   rE   rL   ri   rj   rC   r   )rB   rC   rf   r^   rg   )	r
   r/   r0   rB   r_   rC   rf   rk   r#   s	            r   r1   zL1LeakyDiceLoss.forward  s    !^^DNE$KvW	7&&tO'<eDk5QW=Y!\\NE,/}1EG<<<;&4==)@@W}r   )r4   r~   rm   r5   r7   s   @r   r   r      s    !r   r   )r   rT   torch.nnrQ   r   rr   r   r9   r@   rH   ra   ro   rt   r   r   r   r   r   <module>r      s    
  d d<*ryy * *RYY * Hryy H6&ryy &R ,!Z !bii Dbii Bbii r   