
    |-jY<                         d dl Zd dlZd dlmZ d dlmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZmZmZ  e
            rd dlmZ  e	            rd dlmZ  G d d	e          Z G d
 dej                  Z	 	 	 	 ddZdS )    N   )is_scipy_availableis_vision_available   )HungarianMatcher_set_aux_lossbox_iou	dice_lossgeneralized_box_iounested_tensor_from_tensor_listsigmoid_focal_loss)center_to_corners_formatlinear_sum_assignmentc                   >    e Zd Z ej                    d             ZdS )LwDetrHungarianMatcherc                 "   |d         j         dd         \  }}|d                             dd                                          }|d                             dd          }t          j        d |D                       }t          j        d |D                       }	d	}
d
}d|
z
  ||z  z  d|z
  dz                                    z  }|
d|z
  |z  z  |dz                                    z  }|dd|f         |dd|f         z
  }|j        }|                    t          j                  }|	                    t          j                  }	t          j	        ||	d          }|                    |          }t          t          |          t          |	                     }| j        |z  | j        |z  z   | j        |z  z   }|                    ||d                                          }d |D             }g }||z  |                    d          }t%          |          D ]]|         }d t'          |                    |d                    D             }dk    r|}@fdt)          ||          D             }^d |D             S )z
        Differences:
        - out_prob = outputs["logits"].flatten(0, 1).sigmoid() instead of softmax
        - class_cost uses alpha and gamma
        logitsNr   r   r   
pred_boxesc                     g | ]
}|d          S class_labels .0vs     ^/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/transformers/loss/loss_lw_detr.py
<listcomp>z2LwDetrHungarianMatcher.forward.<locals>.<listcomp>6   s    CCCa. 1CCC    c                     g | ]
}|d          S boxesr   r   s     r   r   z2LwDetrHungarianMatcher.forward.<locals>.<listcomp>7   s     = = =7 = = =r   g      ?g       @g:0yE>)pc                 8    g | ]}t          |d                    S r!   lenr   s     r   r   z2LwDetrHungarianMatcher.forward.<locals>.<listcomp>N   s"    222QQwZ222r   dimc                 >    g | ]\  }}t          ||                   S r   r   )r   ics      r   r   z2LwDetrHungarianMatcher.forward.<locals>.<listcomp>T   s)    sssTQ21Q488sssr   c                     g | ]O\  }}t          j        |d          |d          z  z   g          t          j        |d         |d         g          fPS )r   r   )npconcatenate)r   indice1indice2group_idgroup_num_queriess      r   r   z2LwDetrHungarianMatcher.forward.<locals>.<listcomp>X   sq       
 ) 
GAJARU]A]4]'^__
GAJ'?@@  r   c                     g | ]E\  }}t          j        |t           j                   t          j        |t           j                   fFS ))dtype)torch	as_tensorint64)r   r+   js      r   r   z2LwDetrHungarianMatcher.forward.<locals>.<listcomp>_   sH    ssscgcdfg%+666QVQ\8]8]8]^sssr   )shapeflattensigmoidr6   catlogr5   tofloat32cdistr   r   	bbox_cost
class_cost	giou_costviewcpusplitrange	enumeratezip)selfoutputstargets
group_detr
batch_sizenum_queriesout_probout_bbox
target_idstarget_bboxalphagammaneg_cost_classpos_cost_classrC   r5   rB   rD   cost_matrixsizesindicescost_matrix_listgroup_cost_matrixgroup_indicesr2   r3   s                           @@r   forwardzLwDetrHungarianMatcher.forward(   s    #*("3"9"1""=
K 8$,,Q22::<<<(00A66 YCC7CCCDD
i = =W = = =>> e)%8a(lT>Q=V=V=X=X<XY1x<E"9:4?T?T?V?V>VW#AAAzM2^AAAzM5RR
 ;;u}--!nnU]33K+;;;	LL''	 ))A()K)KMefqMrMrsss	 ny04?Z3OORVR`clRll!&&z;CCGGII22'222':5&,,->A,FFj)) 	 	H 0 :ssYO`OfOfglnpOqOqErErsssM1}}'    
 -0,G,G   tskrssssr   N)__name__
__module____qualname__r6   no_gradr_   r   r   r   r   r   '   s:        U]__6t 6t _6t 6t 6tr   r   c                   x     e Zd Z fdZd Z ej                    d             Zd Zd Z	d Z
d Zd Zd	 Z xZS )
LwDetrImageLossc                     t                                                       || _        || _        || _        || _        || _        d S N)super__init__matchernum_classesfocal_alphalossesrN   )rK   rj   rk   rl   rm   rN   	__class__s         r   ri   zLwDetrImageLoss.__init__c   sB    &&$r   c                    d|vrt          d          |d         }|j        }|                     |          }t          j        d t          ||          D                       }| j        }	d}
|d         |         }t          j        d t          ||          D             d          }t          j        t          t          |
                                          t          |                    d                   }|                    |          }|                                
                                }|                                }t          j        |          }|                    |
                              |          }||fz   }||                             |	          |                    d	|	z
            z  }t          j        |d
          
                                                    |          }|||<   d	|z
  ||<   | |                                z  |d	|z
                                  z  z
  }|                                |z  }d|i}|S )Nr   z#No logits were found in the outputsc                 6    g | ]\  }\  }}|d          |         S r   r   )r   t_Js       r   r   z/LwDetrImageLoss.loss_labels.<locals>.<listcomp>s   s*    %b%b%byq&1aa&7&:%b%b%br   r   r   c                 6    g | ]\  }\  }}|d          |         S r!   r   r   rq   rr   r+   s       r   r   z/LwDetrImageLoss.loss_labels.<locals>.<listcomp>w   (    !W!W!WIAv1!G*Q-!W!W!Wr   r   r(   r   g{Gz?loss_ce)KeyErrorr5   _get_source_permutation_idxr6   r=   rJ   rl   diagr	   r   detachr?   cloner<   
zeros_likepowclampr>   sum)rK   rL   rM   r[   	num_boxessource_logitsr5   idxtarget_classes_orU   rV   	src_boxestarget_boxesiou_targetspos_iousprobpos_weightsneg_weightspos_indpos_qualityrw   rm   s                         r   loss_labelszLwDetrImageLoss.loss_labelsl   s1   7""@AAA)#..w77 9%b%bCPWY`LaLa%b%b%bcc L)#.	y!W!WWgAVAV!W!W!W]^___j,Y-=-=-?-?@@BZ[gBhBhiijkl
 
 "nnU++$$&&--//$$&&&}55hhuoo((//)++7m''..a%i1H1HHk+t44;;==@@GG*G ;G,+kQXNN<L<L.LL++--)+W%r   c                 z   |d         }|j         }t          j        d |D             |          }|                                                    d          j        dk                        d          }t          j        	                    |
                                |
                                          }	d|	i}
|
S )z
        Compute the cardinality error, i.e. the absolute error in the number of predicted non-empty boxes.

        This is not really a loss, it is intended for logging purposes only. It doesn't propagate gradients.
        r   c                 8    g | ]}t          |d                    S r   r&   r   s     r   r   z4LwDetrImageLoss.loss_cardinality.<locals>.<listcomp>   s%    )R)R)RQ#a.?*@*@)R)R)Rr   )devicer$   g      ?r   cardinality_error)r   r6   r7   r<   maxvaluesr   nn
functionall1_lossfloat)rK   rL   rM   r[   r   r   r   target_lengths	card_predcard_errrm   s              r   loss_cardinalityz LwDetrImageLoss.loss_cardinality   s     ")R)R')R)R)R[abbb^^%%))"--4s:??BB	=(():):N<P<P<R<RSS%x0r   c           	         d|vrt          d          |                     |          }|d         |         }t          j        d t	          ||          D             d          }t
          j                            ||d          }i }	|                                |z  |	d<   d	t          j	        t          t          |          t          |                              z
  }
|
                                |z  |	d
<   |	S )a<  
        Compute the losses related to the bounding boxes, the L1 regression loss and the GIoU loss.

        Targets dicts must contain the key "boxes" containing a tensor of dim [nb_target_boxes, 4]. The target boxes
        are expected in format (center_x, center_y, w, h), normalized by the image size.
        r   z#No predicted boxes found in outputsc                 6    g | ]\  }\  }}|d          |         S r!   r   ru   s       r   r   z.LwDetrImageLoss.loss_boxes.<locals>.<listcomp>   rv   r   r   r(   none)	reduction	loss_bboxr   	loss_giou)rx   ry   r6   r=   rJ   r   r   r   r   rz   r   r   )rK   rL   rM   r[   r   r   source_boxesr   r   rm   r   s              r   
loss_boxeszLwDetrImageLoss.loss_boxes   s     w&&@AAA..w77|,S1y!W!WWgAVAV!W!W!W]^___M)),PV)WW	'mmoo	9{
 8 F FH`amHnHnoo
 
 
	 (mmoo	9{r   c                    d|vrt          d          |                     |          }|                     |          }|d         }||         }d |D             }t          |                                          \  }	}
|	                    |          }	|	|         }	t          j                            |dddf         |	j	        dd         dd          }|ddd	f         
                    d
          }|	
                    d
          }	|	                    |j	                  }	t          ||	|          t          ||	|          d}|S )z
        Compute the losses related to the masks: the focal loss and the dice loss.

        Targets dicts must contain the key "masks" containing a tensor of dim [nb_target_boxes, h, w].
        
pred_masksz#No predicted masks found in outputsc                     g | ]
}|d          S )masksr   r   rq   s     r   r   z.LwDetrImageLoss.loss_masks.<locals>.<listcomp>   s    ---7---r   NbilinearF)sizemodealign_cornersr   r   )	loss_mask	loss_dice)rx   ry   _get_target_permutation_idxr   	decomposer?   r   r   interpolater:   r;   rE   r   r
   )rK   rL   rM   r[   r   
source_idx
target_idxsource_masksr   target_masksvalidrm   s               r   
loss_maskszLwDetrImageLoss.loss_masks   sa    w&&@AAA55g>>
55g>>
|,#J/--W---<UCCMMOOe#|44#J/ }00D!(:233(?j`e 1 
 
 $AAAqD)11!44#++A..#(();<<+L,	RR"<yII
 
 r   c                     t          j        d t          |          D                       }t          j        d |D                       }||fS )Nc                 D    g | ]\  }\  }}t          j        ||          S r   r6   	full_like)r   r+   sourcerr   s       r   r   z?LwDetrImageLoss._get_source_permutation_idx.<locals>.<listcomp>   s,    cccna&!uvq99cccr   c                     g | ]\  }}|S r   r   )r   r   rr   s      r   r   z?LwDetrImageLoss._get_source_permutation_idx.<locals>.<listcomp>   s    BBB;FABBBr   r6   r=   rI   )rK   r[   	batch_idxr   s       r   ry   z+LwDetrImageLoss._get_source_permutation_idx   S    IccPYZaPbPbcccdd	YBB'BBBCC
*$$r   c                     t          j        d t          |          D                       }t          j        d |D                       }||fS )Nc                 D    g | ]\  }\  }}t          j        ||          S r   r   )r   r+   rr   targets       r   r   z?LwDetrImageLoss._get_target_permutation_idx.<locals>.<listcomp>   s,    cccna!Vuvq99cccr   c                     g | ]\  }}|S r   r   )r   rr   r   s      r   r   z?LwDetrImageLoss._get_target_permutation_idx.<locals>.<listcomp>   s    BBB;AvBBBr   r   )rK   r[   r   r   s       r   r   z+LwDetrImageLoss._get_target_permutation_idx   r   r   c                     | j         | j        | j        | j        d}||vrt	          d| d           ||         ||||          S )N)labelscardinalityr"   r   zLoss z not supported)r   r   r   r   
ValueError)rK   lossrL   rM   r[   r   loss_maps          r   get_losszLwDetrImageLoss.get_loss   se    &0__	
 
 x9T999:::x~gwCCCr   c           
         | j         r| j        nd}d |                                D             }|                     |||          }t	          d |D                       }||z  }t          j        |gt
          j        t          t          |
                                                    j                  }d}t          j                    rKt          j                    r8t          j        |t          j        j                   t          j                    }t          j        ||z  d                                          }i }| j        D ].}	|                    |                     |	||||                     /d|v rt1          |d                   D ]{\  }
|                     |
||          }| j        D ]W}	|	dk    r	|                     |	|
|||          }fd	|                                D             }|                    |           X|d
|v rv|d
         }|                     |||          }| j        D ]N}	|                     |	||||          }d |                                D             }|                    |           O|S )a  
        This performs the loss computation.

        Args:
             outputs (`dict`, *optional*):
                Dictionary of tensors, see the output specification of the model for the format.
             targets (`list[dict]`, *optional*):
                List of dicts, such that `len(targets) == batch_size`. The expected keys in each dict depends on the
                losses applied, see each loss' doc.
        r   c                 2    i | ]\  }}|d k    |dk    ||S )enc_outputsauxiliary_outputsr   r   kr   s      r   
<dictcomp>z+LwDetrImageLoss.forward.<locals>.<dictcomp>   s:     '
 '
 '
Q]0B0BqL_G_G_AqG_G_G_r   c              3   @   K   | ]}t          |d                    V  dS )r   Nr&   r   s     r   	<genexpr>z*LwDetrImageLoss.forward.<locals>.<genexpr>  s/      @@1An-..@@@@@@r   )r5   r   )op)minr   r   c                 (    i | ]\  }}|d  z   |S rr   r   r   r   r   r+   s      r   r   z+LwDetrImageLoss.forward.<locals>.<dictcomp>  s)    HHHAa'a''k1HHHr   r   )rN   c                      i | ]\  }}|d z   |S _encr   r   s      r   r   z+LwDetrImageLoss.forward.<locals>.<dictcomp>'  s"    CCCDAq!f*aCCCr   )trainingrN   itemsrj   r   r6   r7   r   nextiterr   r   distis_availableis_initialized
all_reduceReduceOpSUMget_world_sizer   itemrm   updater   rI   )rK   rL   rM   rN   outputs_without_aux_and_encr[   r   
world_sizerm   r   r   l_dictr   r+   s                @r   r_   zLwDetrImageLoss.forward   s    )-<T__1
'
 '
$]]__'
 '
 '
#
 ,,:GZPP @@@@@@@	
*	OYKu{4PTU\UcUcUeUePfPfKgKgKnooo	
 	/4#6#8#8 	/OI$-*;<<<<,..JK	J 6A>>>CCEE	 K 	U 	UDMM$--gwSSTTTT '))(1':M2N(O(O * *$$,,'8':NN K * *Dw !]]41BGWV_``FHHHHHHHFMM&))))* G##!-0Kll;JlOOG & &t['7IVVCCFLLNNCCCf%%%%r   )r`   ra   rb   ri   r   r6   rc   r   r   r   ry   r   r   r_   __classcell__)rn   s   @r   re   re   b   s        % % % % %" " "H U]__  _   2  D% % %% % %	D 	D 	D6 6 6 6 6 6 6r   re   c	                    t          |j        |j        |j                  }
g d}t	          |
|j        |j        ||j                  }|                    |           i }d }| |d<   ||d<   ||d|d<   |j	        rt          ||          }||d<    |||          |j        |j        d	|j        d
<   |j	        rdi }t          |j        dz
            D ]5|                    fd                                D                        6                    |           d                                 D             }                    |           t%          fdD                       }||fS )N)rC   rB   rD   )r   r"   r   )rj   rk   rl   rm   rN   r   r   )r   r   r   r   )rw   r   r   r   c                 (    i | ]\  }}|d  z   |S r   r   r   s      r   r   z0LwDetrForObjectDetectionLoss.<locals>.<dictcomp>Z  s)    #S#S#Stq!AAK#S#S#Sr   c                      i | ]\  }}|d z   |S r   r   r   s      r   r   z0LwDetrForObjectDetectionLoss.<locals>.<dictcomp>\  s"    EEEAq6z1EEEr   c              3   B   K   | ]}|v |         |         z  V  d S rg   r   )r   r   	loss_dictweight_dicts     r   r   z/LwDetrForObjectDetectionLoss.<locals>.<genexpr>^  s:      TT1CSCSy|k!n,CSCSCSCSTTr   )r   rC   rB   rD   re   
num_labelsrl   rN   r?   auxiliary_lossr   class_loss_coefficientbbox_loss_coefficientgiou_loss_coefficientrH   decoder_layersr   r   r   )r   r   r   r   configoutputs_classoutputs_coordenc_outputs_classenc_outputs_coordkwargsrj   rm   	criterionoutputs_lossr   aux_weight_dictenc_weight_dictr   r+   r   r   s                     @@@r   LwDetrForObjectDetectionLossr  -  s    %$0@FL\  G 0//F%&$  I LLL#L!+L#'# #L  >)-GG,=()	,//I$;&JfggK%;K ,v,q011 	U 	UA""#S#S#S#S{?P?P?R?R#S#S#STTTT?+++EE1B1B1D1DEEEO'''TTTTTiTTTTTD---r   )NNNN)numpyr.   r6   torch.distributeddistributedr   torch.nnr   utilsr   r   loss_for_object_detectionr   r   r	   r
   r   r   r   transformers.image_transformsr   scipy.optimizer   r   Modulere   r  r   r   r   <module>r     s                          ; ; ; ; ; ; ; ;                   GFFFFFF  54444448t 8t 8t 8t 8t- 8t 8t 8tvH H H H Hbi H H Hb 2. 2. 2. 2. 2. 2.r   