Ë
    ëÓ^j÷®  ã                   ó*  — d Z ddlZddlZddlmZmZmZ ddlZddlmZ erddl	m
Z
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZ dd
lmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z*  e'«       Z+dejX                  de-dejX                  fd„Z.dej^                  de-dej^                  fd„Z0dejb                  ddfd„Z2 G d„ dejb                  «      Z3d%d„Z4d%d„Z5defddd ed!   d"ede3fd#„Z6efddd d!d"ede7ee#f   fd$„Z8y)&z$LW-DETR model and criterion classes.é    N)ÚTYPE_CHECKINGÚCallableÚOptional)Únn)ÚModelConfigÚTrainConfig)ÚMODEL_DEFAULTSÚModelDefaults)ÚBuilderArgs)Úbuild_backbone)ÚSetCriterionÚ	dice_lossÚdice_loss_jitÚposition_supervised_lossÚsigmoid_ce_lossÚsigmoid_ce_loss_jitÚsigmoid_focal_lossÚsigmoid_varifocal_loss)ÚSegmentationHead)Úbuild_matcher)ÚMLP)ÚPostProcess)Úbuild_transformer)Ú
get_logger)ÚNestedTensorÚnested_tensor_from_tensor_listÚlinearÚnum_classesÚreturnc                 ó.  — | j                   j                  d   }t        t        j                  ||z  «      «      }| j                   j                  «       j                  |d«      d| }| j                  �,| j                  j                  «       j                  |«      d| nd}t        j                  | j                  ||du¬«      }t        j                  «       5  |j                   j                  |«       |�'|j                  �|j                  j                  |«       ddd«       | j                   j                  |j                   _        | j                  �1|j                  �%| j                  j                  |j                  _        |S # 1 sw Y   ŒmxY w)u¹  Return a new :class:`~torch.nn.Linear` resized to *num_classes* outputs.

    Tiles the existing weight rows when *num_classes* is larger than the current output size, or truncates them when
    smaller.  The returned module has ``out_features == num_classes`` so that ``nn.Linear`` metadata stays consistent
    with the actual weight shape â€” a requirement for correct ONNX export and ``torch.jit.trace`` serialisation.

    Args:
        linear: Source linear layer whose weights are used as the starting point.
        num_classes: Target number of output features.

    Returns:
        A new :class:`~torch.nn.Linear` with ``in_features`` unchanged and ``out_features == num_classes``.
    r   é   N)Úbias)ÚweightÚshapeÚintÚmathÚceilÚdetachÚrepeatr"   r   ÚLinearÚin_featuresÚtorchÚno_gradÚcopy_Úrequires_grad)r   r   ÚbaseÚnum_repeatsÚ
new_weightÚnew_biasÚ
new_linears          ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/models/lwdetr.pyÚ_resize_linearr6   8   s@  € ð �=‰=×Ñ˜qÑ!€DÜ”d—i‘i ¨dÑ 2Ó3Ó4€KØ—‘×%Ñ%Ó'×.Ñ.¨{¸AÓ>¸|ÀÐL€JØIOÏÉÐI`ˆv�{‰{×!Ñ!Ó#×*Ñ*¨;Ó7¸¸ÑEÐfj€HÜ—‘˜6×-Ñ-¨{ÀÐQUÐAUÔV€Jä	�‰‹ñ ,Ø×Ñ×Ñ 
Ô+ØÐ J§O¡OÐ$?Ø�O‰O×!Ñ! (Ô+÷,ð '-§m¡m×&AÑ&A€J×ÑÔ#Ø‡{�{Ð :§?¡?Ð#>Ø(.¯©×(AÑ(Aˆ
�‰Ô%ØÐ÷,ð ,ús   ÃAFÆFÚ	parameterÚnum_rowsc                 óª  — | j                   d   }||k(  r| S |dk(  r1| j                  «       j                  |g| j                   dd ¢­«      }nYt        t	        j
                  ||z  «      «      gdg| j                  «       dz
  z  ¢} | j                  «       j                  |Ž d| }t        j                  |j                  «       | j                  ¬«      S )zQReturn a parameter with the first dimension resized by tiling or truncating rows.r   r!   N)r/   )r$   r(   Ú	new_zerosr%   r&   r'   Údimr)   r   Ú	ParameterÚcloner/   )r7   r8   Úcurrent_rowsÚnew_dataÚrepeatss        r5   Ú_resize_parameter_rowsrA   V   sÅ   € à—?‘? 1Ñ%€LØ�xÒØÐà�qÒØ×#Ñ#Ó%×/Ñ/°Ð0P¸I¿O¹OÈAÈBÐ<OÑ0PÓQ‰ä”t—y‘y ¨LÑ!8Ó9Ó:Ð[¸q¸cÀYÇ]Á]Ã_ÐWXÑEXÑ>YÐ[ˆØ,�9×#Ñ#Ó%×,Ñ,¨gÐ6°y¸ÐAˆÜ�<‰<˜Ÿ™Ó(¸	×8OÑ8OÔPÐPó    Úmodulec                 ó|  — t        | dd«      }|�t        |«      dk(  ry|d   }t        |t        j                  «      r|j
                  dk  ryt        j                  «       5  |j                  dd j                  «        |j                  �|j                  dd j                  «        ddd«       y# 1 sw Y   yxY w)zFReset keypoint precision-Cholesky output rows to unit Gaussian values.ÚlayersNr   éÿÿÿÿé   é   é   )ÚgetattrÚlenÚ
isinstancer   r*   Úout_featuresr,   r-   r#   Úzero_r"   )rC   rE   Úfinal_layers      r5   Ú$_reset_keypoint_gaussian_output_rowsrP   d   s¦   € ä�V˜X tÓ,€FØ€~œ˜V›¨Ò)Øà˜‘*€KÜ�k¤2§9¡9Ô-°×1IÑ1IÈQÒ1NØä	�‰‹ñ *Ø×Ñ˜1˜QÐ×%Ñ%Ô'Ø×ÑÐ'Ø×Ñ˜Q˜qÐ!×'Ñ'Ô)÷*÷ *ñ *ús   Á"AB2Â2B;c                   ó¸  ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 d$dee   dz  defˆ fd„Zdeddfd„Zedee   de	j                  fd	„«       Zedee   de	j                  fd
„«       Zdee   fd„Zedeee	j                  f   dee   dz  fd„«       Zdee   dz  ddfd„Zd%d„Zd„ Zde	j                  dedede	j                  fd„Zde	j                  de	j                  fd„Zd&defd„Zd„ Ze	j2                  j4                  	 d&de	j                  de	j                  de	j                  dz  de	j                  dz  fd„«       Zdeej<                     fd„Zd e d!eddfd"„Z!d#„ Z"ˆ xZ#S )'ÚLWDETRz@This is the Group DETR v3 module that performs object detection.NÚnum_keypoints_per_classÚ grouppose_keypoint_dim_downscalec           	      óÒ	  •— t         ‰| �  «        || _        || _        |j                  }t        j                  ||«      | _        t        ||dd«      | _	        || _
        d}t        j                  ||z  |«      | _        t        j                  ||z  |«      | _        t
        j                  j                  | j                  j                   j"                  d«       || _        || _        || _        |	| _        | j*                  s&| j                  | j                  j,                  _	        nd| j                  j,                  _	        |
| _        || _        |xs g | _        || _        | j0                  r@t7        | j2                  «      |kD  r(t9        dt7        | j2                  «      › d|› d|› d�«      ‚d	| _        | j0                  rÄt        || j4                  z  || j4                  z  d
d«      | _        t
        j                  j                  | j<                  j>                  d   j                   j"                  d«       t
        j                  j                  | j<                  j>                  d   j@                  j"                  d«       nd| _        | jC                  d| jE                  | j2                  «      «       d}tG        jH                  d|z
  |z  «       }tK        jL                  |«      |z  | j                  j@                  _        t
        j                  j                  | j                  j>                  d   j                   j"                  d«       t
        j                  j                  | j                  j>                  d   j@                  j"                  d«       || _'        | jN                  �r t        jP                  tS        |«      D �cg c]!  }tU        jV                  | j                  «      ‘Œ# c}«      | j                  _,        t        jP                  tS        |«      D �cg c]!  }tU        jV                  | j                  «      ‘Œ# c}«      | j                  _-        | j0                  rd| j<                  �Xt        jP                  tS        |«      D �cg c]!  }tU        jV                  | j<                  «      ‘Œ# c}«      | j                  _.        d	| _/        yc c}w c c}w c c}w )aÂ  Initializes the model.

        Parameters:
            backbone: torch module of the backbone to be used. See backbone.py
            transformer: torch module of the transformer architecture. See transformer.py
            num_classes: number of object classes
            num_queries: number of object queries, ie detection slot. This is the maximal number of objects
                         Conditional DETR can detect in a single image. For COCO, we recommend 100 queries.
            aux_loss: True if auxiliary decoding losses (loss at each decoder layer) are to be used.
            group_detr: Number of groups to speed detr training. Default is 1.
            lite_refpoint_refine: TODO
        rH   é   r   Nznum_keypoints_per_class has z) entries but the detection head only has z= classes. Class-logit boosts for keypoint classes with id >= zV would be silently truncated. Increase num_classes or shorten num_keypoints_per_class.Fé   rF   Ú_kp_active_maskg{®Gáz„?r!   )0ÚsuperÚ__init__Únum_queriesÚtransformerÚd_modelr   r*   Úclass_embedr   Ú
bbox_embedÚsegmentation_headÚ	EmbeddingÚrefpoint_embedÚ
query_featÚinitÚ	constant_r#   ÚdataÚbackboneÚaux_lossÚ
group_detrÚlite_refpoint_refineÚdecoderÚbbox_reparamÚuse_grouppose_keypointsrS   rT   rK   Ú
ValueErrorÚ_kp_zero_pad_warnedÚkeypoint_embedrE   r"   Úregister_bufferÚ_create_kp_active_maskr&   Úlogr,   ÚonesÚ	two_stageÚ
ModuleListÚrangeÚcopyÚdeepcopyÚenc_out_bbox_embedÚenc_out_class_embedÚenc_out_keypoint_embedÚ_export)Úselfrg   r\   r`   r   r[   rh   ri   ru   rj   rl   rm   rS   rT   Ú
hidden_dimÚ	query_dimÚ
prior_probÚ
bias_valueÚ_Ú	__class__s                      €r5   rZ   zLWDETR.__init__w   sé  ø€ ô8 	‰ÑÔØ&ˆÔØ&ˆÔØ ×(Ñ(ˆ
ÜŸ9™9 Z°Ó=ˆÔÜ˜j¨*°a¸Ó;ˆŒØ!2ˆÔØˆ	Ü Ÿl™l¨;¸Ñ+CÀYÓOˆÔÜŸ,™, {°ZÑ'?ÀÓLˆŒÜ
�‰×Ñ˜$×-Ñ-×4Ñ4×9Ñ9¸1Ô=à ˆŒØ ˆŒØ$ˆŒð %9ˆÔ!Ø×(Ò(Ø26·/±/ˆD×Ñ×$Ñ$Õ/à26ˆD×Ñ×$Ñ$Ô/à(ˆÔð (?ˆÔ$Ø'>Ò'DÀ"ˆÔ$Ø0PˆÔ-Ø×'Ò'¬C°×0LÑ0LÓ,MÐP[Ò,[ÜØ.¬s°4×3OÑ3OÓ/PÐ.Qð RØ'˜=Ð(eÐfqÐerð shðhóð ð $)ˆÔ Ø×'Ò'Ü"%Ø˜d×CÑCÑCØ˜d×CÑCÑCØØó	#ˆDÔô �G‰G×Ñ˜d×1Ñ1×8Ñ8¸Ñ<×CÑC×HÑHÈ!ÔLÜ�G‰G×Ñ˜d×1Ñ1×8Ñ8¸Ñ<×AÑA×FÑFÈÕJà"&ˆDÔà×ÑÐ.°×0KÑ0KÈD×LhÑLhÓ0iÔjð ˆ
Ü—h‘h  J¡°*Ñ<Ó=Ð=ˆ
Ü%*§Z¡Z°Ó%<¸zÑ%Iˆ×Ñ×ÑÔ"ô 	�‰×Ñ˜$Ÿ/™/×0Ñ0°Ñ4×;Ñ;×@Ñ@À!ÔDÜ
�‰×Ñ˜$Ÿ/™/×0Ñ0°Ñ4×9Ñ9×>Ñ>ÀÔBð #ˆŒØ�>‹>Ü24·-±-Ü9>¸zÓ9JÖK°A”—‘˜tŸ™Õ/ÒKó3ˆD×ÑÔ/ô 46·=±=Ü:?À
Ó:KÖL°Q”—‘˜t×/Ñ/Õ0ÒLó4ˆD×ÑÔ0ð ×+Ò+°×0CÑ0CÐ0OÜ:<¿-¹-ÜAFÀzÓARÖS¸A”T—]‘] 4×#6Ñ#6Õ7ÒSó;�× Ñ Ô7ð ˆ�ùò Lùò Mùò Ts   Ï&SÐ&&SÒ&S$r   r   c           	      óþ   — t        | j                  |«      | _        | j                  rQt        j                  | j
                  j                  D �cg c]  }t        ||«      ‘Œ c}«      | j
                  _        yyc c}w )a¯  Resize the detection classification head to *num_classes* outputs.

        Replaces ``self.class_embed`` (and each ``enc_out_class_embed`` when the model uses two-stage detection) with a
        new :class:`torch.nn.Linear` whose ``out_features`` equals *num_classes*.  When *num_classes* is larger than the
        current head the existing weights are tiled; when smaller they are truncated.  Replacing the module (rather than
        mutating ``.data``) keeps ``nn.Linear.out_features`` consistent with the actual weight shape, which is required
        for correct ONNX export.

        Args:
            num_classes: Target number of output classes (including background).
        N)r6   r^   ru   r   rv   r\   r{   )r~   r   Úms      r5   Úreinitialize_detection_headz"LWDETR.reinitialize_detection_headà   s`   € ô *¨$×*:Ñ*:¸KÓHˆÔà�>Š>Ü35·=±=Ø9=×9IÑ9I×9]Ñ9]Ö^°A”  ;Õ/Ò^ó4ˆD×ÑÕ0ð ùâ^s   ÁA:c                 ó  — | s&t        j                  ddt         j                  ¬«      S t        | «      }t        j                  t	        | «      |t         j                  ¬«      }t        | «      D ]  \  }}d||d|…f<   Œ |S )zECreate a compact class-by-keypoint active mask for a keypoint schema.r   ©ÚdtypeTN)r,   ÚzerosÚboolÚmaxrK   Ú	enumerate)rS   Úmax_kpÚ	kp_activeÚ	class_idxÚnum_keypointss        r5   rr   zLWDETR._create_kp_active_maskó   sx   € ñ 'Ü—;‘;˜q !¬5¯:©:Ô6Ð6äÐ,Ó-ˆÜ—K‘K¤Ð$;Ó <¸fÌEÏJÉJÔWˆ	Ü(1Ð2IÓ(Jò 	8Ñ$ˆI�}Ø37ˆI�i  - Ð/Ò0ð	8àÐrB   c                 ó   — | s&t        j                  ddt         j                  ¬«      S t        | «      }t        j                  d|z   d|z   t         j                  ¬«      }t	        | «      D ]`  \  }}|dk(  rŒdt        | d| «      z   }||z   }t	        | «      D ]1  \  }}|dk(  s||k(  rŒdt        | d| «      z   }	|	|z   }
d|||…|	|
…f<   Œ3 Œb |S )zGCreate an attention mask that blocks cross-class keypoint interactions.r!   r‰   r   NT)r,   r‹   rŒ   ÚsumrŽ   )rS   Útotal_keypointsÚmaskÚclass_idx_iÚnum_keypoints_iÚstart_iÚend_iÚclass_idx_jÚnum_keypoints_jÚstart_jÚend_js              r5   Ú_create_keypoint_class_maskz"LWDETR._create_keypoint_class_maskÿ   sú   € ñ 'Ü—;‘;˜q !¬5¯:©:Ô6Ð6äÐ5Ó6ˆÜ�{‰{˜1˜Ñ.°°OÑ0CÌ5Ï:É:ÔVˆÜ,5Ð6MÓ,Nò 
	:Ñ(ˆK˜Ø !Ò#ØØœ#Ð5°l°{ÐCÓDÑDˆGØ˜oÑ-ˆEÜ09Ð:QÓ0Rò :Ñ,�˜_Ø" aÒ'¨;¸+Ò+EØØœcÐ"9¸,¸;Ð"GÓHÑH�Ø /Ñ1�Ø59��W˜U�] G¨E MÐ1Ò2ñ:ð
	:ð ˆrB   c                 óŽ   — | j                   j                  d¬«      j                  «       D �cg c]  }t        |«      ‘Œ c}S c c}w )zJReturn the current keypoint schema inferred from the active-keypoint mask.r!   ©r;   )rX   r”   Útolistr%   )r~   r’   s     r5   Úget_num_keypoints_per_classz"LWDETR.get_num_keypoints_per_class  s9   € à8<×8LÑ8L×8PÑ8PÐUVÐ8PÓ8W×8^Ñ8^Ó8`Öa }”�MÕ"ÒaÐaùÒas   ­AÚ
state_dictc                 óð   — | j                  d«      }t        |t        j                  «      r|j                  dk7  ry|j                  d¬«      j                  «       D �cg c]  }t        |«      ‘Œ c}S c c}w )z<Infer the keypoint schema stored in a checkpoint state dict.rX   é   Nr!   r¡   )ÚgetrL   r,   ÚTensorÚndimr”   r¢   r%   )r¤   Úactive_maskr’   s      r5   Ú+get_num_keypoints_per_class_from_checkpointz2LWDETR.get_num_keypoints_per_class_from_checkpoint  s^   € ð !—n‘nÐ%6Ó7ˆÜ˜+¤u§|¡|Ô4¸×8HÑ8HÈAÒ8MØØ8C¿¹ÈA¸Ó8N×8UÑ8UÓ8WÖX }”�MÕ"ÒXÐXùÒXs   ÁA3c                 óZ  — | j                   r|syt        |«      }t        |«      }|| _        | j	                  |«      j                  | j                  j                  «      | _        t        | j                  d«      r|| j                  _        t        | j                  dd«      }|�¯t        |d«      r||_        t        |dd«      }t        |t        j                  «      rt        ||«      |_        t        |d«      r|j!                  «        nGt        |d«      r;|j"                  }| j!                  |«      j                  |j                  «      |_        dD ]R  }t        | j                  |d«      }t        |dd«      }	t        |	t        j                  «      sŒBt        |	|«      |_        ŒT y)	zMResize schema-dependent GroupPose state to match ``num_keypoints_per_class``.NrS   rk   Úkeypoint_pos_embedrŸ   Úkeypoint_class_mask)Úkeypoint_query_initializerÚkeypoint_query_initializer_encÚqueries)rm   Úlistr”   rS   rr   ÚtorX   ÚdeviceÚhasattrr\   rJ   rL   r   r<   rA   r­   rŸ   r®   r±   )
r~   rS   Úschemar•   rk   r­   Úcurrent_maskÚinitializer_nameÚinitializerr±   s
             r5   Úreinitialize_keypoint_headz!LWDETR.reinitialize_keypoint_head   sw  € à×+Ò+Ñ3JØäÐ-Ó.ˆÜ˜f›+ˆØ'-ˆÔ$Ø#×:Ñ:¸6ÓB×EÑEÀd×FZÑFZ×FaÑFaÓbˆÔä�4×#Ñ#Ð%>Ô?Ø7=ˆD×ÑÔ4ä˜$×*Ñ*¨I°tÓ<ˆØÐÜ�wÐ 9Ô:Ø28�Ô/Ü!(¨Ð2FÈÓ!MÐÜÐ,¬b¯l©lÔ;Ü-CÐDVÐXgÓ-h�Ô*Ü�wÐ =Ô>Ø×3Ñ3Õ5Ü˜Ð"7Ô8Ø&×:Ñ:�Ø.2×.NÑ.NÈvÓ.V×.YÑ.YÐZf×ZmÑZmÓ.n�Ô+à `ò 	WÐÜ! $×"2Ñ"2Ð4DÀdÓKˆKÜ˜k¨9°dÓ;ˆGÜ˜'¤2§<¡<Õ0Ü&<¸WÀoÓ&V�Õ#ñ		WrB   c                 óè   — | j                   r| j                  €yt        | j                  «       t        | j                  dd«      }t        |t        j                  «      r|D ]  }t        |«       Œ yy)a¸  Reset keypoint Gaussian precision outputs to unit values.

        Keypoint channels 4, 5, and 6 encode the lower-triangular precision
        Cholesky parameters ``log_l11``, ``l21``, and ``log_l22``. Zeroing the
        final prediction rows gives ``L = identity`` at the start of finetuning
        while preserving learned keypoint location, visibility, findability, and
        class-logit channels loaded from the checkpoint.
        Nr|   )rm   rp   rP   rJ   r\   rL   r   rv   )r~   Úenc_keypoint_embedrp   s      r5   Ú"reset_keypoint_gaussian_parametersz)LWDETR.reset_keypoint_gaussian_parameters@  sm   € ð ×+Ò+¨t×/BÑ/BÐ/JØä,¨T×-@Ñ-@ÔAÜ$ T×%5Ñ%5Ð7OÐQUÓVÐÜÐ(¬"¯-©-Ô8Ø"4ò E�Ü4°^ÕDñEð 9rB   c                 ó*  — d| _         | j                  | _        | j                  | _        | j	                  «       D ]W  \  }}t        |d«      sŒt        |j                  t        «      sŒ.t        |d«      sŒ;|j                   rŒH|j                  «        ŒY y )NTÚexportr}   )	r}   ÚforwardÚ_forward_originÚforward_exportÚnamed_modulesrµ   rL   r¿   r   )r~   Únamer†   s      r5   r¿   zLWDETR.exportR  sr   € ØˆŒØ#Ÿ|™|ˆÔØ×*Ñ*ˆŒØ×)Ñ)Ó+ò 	‰GˆD�!Ü�q˜(Õ#¬
°1·8±8¼XÕ(FÌ7ÐSTÐV_ÕK`Ðij×irÓirØ—‘•
ñ	rB   Úkeypoints_compactÚbatch_size_expectedÚnum_queries_expectedc                 ó¸  — | j                   r| j                  s|S |j                  «       dk7  r|S |j                  \  }}}}||k7  s||k7  rt	        d|› d|› d|› d|› d�	«      ‚t        | j                  «      }t        | j                  «      |z  }	t        | j                  «      }
||	k(  r|S ||
k7  r"t	        d|› d|
› d|	› d	| j                  › d
�	«      ‚t        j                  |||	||j                  |j                  ¬«      }d}t        | j                  «      D ]>  \  }}||z  }t        |«      D ]&  }|dd…dd…|dd…f   |dd…dd…||z   dd…f<   |dz  }Œ( Œ@ |S )zDConvert compact GroupPose keypoints to class-padded keypoint layout.rH   z8_format_keypoint_output received tensor with batch_size=z, num_queries=z but expected batch_size=zW. Shape mismatch silently bypassed in earlier versions; raise to surface upstream bugs.zE_format_keypoint_output received tensor with total_compact_keypoints=z) but schema expects either compact total=z or padded total=z for num_keypoints_per_class=ú.©rŠ   r´   r   Nr!   )rm   rS   r;   r$   rn   r�   rK   r”   r,   r‹   rŠ   r´   rŽ   rw   )r~   rÅ   rÆ   rÇ   Ú
batch_sizer[   Útotal_compact_keypointsÚkeypoint_dimÚmax_num_keypointsÚtotal_padded_keypointsÚtotal_actual_keypointsÚpaddedÚcompact_idxr‘   Úkeypoint_countÚclass_offsetÚkeypoint_idxs                    r5   Ú_format_keypoint_outputzLWDETR._format_keypoint_outputZ  sÝ  € ð ×+Ò+°4×3OÒ3OØ$Ð$à× Ñ Ó" aÒ'Ø$Ð$àIZ×I`ÑI`ÑFˆ
�KÐ!8¸,ØÐ,Ò,°Ð?SÒ0SÜØJÈ:È,ÐVdÐepÐdqð r+Ø+>Ð*?¸~ÐNbÐMcð dhðhóð ô   × <Ñ <Ó=ÐÜ!$ T×%AÑ%AÓ!BÐEVÑ!VÐÜ!$ T×%AÑ%AÓ!BÐà"Ð&<Ò<à$Ð$Ø"Ð&<Ò<ÜØWÐXoÐWpð q;Ø;QÐ:Rð S#Ø#9Ð":Ð:WÐX\×XtÑXtÐWuÐuvðxóð ô —‘ØØØ"ØØ#×)Ñ)Ø$×+Ñ+ô
ˆð ˆÜ)2°4×3OÑ3OÓ)Pò 	!Ñ%ˆI�~Ø$Ð'8Ñ8ˆLÜ % nÓ 5ò !�Ø?PÒQRÒTUÐWbÒdeÐQeÑ?f�’qš!˜\¨LÑ8º!Ð;Ñ<Ø˜qÑ ‘ñ!ð	!ð
 ˆrB   Úkeypoint_predictionsc           	      ó°  — | j                   sRt        j                  g |j                  dd ¢| j                  j
                  ‘­|j                  |j                  ¬«      S t        | j                   «      }t        | j                   «      } |d   j                  g |j                  dd ¢|‘|‘­Ž }|| j                  j                  |j                  «      z  }|j                  d¬«      }| j                  j
                  }|dz
  }|j                  d   |k  r¥|j                  d   |k  rI| j                  s=t        j!                  d|j                  d   ||j                  d   |dz
  «       d	| _        t        j"                  | |j$                  g |j                  dd ¢||j                  d   z
  ‘­Ž gd¬«      }|S |j                  d   |kD  r	|d
d|…f   }|S )zIAggregate keypoint class-logit contributions into detection-class logits.NéþÿÿÿrÊ   ).rI   rF   r¡   r!   zòKeypoint class-logit boost has %d classes but detection head has %d foreground classes; zero-padding boost for classes %d..%d. Detection classes with no keypoint schema will receive zero boost. This warning is emitted once per model instance.T.)rS   r,   r‹   r$   r^   rM   rŠ   r´   rK   r�   ÚviewrX   r³   r”   ro   ÚloggerÚwarningÚcatr:   )r~   r×   Únum_keypoint_classesrÎ   Úclass_contribÚclass_boostÚdetection_num_classesÚforeground_num_classess           r5   Ú _aggregate_keypoint_class_logitsz'LWDETR._aggregate_keypoint_class_logits�  s  € à×+Ò+Ü—;‘;ØQÐ&×,Ñ,¨S¨bÐ1ÐQ°4×3CÑ3C×3PÑ3PÑQØ*×0Ñ0Ø+×2Ñ2ôð ô  # 4×#?Ñ#?Ó@ÐÜ × <Ñ <Ó=ÐØ9Ð,¨VÑ4×9Ñ9ð 
Ø!×'Ñ'¨¨Ð,ð
Ø.Bð
ØDUò
ˆð &¨×(<Ñ(<×(?Ñ(?À×@SÑ@SÓ(TÑTˆØ#×'Ñ'¨BÐ'Ó/ˆà $× 0Ñ 0× =Ñ =ÐØ!6¸Ñ!:ÐØ×Ñ˜RÑ Ð#8Ò8Ø× Ñ  Ñ$Ð'=Ò=ð
 ×/Ò/Ü—N‘Nðdð $×)Ñ)¨"Ñ-Ø.Ø#×)Ñ)¨"Ñ-Ø.°Ñ2ôð 04�DÔ,ÜŸ)™)àØ)�K×)Ñ)Ðq¨;×+<Ñ+<¸S¸bÐ+AÐqÐCXÐ[f×[lÑ[lÐmoÑ[pÑCpÒqðð ôˆKð Ðð ×Ñ˜rÑ"Ð%:Ò:ð & cÐ+AÐ,AÐ+AÐ&AÑBˆKØÐrB   Úsamplesc           	      ó  — t        |t        t        j                  f«      rt	        |«      }| j                  |«      \  }}}g }g }|D ];  }|j                  «       \  }	}
|j                  |	«       |j                  |
«       |
�Œ;J ‚ | j                  r-| j                  j                  }| j                  j                  }nF| j                  j                  d| j                   }| j                  j                  d| j                   }| j                  �8| j                  r| j                  j                  n| j                  j                  }d}|�-g }|D ]&  }|j                  «       \  }}|j                  |«       Œ( | j!                  ||||||¬«      }| j"                  r|\  }}}}}}}n|dd \  }}}}d}d}|��b| j$                  ri| j'                  |«      }|ddd…f   |ddd…f   z  |ddd…f   z   }|ddd…f   j)                  «       |ddd…f   z  }t        j*                  ||gd¬«      }n"| j'                  |«      |z   j-                  «       }| j/                  |«      }d}| j"                  �r| j0                  ��
|€t3        d«      ‚| j1                  |«      }|ddd…f   j5                  d	«      } |ddd…f   j5                  d	«      }!|ddd…f   | z  |!z   }"|ddd…f   }#t        j6                  |"|#gd¬«      }$g }%t9        |$j:                  d
   «      D ]C  }&|$|&   }'|%j                  | j=                  |'|'j:                  d
   |'j:                  d   «      «       ŒE t        j>                  |%d
¬«      }|| jA                  |«      z   }| j                  �. |d
   jB                  ||jB                  j:                  d	d «      }(|d   |d   dœ})| j                  �(d   |)d<   |�|d   |)d<   | jD                  r%| jG                  ||| j                  �(nd|«      |)d<   | jH                  �ra| j                  r| jJ                  nd}*|jM                  |*d¬«      }+g },t9        |*«      D ]5  }- | j                   jN                  |-   |+|-   «      }.|,j                  |.«       Œ7 t        j6                  |,d¬«      },d}/| j"                  rC|�A| j=                  ||j:                  d
   |j:                  d   «      }/|,| jA                  |/«      z   },| j                  �4 |d
   jB                  |g|jB                  j:                  d	d d¬«      d
   }0|�(|,|dœ)d<   | j                  �0|)d   d<   |/�|/|)d   d<   |)S |,|dœ})| j                  �0|)d<   |/�|/|)d<   )S )a8  The forward expects a NestedTensor, which consists of:

           - samples.tensor: batched images, of shape [batch_size x 3 x H x W]
           - samples.mask: a binary mask of shape [batch_size x H x W], containing 1 on padded pixels

        It returns a dict with the following elements:
           - "pred_logits": the classification logits (including no-object) for all queries.
                            Shape= [batch_size x num_queries x num_classes]
           - "pred_boxes": The normalized boxes coordinates for all queries, represented as
                           (center_x, center_y, width, height). These values are normalized in [0, 1], relative to the
                           size of each individual image (disregarding possible padding). See PostProcess for
                           information on how to retrieve the unnormalized bounding box.
           - "aux_outputs": Optional, only returned when auxiliary losses are activated. It is a list of
                            dictionaries containing the two above keys for each decoder layer.
        N©Úcross_attn_srcsrH   .r¦   rF   r¡   úKuse_grouppose_keypoints=True requires keypoint_hs from transformer outputs.rÙ   r   r!   )Úpred_logitsÚ
pred_boxesÚ
pred_masksÚpred_keypointsÚaux_outputsT©Úskip_blocksÚenc_outputs)(rL   r²   r,   r¨   r   rg   Ú	decomposeÚappendÚtrainingrb   r#   rc   r[   r`   Úsparse_forwardrÀ   r\   rm   rl   r_   ÚexpÚconcatÚsigmoidr^   rp   rn   Ú	unsqueezerÝ   rw   r$   rÖ   Ústackrã   Útensorsrh   Ú_set_aux_lossru   ri   Úchunkr{   )1r~   rä   ÚtargetsÚfeaturesÚpossÚcross_attn_featuresÚsrcsÚmasksÚfeatÚsrcr–   Úrefpoint_embed_weightÚquery_feat_weightÚseg_head_fwdrç   ÚfeatureÚ	cross_srcrƒ   Útransformer_outputsÚhsÚref_unsigmoidÚhs_encÚref_encÚkeypoint_hsÚenc_kp_predictionsÚoutputs_coord_deltaÚoutputs_coord_cxcyÚoutputs_coord_whÚoutputs_coordÚoutputs_classÚoutputs_keypointsÚoutputs_keypoints_deltaÚref_whÚref_xyÚkeypoints_xyÚkeypoints_otherÚoutputs_keypoints_compactÚlayer_outputs_keypointsÚ	layer_idxÚcompact_predsÚoutputs_masksÚoutri   Úhs_enc_listÚcls_encÚg_idxÚcls_enc_gidxÚkeypoints_encÚ	masks_encs1                                                    r5   rÀ   zLWDETR.forward¿  sL  € ô  �g¤¤e§l¡lÐ3Ô4Ü4°WÓ=ˆGØ.2¯m©m¸GÓ.DÑ+ˆ�$Ð+àˆØˆØò 	$ˆDØŸ™Ó(‰IˆC�Ø�K‰K˜ÔØ�L‰L˜ÔØÑ#Ð#Ð#ð		$ð �=Š=Ø$(×$7Ñ$7×$>Ñ$>Ð!Ø $§¡× 6Ñ 6Ñð %)×$7Ñ$7×$>Ñ$>Ð?QÀ×AQÑAQÐ$RÐ!Ø $§¡× 6Ñ 6Ð7I¸×9IÑ9IÐ JÐà×!Ñ!Ð-ØDHÇMÂM˜4×1Ñ1×@Ò@ÐW[×WmÑWm×WuÑWuˆLàˆØÐ*Ø ˆOØ.ò 2�Ø&×0Ñ0Ó2‘�	˜1Ø×&Ñ& yÕ1ð2ð #×.Ñ.ØØØØ!ØØ+ð /ó 
Ðð ×'Ò'ØUhÑRˆB�˜v w°Ð=OÑQRà1DÀRÀaÐ1HÑ.ˆB�˜v wØˆKØ!%Ðà‰>Ø× Ò Ø&*§o¡o°bÓ&9Ð#Ø%8¸¸b¸q¸b¸Ñ%AÀMÐRUÐWXÑWYÐRYÑDZÑ%ZÐ]jÐknÐprÐqrÐprÐkrÑ]sÑ%sÐ"Ø#6°s¸A¹B°wÑ#?×#CÑ#CÓ#EÈÐVYÐ[\Ñ[]ÐV]ÑH^Ñ#^Ð Ü %§¡Ð.@ÐBRÐ-SÐY[Ô \‘à!%§¡°Ó!4°}Ñ!D× MÑ MÓ O�à ×,Ñ,¨RÓ0ˆMØ $Ðà×+Ó+°×0CÑ0CÑ0OØÐ&Ü$Ð%rÓsÐsà*.×*=Ñ*=¸kÓ*JÐ'Ø& s¨A©B wÑ/×9Ñ9¸"Ó=�Ø& s¨B¨Q¨B wÑ/×9Ñ9¸"Ó=�Ø6°s¸B¸Q¸B°wÑ?À&ÑHÈ6ÑQ�Ø"9¸#¸q¹r¸'Ñ"B�Ü,1¯I©I°|À_Ð6UÐ[]Ô,^Ð)à*,Ð'Ü!&Ð'@×'FÑ'FÀqÑ'IÓ!Jò �IØ$=¸iÑ$H�MØ+×2Ñ2Ø×4Ñ4Ø)Ø)×/Ñ/°Ñ2Ø)×/Ñ/°Ñ2óõðô %*§K¡KÐ0GÈQÔ$OÐ!Ø -°×0UÑ0UÐVgÓ0hÑ h�à×%Ñ%Ð1Ù ,¨X°a©[×-@Ñ-@À"ÀgÇoÁo×F[ÑF[Ð\^Ð\_ÐF`Ó a�à"/°Ñ"3À=ÐQSÑCTÑUˆCØ×%Ñ%Ð1Ø$1°"Ñ$5��LÑ!Ø Ð,Ø(9¸"Ñ(=�Ð$Ñ%Ø�}Š}Ø%)×%7Ñ%7Ø!Ø!Ø%)×%;Ñ%;Ð%G‘MÈTØ%ó	&��MÑ"ð �>‹>Ø,0¯MªM˜Ÿš¸qˆJØ Ÿ,™, z°q˜,Ó9ˆKØˆGÜ˜zÓ*ò -�ØJ˜t×/Ñ/×CÑCÀEÑJÈ;ÐW\ÑK]Ó^�Ø—‘˜|Õ,ð-ô —i‘i ¨QÔ/ˆGØ ˆMØ×+Ò+Ð0BÐ0NØ $× <Ñ <Ø&Ø&×,Ñ,¨QÑ/Ø&×,Ñ,¨QÑ/ó!�ð
 " D×$IÑ$IÈ-Ó$XÑX�à×%Ñ%Ð1Ù(Ø˜Q‘K×'Ñ'àðð —O‘O×)Ñ)¨"¨#Ð.Ø $ôð ñ�	ð ˆ~Ø5<ÈGÑ%T��MÑ"Ø×)Ñ)Ð5Ø7@�C˜Ñ& |Ñ4Ø Ð,Ø;H�C˜Ñ&Ð'7Ñ8ð ˆ
ð '.¸WÑE�Ø×)Ñ)Ð5Ø(1�C˜Ñ%Ø Ð,Ø,9�CÐ(Ñ)àˆ
rB   c                 ól  — | j                  |«      \  }}}}| j                  j                  d | j                   }| j                  j                  d | j                   }| j                  |d ||||¬«      }| j                  r|\  }	}
}}}}}n|d d \  }	}
}}d }d }d }d }|	��Ì| j                  ri| j                  |	«      }|dd d…f   |
ddd …f   z  |
dd d…f   z   }|ddd …f   j                  «       |
ddd …f   z  }t        j                  ||gd¬«      }n"| j                  |	«      |
z   j                  «       }| j                  |	«      }| j                  rä| j                  �Ø|€t        d«      ‚| j                  |«      }|
ddd …f   j!                  d«      }|
dd d…f   j!                  d«      }|dd d…f   |z  |z   }|ddd …f   }t        j"                  ||gd¬«      }|j%                  «       d	k(  r|d   }| j'                  ||j(                  d
   |j(                  d   «      }|| j+                  |«      z   }| j,                  �à| j-                  |d
   |	g|j(                  dd  «      d
   }n¸| j.                  sJ d«       ‚ | j
                  j0                  d
   |«      }|}| j                  rC|�A| j'                  ||j(                  d
   |j(                  d   «      }|| j+                  |«      z   }| j,                  �)| j-                  |d
   |g|j(                  dd  d¬«      d
   }|�|||fS |�|||fS ||fS )Nræ   rH   .r¦   rF   r¡   rè   rÙ   é   r   r!   z,if not using decoder, two_stage must be TrueTrî   )rg   rb   r#   r[   rc   r\   rm   rl   r_   rõ   r,   rö   r÷   r^   rp   rn   rø   rÝ   r;   rÖ   r$   rã   r`   ru   r{   )r~   rú   r  rƒ   rÿ   rç   r  r  r
  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  s                              r5   rÂ   zLWDETR.forward_export[  s  € Ø)-¯©°wÓ)?Ñ&ˆˆa��à $× 3Ñ 3× :Ñ :Ð;M¸T×=MÑ=MÐ NÐØ ŸO™O×2Ñ2Ð3E°T×5EÑ5EÐFÐà"×.Ñ.ØØØØ!ØØ+ð /ó 
Ðð ×'Ò'ØUhÑRˆB�˜v w°Ð=OÑQRà1DÀRÀaÐ1HÑ.ˆB�˜v wØˆKØ!%ÐàˆØ Ðà‰>Ø× Ò Ø&*§o¡o°bÓ&9Ð#Ø%8¸¸b¸q¸b¸Ñ%AÀMÐRUÐWXÑWYÐRYÑDZÑ%ZÐ]jÐknÐprÐqrÐprÐkrÑ]sÑ%sÐ"Ø#6°s¸A¹B°wÑ#?×#CÑ#CÓ#EÈÐVYÐ[\Ñ[]ÐV]ÑH^Ñ#^Ð Ü %§¡Ð.@ÐBRÐ-SÐY[Ô \‘à!%§¡°Ó!4°}Ñ!D× MÑ MÓ O�Ø ×,Ñ,¨RÓ0ˆMØ×+Ò+°×0CÑ0CÐ0OØÐ&Ü$Ð%rÓsÐsØ*.×*=Ñ*=¸kÓ*JÐ'Ø& s¨A©B wÑ/×9Ñ9¸"Ó=�Ø& s¨B¨Q¨B wÑ/×9Ñ9¸"Ó=�Ø6°s¸B¸Q¸B°wÑ?À&ÑHÈ6ÑQ�Ø"9¸#¸q¹r¸'Ñ"B�Ü$)§I¡I¨|¸_Ð.MÐSUÔ$VÐ!Ø$×(Ñ(Ó*¨aÒ/Ø(9¸"Ñ(=Ð%Ø$(×$@Ñ$@Ø%Ø%×+Ñ+¨AÑ.Ø%×+Ñ+¨AÑ.ó%Ð!ð
 !.°×0UÑ0UÐVgÓ0hÑ h�Ø×%Ñ%Ð1Ø $× 6Ñ 6Ø˜‘Gàðð —M‘M " #Ð&ó!ð ñ!‘ð —>’>ÐQÐ#QÓQ�>ØC˜D×,Ñ,×@Ñ@ÀÑCÀFÓKˆMØ#ˆMØ×+Ò+Ð0BÐ0NØ$(×$@Ñ$@Ø&Ø&×,Ñ,¨QÑ/Ø&×,Ñ,¨QÑ/ó%Ð!ð
 !.°×0UÑ0UÐVgÓ0hÑ h�Ø×%Ñ%Ð1Ø $× 6Ñ 6Ø˜‘Gàðð —M‘M " #Ð&Ø $ð !7ó !ð ñ!�ð Ð$Ø  -°Ð>Ð>ØÐ(Ø  -Ð1BÐBÐBà  -Ð/Ð/rB   r  r  r   r  c                 óD  — ddg}|d d |d d g}|�%|j                  d«       |j                  |d d «       |�%|j                  d«       |j                  |d d «       t        |Ž D ���	cg c]"  }t        ||«      D ��	ci c]  \  }}	||	“Œ
 c}	}‘Œ$ c}	}}S c c}	}w c c}	}}w )Nré   rê   rF   rë   rì   )rò   Úzip)
r~   r  r  r   r  ÚnamesÚvaluesÚlayer_valuesrÄ   Úvalues
             r5   rû   zLWDETR._set_aux_loss±  s¬   € ð  Ð-ˆØ  Ð$ m°C°RÐ&8Ð9ˆØÐ$Ø�L‰L˜Ô&Ø�M‰M˜-¨¨Ð,Ô-ØÐ(Ø�L‰LÐ)Ô*Ø�M‰MÐ+¨C¨RÐ0Ô1Ü^aÐciÐ^j×kÐkÈl´°E¸<Ó0H×I¡  u��u‘ÕIÔkÐkùÓIùÔks   Á)BÁ=BÂ
BÂBc                 óš  — | j                   d   j                  }t        |d«      r|j                  S t        |d«      r,t        |j                  d«      r|j                  j                  S t        |d«      rVt        |j                  d«      r@t        |j                  j                  d«      r |j                  j                  j
                  S y)a_  Resolve the list of transformer blocks/layers from backbone[0].encoder.

        Supports multiple backbone architectures:
        - encoder.blocks (standard ViT)
        - encoder.trunk.blocks (aimv2)
        - encoder.encoder.encoder.layer (HuggingFace DinoV2)

        Returns:
            List of transformer layers, or None if not found.
        r   ÚblocksÚtrunkÚencoderÚlayerN)rg   r3  rµ   r1  r2  r4  )r~   Úencs     r5   Ú_get_backbone_encoder_layersz#LWDETR._get_backbone_encoder_layersÆ  sš   € ð �m‰m˜AÑ×&Ñ&ˆÜ�3˜Ô!Ø—:‘:ÐÜ�3˜Ô ¤W¨S¯Y©Y¸Ô%AØ—9‘9×#Ñ#Ð#Ü�3˜	Ô"¤w¨s¯{©{¸IÔ'FÌ7ÐSV×S^ÑS^×SfÑSfÐhoÔKpØ—;‘;×&Ñ&×,Ñ,Ð,ØrB   Údrop_path_rateÚvit_encoder_num_layersc                 ód  — | j                  «       }|€yt        |t        |«      «      }t        j                  d||«      D �cg c]  }|j                  «       ‘Œ }}t        |«      D ]C  }t        ||   d«      sŒt        ||   j                  d«      sŒ-||   ||   j                  _	        ŒE yc c}w )a¯  Update drop_path rates for backbone encoder layers with linear schedule.

        Applies a linear schedule where the first layer has drop_path_rate=0 and the last layer has
        drop_path_rate=drop_path_rate. Intermediate layers are interpolated linearly.

        Args:
            drop_path_rate: Maximum drop path rate (applied to last layer).
            vit_encoder_num_layers: Number of encoder layers to update.
        Nr   Ú	drop_pathÚ	drop_prob)
r6  ÚminrK   r,   ÚlinspaceÚitemrw   rµ   r:  r;  )r~   r7  r8  rE   ÚnÚxÚdp_ratesÚis           r5   Úupdate_drop_pathzLWDETR.update_drop_pathÚ  s¢   € ð ×2Ñ2Ó4ˆØˆ>ØÜÐ&¬¨F«Ó4ˆÜ&+§n¡n°Q¸ÈÓ&JÖK �A—F‘F•HÐKˆÐKÜ�q“ò 	<ˆAÜ�v˜a‘y +Õ.´7¸6À!¹9×;NÑ;NÐP[Õ3\Ø08¸±��q‘	×#Ñ#Õ-ñ	<ùò Ls   ÁB-c                 ó†   — | j                   j                  «       D ]$  }t        |t        j                  «      sŒ||_        Œ& y ©N)r\   ÚmodulesrL   r   ÚDropoutÚp)r~   Ú	drop_raterC   s      r5   Úupdate_dropoutzLWDETR.update_dropoutí  s5   € Ø×&Ñ&×.Ñ.Ó0ò 	%ˆFÜ˜&¤"§*¡*Õ-Ø$�•ñ	%rB   )Fr!   FFFFNr!   )r   NrE  )$Ú__name__Ú
__module__Ú__qualname__Ú__doc__r²   r%   rZ   r‡   Ústaticmethodr,   r¨   rr   rŸ   r£   ÚdictÚstrr«   rº   r½   r¿   rÖ   rã   r   rÀ   rÂ   ÚjitÚunusedrû   r   r   rv   r6  ÚfloatrC  rJ  Ú__classcell__)r„   s   @r5   rR   rR   t   s3  ø„ ÙJð ØØØ"ØØ %Ø48Ø01ñgð "& c¡¨TÑ!1ðgð +.õgðR°sð ¸tó ð& ð	¸¸S¹	ð 	ÀeÇlÁlò 	ó ð	ð ð¸TÀ#¹Yð È5Ï<É<ò ó ðð(b¨T°#©Yó bð ðYÀÀSÈ%Ï,É,ÐEVÑ@Wð YÐ\`ÐadÑ\eÐhlÑ\lò Yó ðYðWÀ$ÀsÁ)ÈdÑBRð WÐW[ó Wó@Eò$ð1à Ÿ<™<ð1ð !ð1ð "ð	1ð
 
�‰ó1ðf0ÀUÇ\Á\ð 0ÐV[×VbÑVbó 0ñdZ˜|ó ZòxT0ðl ‡Y�Y×Ñð 26ñlà—|‘|ðlð —|‘|ðlð —|‘| dÑ*ð	lð
 !Ÿ<™<¨$Ñ.òló ðlð(¨h°r·}±}Ñ.Eó ð(<¨uð <Ècð <ÐVZó <ö&%rB   rR   c                 ó8  — | j                   dz   }t        j                  | j                  «       t        d#i d| j                  “d| j
                  “d| j                  “d| j                  “d| j                  “d| j                  “d| j                  “d	| j                  “d
| j                  “d| j                  “d| j                  “d| j                  “d| j                  “dt!        | d«      r| j"                  n%t!        | d«      r| j$                  | j$                  fnd“d| j&                  “d| j(                  “d| j*                  “d| j,                  “d| j.                  d u “d| j0                  “d| j2                  “d| j4                  “d| j6                  “Ž}| j8                  r|d   j                  d d fS | j:                  r|d d fS t=        | j                  «      | _        tA        | «      }| jB                  r,tE        | j                  | jF                  | jH                  ¬«      nd }tK        ||||| jL                  | jN                  | jP                  | jR                  | jT                  | jV                  tY        | dd«      tY        | d g «      tY        | d!d«      ¬"«      }|S )$Nr!   r3  r8  Úpretrained_encoderÚwindow_block_indexesr:  Úout_channelsÚout_feature_indexesÚprojector_scaleÚuse_cls_tokenr   Úposition_embeddingÚfreeze_encoderÚ
layer_normÚtarget_shaper$   Ú
resolution)é€  rb  Úrms_normÚbackbone_loraÚforce_no_pretrainÚgradient_checkpointingÚload_dinov2_weightsÚ
patch_sizeÚnum_windowsÚpositional_encoding_sizeÚdual_projectorr   )Údownsample_ratiorm   FrS   rT   )
r   r[   rh   ri   ru   rj   rl   rm   rS   rT   © )-r   r,   r´   r   r3  r8  rW  rX  r:  r   rZ  r[  r\  r]  r^  r_  rµ   r$   ra  rc  rd  re  rf  Úpretrain_weightsrh  ri  rj  rk  Úencoder_onlyÚbackbone_onlyrK   Únum_feature_levelsr   r`   r   Ú
dec_layersÚmask_downsample_ratiorR   r[   rh   ri   ru   rj   rl   rJ   )Úargsr   rg   r\   r`   Úmodels         r5   Úbuild_modelrv  ó  sº  € ð ×"Ñ" QÑ&€KÜ	‡L�L�—‘Ôäò Ø—’ðà#×:Ò:ðð  ×2Ò2ðð "×6Ò6ð	ð
 —.’.ðð —_’_ðð !×4Ò4ðð ×,Ò,ðð ×(Ò(ðð —?’?ðð  ×2Ò2ðð ×*Ò*ðð —?’?ðô  �t˜WÔ%ð �JŠJä8?ÀÀlÔ8S�4—?‘? D§O¡OÑ4ÐYcøð#ð& —’ð'ð( ×(Ò(ð)ð* ×0Ò0ð+ð,  $×:Ò:ð-ð. !×1Ñ1°TÑ9ð/ð0 —?’?ð1ð2 ×$Ò$ð3ð4 "&×!>Ò!>ð5ð6 ×*Ò*ð7€Hð: ×ÒØ˜‰{×"Ñ" D¨$Ð.Ð.Ø×ÒØ˜˜tÐ#Ð#ä! $×"6Ñ"6Ó7€DÔÜ# DÓ)€Kð ×!Ò!ô 	Ø�O‰OØ�O‰OØ!×7Ñ7õ	
ð ð ô ØØØØØ×$Ñ$Ø—‘Ø—?‘?Ø—.‘.Ø!×6Ñ6Ø×&Ñ&ä '¨Ð.GÈÓ OÜ '¨Ð.GÈÓ LÜ)0°Ð7YÐ[\Ó)]ô€Eð  €LrB   c                 óÖ  — t        j                  | j                  «      }t        | «      }| j                  | j                  dœ}| j
                  |d<   | j                  r| j                  |d<   | j                  |d<   t        | dd«      }|r@t        | dd«      |d	<   t        | d
d«      |d<   t        | dd«      |d<   t        | dd«      |d<   | j                  r«i }t        | j                  dz
  «      D ];  }|j                  |j                  «       D ��ci c]  \  }}|d|› �z   |“Œ c}}«       Œ= | j                  r6|j                  |j                  «       D ��ci c]  \  }}|dz   |“Œ c}}«       |j                  |«       g d¢}	| j                  r|	j!                  d«       |r|	j!                  d«       t        | dd«      }
| j                  rlt#        | j$                  dz   ||| j&                  |	| j(                  |
| j*                  | j,                  | j.                  | j0                  t        | dg «      ¬«      }n`t#        | j$                  dz   ||| j&                  |	| j(                  |
| j*                  | j,                  | j.                  t        | dg «      ¬«      }|j3                  |«       t5        | j6                  t        | dg «      t        | dd«      ¬«      }||fS c c}}w c c}}w )N)Úloss_ceÚ	loss_bboxÚ	loss_giouÚloss_mask_ceÚloss_mask_dicerm   FÚkeypoint_l1_loss_coefg        Úloss_keypoints_l1Úkeypoint_findable_loss_coefÚloss_keypoints_findableÚkeypoint_visible_loss_coefÚloss_keypoints_visibleÚkeypoint_nll_loss_coefÚloss_keypoints_nllr!   rƒ   Ú_enc)ÚlabelsÚboxesÚcardinalityr  Ú	keypointsÚsum_group_lossesrS   )ÚmatcherÚweight_dictÚfocal_alphaÚlossesri   rŠ  Úuse_varifocal_lossÚuse_position_supervised_lossÚia_bce_lossÚmask_point_sample_ratiorS   )
r‹  rŒ  r�  rŽ  ri   rŠ  r�  r�  r‘  rS   Úpostprocess_trace_alphagš™™™™™É?)Ú
num_selectrS   Útrace_alpha)r,   r´   r   Úcls_loss_coefÚbbox_loss_coefÚgiou_loss_coefr`   Úmask_ce_loss_coefÚmask_dice_loss_coefrJ   rh   rw   rr  ÚupdateÚitemsru   rò   r   r   r�  ri   r�  r�  r‘  r’  r³   r   r”  )rt  r´   r‹  rŒ  Úhas_keypointsÚaux_weight_dictrB  ÚkÚvrŽ  rŠ  Ú	criterionÚpostprocesss                r5   Ú"build_criterion_and_postprocessorsr£  A  sÏ  € Ü�\‰\˜$Ÿ+™+Ó&€FÜ˜DÓ!€GØ"×0Ñ0¸t×?RÑ?RÑS€KØ#×2Ñ2€K�ÑØ×ÒØ&*×&<Ñ&<ˆ�NÑ#Ø(,×(@Ñ(@ˆÐ$Ñ%ä˜DÐ";¸UÓC€MÙÜ+2°4Ð9PÐRUÓ+VˆÐ'Ñ(Ü18¸Ð?\Ð^aÓ1bˆÐ-Ñ.Ü07¸Ð>ZÐ\_Ó0`ˆÐ,Ñ-Ü,3°DÐ:RÐTWÓ,XˆÐ(Ñ)à‡}‚}ØˆÜ�t—‘¨Ñ*Ó+ò 	UˆAØ×"Ñ"¸{×?PÑ?PÓ?R×#S±t°q¸! A¨!¨A¨3¨¡K°¡NÓ#SÕTð	Uà�>Š>Ø×"Ñ"¸k×>OÑ>OÓ>Q×#R±d°a¸ A¨¡J°¡MÓ#RÔSØ×Ñ˜?Ô+â/€FØ×ÒØ�‰�gÔÙØ�‰�kÔ"ä˜tÐ%7¸Ó?ÐØ×ÒÜ Ø×Ñ˜qÑ ØØ#Ø×(Ñ(ØØ—‘Ø-Ø#×6Ñ6Ø)-×)JÑ)JØ×(Ñ(Ø$(×$@Ñ$@Ü$+¨DÐ2KÈRÓ$Pô
‰	ô !Ø×Ñ˜qÑ ØØ#Ø×(Ñ(ØØ—‘Ø-Ø#×6Ñ6Ø)-×)JÑ)JØ×(Ñ(Ü$+¨DÐ2KÈRÓ$Pô
ˆ	ð ‡L�L�ÔÜØ—?‘?Ü '¨Ð.GÈÓ Lä˜DÐ";¸SÓAô	€Kð �kÐ!Ð!ùóc $Tùã#Rs   ÄKÅK%
Úmodel_configr   Útrain_configr   Údefaultsc                 ó¢   — ddl m} |j                  s|j                  rt	        d«      ‚|€ddlm}  |dd¬«      } || ||«      }t        |«      S )uQ  Build an LWDETR model directly from a ModelConfig.

    A config-native alternative to ``build_model(build_namespace(mc, tc))``. Constructs the namespace internally from
    ``model_config``, an optional ``train_config``, and ``defaults``, then delegates to :func:`build_model`.

    Note:
        The internal ``SimpleNamespace`` bridge is transitional â€” it will be eliminated once all builder functions
        accept config objects directly. Callers should not rely on the namespace shape or pass it externally.

    Args:
        model_config: Architecture configuration.
        train_config: Training hyperparameter configuration. If ``None``,
            a minimal dummy ``TrainConfig(dataset_dir=".", output_dir=".")`` is constructed, matching the previous
            default behavior.
        defaults: Hardcoded architectural constants. Defaults to ``MODEL_DEFAULTS``.

    Returns:
        Fully initialised LWDETR model.

    Raises:
        ValueError: If ``defaults`` request ``encoder_only`` or ``backbone_only``,
            which would make the return type differ from ``LWDETR``.
    r   ©Ú_namespace_from_configsz`build_model_from_config() requires defaults.encoder_only=False and defaults.backbone_only=False.)r   rÉ   )Údataset_dirÚ
output_dir)Úrfdetr._namespacer©  ro  rp  rn   Úrfdetr.configr   rv  )r¤  r¥  r¦  r©  r   Únss         r5   Úbuild_model_from_configr¯  ˆ  sW   € õ8 :à×Ò × 6Ò 6ÜØnó
ð 	
ð ÐÝ-á"¨s¸sÔCˆá	  ¨|¸XÓ	F€BÜ�r‹?ÐrB   c                 ó8   — ddl m}  || ||«      }t        |«      S )a¼  Build criterion and postprocessor directly from config objects.

    A config-native alternative to ``build_criterion_and_postprocessors(build_namespace(mc, tc))``.

    Args:
        model_config: Architecture configuration.
        train_config: Training hyperparameter configuration.
        defaults: Hardcoded architectural constants. Defaults to ``MODEL_DEFAULTS``.

    Returns:
        A 2-tuple of ``(SetCriterion, PostProcess)``.
    r   r¨  )r¬  r©  r£  )r¤  r¥  r¦  r©  r®  s        r5   Úbuild_criterion_from_configr±  ´  s    € õ" :á	  ¨|¸XÓ	F€BÜ-¨bÓ1Ð1rB   )rt  r   )9rN  rx   r&   Útypingr   r   r   r,   r   r­  r   r   Úrfdetr.models._defaultsr	   r
   Úrfdetr.models._typesr   Úrfdetr.models.backboner   Úrfdetr.models.criterionr   r   r   r   r   r   r   r   Ú rfdetr.models.heads.segmentationr   Úrfdetr.models.matcherr   Úrfdetr.models.mathr   Úrfdetr.models.postprocessr   Úrfdetr.models.transformerr   Úrfdetr.utilities.loggerr   Úrfdetr.utilities.tensorsr   r   rÛ   r*   r%   r6   r<   rA   ÚModulerP   rR   rv  r£  r¯  Útupler±  rm  rB   r5   ú<module>rÀ     sG  ðñ$ +ã Û ß 4Ñ 4ã Ý áß6ç AÝ ,Ý 1÷	÷ 	ó 	õ >Ý /Ý "Ý 1Ý 7Ý .ß Qá	‹€ð˜2Ÿ9™9ð °3ð ¸2¿9¹9ó ð<Q b§l¡lð Q¸cð QÀbÇlÁló Qð*°·±ð *¸tó *ô |	%ˆR�Y‰Yô |	%ó~Kó\D"ðR -1Ø,ñ)Øð)à˜=Ñ)ð)ð ð)ð ó	)ð^ -ñ2Øð2àð2ð ð2ð ˆ<˜Ð$Ñ%ô	2rB   