Ë
    Gêñi¬/  ã                   ó�   — d dl Z d dlmc mZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ  e«       rd dlmZ  G d„ d	e«      Z	 	 	 	 	 	 	 dd
„Zy)é    Né   )Úis_vision_availableé   )Ú	DFineLossÚ_set_aux_lossÚ_set_aux_loss2)Úbox_iou)Úcenter_to_corners_formatc                   ó:   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zˆ fd„Zˆ xZS )Ú
Deimv2Lossc                 óø   •— t         ‰| �  |«       |j                  |j                  |j                  |j
                  |j                  dœ| _        g d¢| _        |j                  | _	        |j                  | _
        y )N)Úloss_malÚ	loss_bboxÚ	loss_giouÚloss_fglÚloss_ddf)ÚmalÚboxesÚlocal)ÚsuperÚ__init__Úweight_loss_malÚweight_loss_bboxÚweight_loss_giouÚweight_loss_fglÚweight_loss_ddfÚweight_dictÚlossesÚ	mal_alphaÚuse_dense_one_to_one)ÚselfÚconfigÚ	__class__s     €ú_/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/loss/loss_deimv2.pyr   zDeimv2Loss.__init__   sk   ø€ Ü‰Ñ˜Ô à×.Ñ.Ø×0Ñ0Ø×0Ñ0Ø×.Ñ.Ø×.Ñ.ñ
ˆÔò 0ˆŒØ×)Ñ)ˆŒØ$*×$?Ñ$?ˆÕ!ó    c           	      óN  — | j                  |«      }|d   |   }t        j                  t        ||«      D ���	cg c]  \  }\  }}	|d   |	   ‘Œ c}	}}d¬«      }
t	        t        |«      t        |
«      «      \  }}t        j                  |«      j                  «       }|d   }t        j                  t        ||«      D ���	cg c]  \  }\  }}	|d   |	   ‘Œ c}	}}«      }t        j                  |j                  dd | j                  t        j                  |j                  ¬	«      }|||<   t        j                  || j                  d
z   ¬«      ddd…f   }t        j                  ||j                   ¬«      }|j#                  |j                   «      ||<   |j%                  d«      |z  }t        j&                  |«      j                  «       }|j)                  | j*                  «      }| j,                  �2| j,                  |j)                  | j*                  «      z  d
|z
  z  |z   }n$|j)                  | j*                  «      d
|z
  z  |z   }t        j.                  |||d¬«      }|j1                  d
«      j3                  «       |j                  d
   z  |z  }d|iS c c}	}}w c c}	}}w )z²Compute the Matching Aware Loss (MAL), which uses IoU-weighted soft labels
        instead of hard one-hot targets, with focal-style weighting controlled by `mal_alpha`.
        Ú
pred_boxesr   r   ©ÚdimÚlogitsÚclass_labelsNr   ©ÚdtypeÚdevicer   )Únum_classes.éÿÿÿÿ)r-   Únone)ÚweightÚ	reductionr   )Ú_get_source_permutation_idxÚtorchÚcatÚzipr	   r
   ÚdiagÚdetachÚfullÚshaper/   Úint64r.   ÚFÚone_hotÚ
zeros_liker-   ÚtoÚ	unsqueezeÚsigmoidÚpowÚgammar   Ú binary_cross_entropy_with_logitsÚmeanÚsum)r!   ÚoutputsÚtargetsÚindicesÚ	num_boxesÚidxÚ	src_boxesÚtÚ_ÚiÚtarget_boxesÚiousÚ
src_logitsÚtarget_classes_originalÚtarget_classesÚtargetÚtarget_score_originalÚtarget_scoreÚ
pred_scorer2   Úlosss                        r$   Úloss_labels_malzDeimv2Loss.loss_labels_mal*   s]  € ð ×.Ñ.¨wÓ7ˆà˜LÑ)¨#Ñ.ˆ	Ü—y‘yÄÀWÈgÓAV×!WÐ!W±I°A±v¸¸1 ! G¡*¨Q£-Ô!WÐ]^Ô_ˆÜÔ2°9Ó=Ô?WÐXdÓ?eÓf‰ˆˆaÜ�z‰z˜$Ó×&Ñ&Ó(ˆà˜XÑ&ˆ
Ü"'§)¡)ÔSVÐW^Ð`gÓSh×,iÐ,iÁiÀaÉÈ!ÈQ¨Q¨~Ñ->¸qÓ-AÔ,iÓ"jÐÜŸ™Ø×Ñ˜R˜aÐ  $×"2Ñ"2¼%¿+¹+Èj×N_ÑN_ô
ˆð 6ˆ�sÑÜ—‘˜>°t×7GÑ7GÈ!Ñ7KÔLÈSÐRUÐSUÐRUÈXÑVˆä %× 0Ñ 0°Àz×GWÑGWÔ XÐØ%)§W¡WÐ-B×-HÑ-HÓ%IÐ˜cÑ"Ø,×6Ñ6°rÓ:¸VÑCˆä—Y‘Y˜zÓ*×1Ñ1Ó3ˆ
Ø#×'Ñ'¨¯
©
Ó3ˆØ�>‰>Ð%Ø—^‘^ j§n¡n°T·Z±ZÓ&@Ñ@ÀAÈÁJÑOÐRXÑX‰Fà—^‘^ D§J¡JÓ/°1°v±:Ñ>ÀÑGˆFä×1Ñ1°*¸lÐSYÐekÔlˆØ�y‰y˜‹|×ÑÓ! J×$4Ñ$4°QÑ$7Ñ7¸)ÑCˆØ˜DÐ!Ð!ùô3 "Xùô
 -js   ¹JÃJ c                 ó²  — g }|D ]t  }t        |j                  «       |j                  «       «      D ��cg c]?  \  }}t        j                  |d   |d   g«      t        j                  |d   |d   g«      f‘ŒA }}}Œv |D �cg c].  }t        j                  |d   d d …d f   |d   d d …d f   gd«      ‘Œ0 c}D �]  }t        j                  |dd¬«      \  }	}
t        j
                  |
d¬«      }|	|   }i }|D ]2  }|d   j                  «       |d   j                  «       }}||vsŒ.|||<   Œ4 t        j                  t        |j                  «       «      |j                  ¬«      }t        j                  t        |j                  «       «      |j                  ¬«      }|j                  |j                  «       |j                  «       f«       �Œ |S c c}}w c c}w )Nr   r   T)Úreturn_countsr)   )Ú
descending)r.   )r7   Úcopyr5   r6   ÚuniqueÚargsortÚitemÚtensorÚlistÚkeysr.   ÚvaluesÚappendÚlong)r!   rJ   Úindices_aux_listÚresultsÚindices_auxÚidx1Úidx2rL   Úindexr`   ÚcountsÚcount_sort_indicesÚunique_sortedÚcolumn_to_rowÚidx_pairÚrow_idxÚcol_idxÚ
final_rowsÚ
final_colss                      r$   Ú_get_dense_o2o_indicesz!Deimv2Loss._get_dense_o2o_indicesL   sº  € ØˆØ+ò 	ˆKô #& g§l¡l£n°k×6FÑ6FÓ6HÓ"I÷á�D˜$ô —‘˜D ™G T¨!¡WÐ-Ó.´·	±	¸4À¹7ÀDÈÁGÐ:LÓ0MÒNðˆGò ð	ð SZÖZÈ3”e—i‘i  Q¡ª¨4¨¡°#°a±&º¸D¸±/Ð BÀAÕFÒZó 	CˆEÜ"Ÿ\™\¨%¸tÈÔK‰NˆF�FÜ!&§¡¨vÀ$Ô!GÐØ"Ð#5Ñ6ˆMØˆMØ)ò 5�Ø#+¨A¡;×#3Ñ#3Ó#5°xÀ±{×7GÑ7GÓ7I˜�Ø -Ò/Ø-4�M 'Ò*ð5ô Ÿ™¤d¨=×+=Ñ+=Ó+?Ó&@ÈÏÉÔVˆJÜŸ™¤d¨=×+?Ñ+?Ó+AÓ&BÈ5Ï<É<ÔXˆJØ�N‰N˜JŸO™OÓ-¨z¯©Ó/@ÐAÖBð	Cð ˆùó#ùò
 [s   ³AGÂ 3Gc                 óÎ   — | j                   | j                  | j                  | j                  | j                  | j
                  dœ}||vrt        d|› d�«      ‚ ||   ||||«      S )N)Úcardinalityr   r   ÚfocalÚvflr   zLoss z not supported)Úloss_cardinalityÚ
loss_localÚ
loss_boxesÚloss_labels_focalÚloss_labels_vflr[   Ú
ValueError)r!   rZ   rH   rI   rJ   rK   Úloss_maps          r$   Úget_losszDeimv2Loss.get_lossb   sp   € à×0Ñ0Ø—_‘_Ø—_‘_Ø×+Ñ+Ø×'Ñ'Ø×'Ñ'ñ
ˆð �xÑÜ˜u T F¨.Ð9Ó:Ð:Øˆx˜‰~˜g w°¸ÓCÐCr%   c           
      óð  •— | j                   st        ‰| �	  ||«      S |j                  «       D ��ci c]  \  }}d|vsŒ||“Œ }}}| j	                  ||«      }t        d„ |D «       «      }t        j                  |gt        j                  t        t        |j                  «       «      «      j                  ¬«      }t        j                  |d¬«      j                  «       }g }g }	d|v r>|d   D ]6  }
| j	                  |
|«      }|j                  |«       |	j                  |«       Œ8 | j!                  ||	«      }t        d„ |D «       «      }t        j                  |gt        j                  t        t        |j                  «       «      «      j                  ¬«      }t        j                  |d¬«      j                  «       }i }| j"                  D ]j  }|dv }|r|n|}|r|n|}| j%                  |||||«      }|D �ci c]'  }|| j&                  v sŒ|||   | j&                  |   z  “Œ) }}|j)                  |«       Œl d|v r»t+        |d   «      D ]ª  \  }}
| j"                  D ]–  }|dv }|r|n||   }|r|n|}| j%                  ||
|||«      }|D �ci c]'  }|| j&                  v sŒ|||   | j&                  |   z  “Œ) }}|j                  «       D ��ci c]  \  }}|d|› �z   |“Œ }}}|j)                  |«       Œ˜ Œ¬ d	|v r×d
|vrt-        d«      ‚| j/                  |d
   |«      }||d
   d   z  }t+        |d	   «      D ]—  \  }}
| j"                  D ]ƒ  }| j%                  ||
|||«      }|D �ci c]'  }|| j&                  v sŒ|||   | j&                  |   z  “Œ) }}|j                  «       D ��ci c]  \  }}|d|› �z   |“Œ }}}|j)                  |«       Œ… Œ™ |S c c}}w c c}w c c}w c c}}w c c}w c c}}w )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.
        Úauxiliary_outputsc              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)r+   N©Úlen)Ú.0rN   s     r$   ú	<genexpr>z%Deimv2Loss.forward.<locals>.<genexpr>‚   s   è ø€ Ò@°1œ˜A˜nÑ-×.Ñ@ùó   ‚r,   r   )Úminc              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)r   Nrˆ   )rŠ   Úxs     r$   r‹   z%Deimv2Loss.forward.<locals>.<genexpr>‘   s   è ø€ Ò9¨œ3˜q ™tŸ9Ñ9ùrŒ   )r   r   Ú_aux_Údn_auxiliary_outputsÚdenoising_meta_valuesz}The output must have the 'denoising_meta_values` key. Please, ensure that 'outputs' includes a 'denoising_meta_values' entry.Údn_num_groupÚ_dn_)r    r   ÚforwardÚitemsÚmatcherrG   r5   Ú	as_tensorÚfloatÚnextÚiterrf   r.   Úclamprb   rg   rx   r   r„   r   ÚupdateÚ	enumerater‚   Úget_cdn_matched_indices)r!   rH   rI   ÚkÚvÚoutputs_without_auxrJ   rK   Úcached_indicesri   r†   Úaux_indicesÚ
indices_goÚnum_boxes_gor   rZ   Ú	use_unionÚ
indices_inÚnum_boxes_inÚl_dictrP   Ú
dn_indicesÚdn_num_boxesr#   s                          €r$   r•   zDeimv2Loss.forwardo   s;  ø€ ð ×(Ò(Ü‘7‘? 7¨GÓ4Ð4ð 18·±³×`©¨¨1ÐCVÐ^_ÒC_˜q !™tÐ`ÐÑ`Ø—,‘,Ð2°GÓ<ˆô Ñ@¸Ô@Ó@ˆ	Ü—O‘O Y K´u·{±{Ì4ÔPTÐU\×UcÑUcÓUeÓPfÓKg×KnÑKnÔoˆ	Ü—K‘K 	¨qÔ1×6Ñ6Ó8ˆ	ð ˆØÐØ 'Ñ)Ø%,Ð-@Ñ%Aò 5Ð!Ø"Ÿl™lÐ+<¸gÓF�Ø×%Ñ% kÔ2Ø ×'Ñ'¨Õ4ð5ð ×0Ñ0°Ð:JÓKˆ
ÜÑ9¨jÔ9Ó9ˆÜ—‘¨ ~¼U¿[¹[ÔQUÔVZÐ[b×[iÑ[iÓ[kÓVlÓQm×QtÑQtÔuˆÜ—{‘{ <°QÔ7×<Ñ<Ó>ˆð ˆØ—K‘Kò 	"ˆDØÐ 2Ð2ˆIÙ'0™°gˆJÙ+4™<¸)ˆLØ—]‘] 4¨°'¸:À|ÓTˆFØBHÖb¸QÈAÐQU×QaÑQaÒLa�a˜ ™ T×%5Ñ%5°aÑ%8Ñ8Ñ8ÐbˆFÐbØ�M‰M˜&Õ!ð	"ð  'Ñ)Ü(1°'Ð:MÑ2NÓ(Oò *Ñ$�Ð$Ø ŸK™Kò *�DØ $Ð(:Ð :�IÙ/8¡¸nÈQÑ>O�JÙ3<¡<À)�LØ!Ÿ]™]¨4Ð1BÀGÈZÐYeÓf�FØJPÖjÀQÐTUÐY]×YiÑYiÒTi˜a ¨¡¨T×-=Ñ-=¸aÑ-@Ñ!@Ñ@Ðj�FÐjØ=C¿\¹\»^×L±T°Q¸˜a E¨!¨ +™o¨qÑ0ÐL�FÑLØ—M‘M &Õ)ñ*ð*ð " WÑ,Ø&¨gÑ5Ü ð^óð ð ×5Ñ5°gÐ>UÑ6VÐX_Ó`ˆJØ$ wÐ/FÑ'GÈÑ'WÑWˆLÜ(1°'Ð:PÑ2QÓ(Rò *Ñ$�Ð$Ø ŸK™Kò *�DØ!Ÿ]™]¨4Ð1BÀGÈZÐYeÓf�FØJPÖjÀQÐTUÐY]×YiÑYiÒTi˜a ¨¡¨T×-=Ñ-=¸aÑ-@Ñ!@Ñ@Ðj�FÐjØ<B¿L¹L»N×K±D°A°q˜a D¨¨ *™n¨aÑ/ÐK�FÑKØ—M‘M &Õ)ñ	*ð*ð ˆùó{ aùò< cùò kùÛLùò kùÛKs:   ±O¾OÇ:OÈOÊO"Ê"O"ËO'
Í)O-Í=O-Î*O2
)	Ú__name__Ú
__module__Ú__qualname__r   r[   rx   r„   r•   Ú__classcell__)r#   s   @r$   r   r      s&   ø„ ô@ò "òDò,D÷Lð Lr%   r   c           
      ó  — t        |«      }|j                  |«       | |j                  dd¬«      dœ}d }|j                  �r|	�át	        j
                  |j                  dd¬«      |	d   d¬«      \  }}t	        j
                  ||	d   d¬«      \  }}t	        j
                  | |	d   d¬«      \  }}t	        j
                  ||	d   d¬«      \  }}t	        j
                  |
|	d   d¬«      \  }}t	        j
                  ||	d   d¬«      \  }}||d<   |j                  dd¬«      |d	<   n|j                  dd¬«      }|}|
}|}t        |d d …d d
…f   j                  dd«      |d d …d d
…f   j                  dd«      |d d …d d
…f   j                  dd«      |d d …d d
…f   j                  dd«      |d d …d
f   |d d …d
f   «      }||d<   |d   j                  t        |g|j                  dd¬«      g«      «       |	�ht        j                  dd«      j                  dd«      j                  dd«      j                  dd«      |d d …d
f   |d d …d
f   «      }||d<   |	|d<    |||«      }t        |j                  «       «      }|||fS )Nr   r   )r�   Úmax)r*   r'   Údn_num_splitr   r(   r*   r'   r0   r†   r‘   r’   )r   r@   rœ   Úauxiliary_lossr5   Úsplitr   Ú	transposeÚextendr   rG   rf   )r*   Úlabelsr.   r'   r"   Úoutputs_classÚoutputs_coordÚenc_topk_logitsÚenc_topk_bboxesr’   Úpredicted_cornersÚinitial_reference_pointsÚkwargsÚ	criterionÚoutputs_lossr†   Údn_out_coordÚnormal_out_coordÚdn_out_classÚnormal_out_classrO   Únormal_logitsÚnormal_pred_boxesÚdn_out_cornersÚout_cornersÚdn_out_refsÚout_refsr‘   Ú	loss_dictrZ   s                                 r$   ÚDeimv2ForObjectDetectionLossrÍ   ¾   sñ  € ô ˜6Ó"€IØ‡L�L�Ôà$°J×4DÑ4DÈÐPQÐ4DÓ4RÑS€LØÐà×ÓØ Ð,Ü-2¯[©[Ø×#Ñ#¨¨qÐ#Ó1Ð3HÈÑ3XÐ^_ô.Ñ*ˆLÐ*ô .3¯[©[¸ÐH]Ð^lÑHmÐstÔ-uÑ*ˆLÐ*ô  %Ÿ{™{¨6Ð3HÈÑ3XÐ^_Ô`ÑˆAˆ}Ü#(§;¡;¨zÐ;PÐQ_Ñ;`ÐfgÔ#hÑ ˆAÐ Ü*/¯+©+Ð6GÐI^Ð_mÑInÐtuÔ*vÑ'ˆN˜KÜ$)§K¡KÐ0HÐJ_Ð`nÑJoÐuvÔ$wÑ!ˆK˜à%2ˆL˜Ñ"Ø):×)@Ñ)@ÀQÈAÐ)@Ó)NˆL˜Ò&à,×2Ñ2°q¸aÐ2Ó@ÐØ,ÐØ+ˆKØ/ˆHä*ØšQ   ˜VÑ$×.Ñ.¨q°!Ó4ØšQ   ˜VÑ$×.Ñ.¨q°!Ó4Øš˜3˜B˜3˜Ñ×)Ñ)¨!¨QÓ/Ø’Q˜˜˜�VÑ×&Ñ& q¨!Ó,Øš˜2˜ÑØšQ ˜UÑ#ó
Ðð ->ˆÐ(Ñ)ØÐ(Ñ)×0Ñ0Ü˜?Ð+¨o×.CÑ.CÈÈqÐ.CÓ.QÐ-RÓSô	
ð !Ð,Ü#1Ø×&Ñ& q¨!Ó,Ø×&Ñ& q¨!Ó,Ø×(Ñ(¨¨AÓ.Ø×%Ñ% a¨Ó+Øšq "˜uÑ%ØšQ ˜UÑ#ó$Ð ð 4HˆLÐ/Ñ0Ø4IˆLÐ0Ñ1á˜,¨Ó/€Iäˆy×ÑÓ!Ó"€DØ�Ð-Ð-Ð-r%   )NNNNNNN)r5   Útorch.nn.functionalÚnnÚ
functionalr=   Úutilsr   Úloss_d_finer   r   r   Úloss_for_object_detectionr	   Útransformers.image_transformsr
   r   rÍ   © r%   r$   ú<module>rÖ      sS   ðó  ß Ð å 'ß AÑ AÝ .ñ ÔÝFô_�ô _ðP ØØØØØØ!ôG.r%   