Ë
    FêñiU  ã                  ó^   — d Z ddlmZ ddlmZ ddlZddlmZ  G d„ dej                  «      Z	y)zVNecks are the interface between a vision backbone and the rest of the detection model.é    )Úannotations)ÚdeepcopyNc                  ól   ‡ — e Zd ZdZ	 	 d	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 d	d„Z	 	 	 	 	 	 d
d„Zddgfdd„Zˆ xZS )ÚSam3DualViTDetNeckzbA neck that implements a simple FPN as in ViTDet, with support for dual necks (for SAM3 and SAM2).c                ó8  •— t         ‰| �  «        || _        || _        t	        j
                  «       | _        || _        d}| j                  j                  d   }t        |«      D �]�  \  }}	t	        j                  «       }
|	dk(  r…|
j                  dt	        j                  ||dz  dd¬«      «       |
j                  dt	        j                  «       «       |
j                  dt	        j                  |dz  |d	z  dd¬«      «       |d	z  }n}|	d
k(  r2|
j                  dt	        j                  ||dz  dd¬«      «       |dz  }nF|	dk(  r|}n>|	dk(  r*|
j                  dt	        j                  dd¬«      «       |}nt        d|	› d�«      ‚|
j                  dt	        j                   ||d|¬«      «       |
j                  dt	        j                   ||dd|¬«      «       | j                  j#                  |
«       �Œ’ d| _        |rt'        | j                  «      | _        yy)aú  
        SimpleFPN neck a la ViTDet
        (From detectron2, very lightly adapted)
        It supports a "dual neck" setting, where we have two identical necks (for SAM3 and SAM2), with different weights.

        :param trunk: the backbone
        :param position_encoding: the positional encoding to use
        :param d_model: the dimension of the model
        :param scale_factors: tuple of scale factors for each FPN level
        :param add_sam2_neck: whether to add a second neck for SAM2
        Téÿÿÿÿç      @Údconv_2x2_0é   )Úkernel_sizeÚstrideÚgeluÚdconv_2x2_1é   ç       @Ú	dconv_2x2ç      ð?ç      à?Úmaxpool_2x2zscale_factor=z is not supported yet.Úconv_1x1é   )Úin_channelsÚout_channelsr   ÚbiasÚconv_3x3é   )r   r   r   Úpaddingr   N)ÚsuperÚ__init__ÚtrunkÚposition_encodingÚnnÚ
ModuleListÚconvsÚscale_factorsÚchannel_listÚ	enumerateÚ
SequentialÚ
add_moduleÚConvTranspose2dÚGELUÚ	MaxPool2dÚNotImplementedErrorÚConv2dÚappendÚ
sam2_convsr   )Úselfr    r!   Úd_modelr%   Úadd_sam2_neckÚuse_biasÚdimÚ_ÚscaleÚcurrentÚout_dimÚ	__class__s               €úc/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/models/sam/sam3/necks.pyr   zSam3DualViTDetNeck.__init__   s  ø€ ô& 	‰ÑÔØˆŒ
Ø!2ˆÔÜ—]‘]“_ˆŒ
à*ˆÔØˆØ—:‘:×*Ñ*¨2Ñ.ˆä! -Ó0ó 5	'‰HˆAˆuÜ—m‘m“oˆGà˜Š|Ø×"Ñ"Ø!Ü×&Ñ& s¨C°1©HÀ!ÈAÔNôð ×"Ñ"ØÜ—G‘G“Iôð ×"Ñ"Ø!Ü×&Ñ& s¨a¡x°¸±ÀqÐQRÔSôð  ™(‘Ø˜#’Ø×"Ñ"ØÜ×&Ñ& s¨C°1©HÀ!ÈAÔNôð  ™(‘Ø˜#’Ø‘Ø˜#’Ø×"Ñ"Ø!Ü—L‘L¨Q°qÔ9ôð ‘ä)¨M¸%¸Ð@VÐ*WÓXÐXà×ÑØÜ—	‘	Ø 'Ø!(Ø !Ø!ô	ôð ×ÑØÜ—	‘	Ø 'Ø!(Ø !ØØ!ôô	ð �J‰J×Ñ˜gÖ&ðk5	'ðn ˆŒÙä& t§z¡zÓ2ˆD�Oð ó    c                óÚ   — | j                  |«      }|d   }| j                  || j                  «      \  }}| j                  €||ddfS | j                  || j                  «      \  }}||||fS )z8Get feature maps and positional encodings from the neck.r   N)r    Úsam_forward_feature_levelsr$   r0   )r1   Útensor_listÚxsÚxÚsam3_outÚsam3_posÚsam2_outÚsam2_poss           r;   ÚforwardzSam3DualViTDetNeck.forwardj   sy   € ð �Z‰Z˜Ó$ˆØˆr‰FˆØ!×<Ñ<¸QÀÇ
Á
ÓKÑˆ�(Ø�?‰?Ð"Ø˜X t¨TÐ1Ð1Ø!×<Ñ<¸QÀÇÁÓPÑˆ�(Ø˜ 8¨XÐ5Ð5r<   c                óÄ   — g g }}|D ]T  } ||«      }|j                  |«       |j                  | j                  |«      j                  |j                  «      «       ŒV ||fS )zNRun neck convolutions and compute positional encodings for each feature level.)r/   r!   ÚtoÚdtype)r1   rA   r$   ÚoutsÚpossÚconvÚfeats          r;   r>   z-Sam3DualViTDetNeck.sam_forward_feature_levelsv   se   € ð ˜ˆdˆØò 	EˆDÙ˜“7ˆDØ�K‰K˜ÔØ�K‰K˜×.Ñ.¨tÓ4×7Ñ7¸¿
¹
ÓCÕDð	Eð �TˆzÐr<   ið  c                ó:   — | j                   j                  |«       y)z*Set the image size for the trunk backbone.N)r    Ú	set_imgsz)r1   Úimgszs     r;   rO   zSam3DualViTDetNeck.set_imgsz�   s   € à�
‰
×Ñ˜UÕ#r<   ))r	   r   r   r   F)r    ú	nn.Moduler!   rQ   r2   Úintr3   Úbool)r?   zlist[torch.Tensor]Úreturnzctuple[list[torch.Tensor], list[torch.Tensor], list[torch.Tensor] | None, list[torch.Tensor] | None])rA   ztorch.Tensorr$   znn.ModuleListrT   z-tuple[list[torch.Tensor], list[torch.Tensor]])rP   z	list[int])	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rF   r>   rO   Ú__classcell__)r:   s   @r;   r   r      s„   ø„ Ùlð +Ø#ðV3àðV3ð %ðV3ð ð	V3ð õV3ðp
6Ø-ð
6à	ló
6ð	Øð	Ø&3ð	à	6ó	ð -1°$¨<÷ $ð $r<   r   )
rX   Ú
__future__r   Úcopyr   ÚtorchÚtorch.nnr"   ÚModuler   © r<   r;   ú<module>r`      s)   ðñ
 ]å "å ã Ý ôt$˜Ÿ™õ t$r<   