Ë
    FêñiŒ  ã                  óz   — d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlZ	d dl
Z
d dlmZ ddlmZ  G d„ de«      Zy)	é    )ÚannotationsN)ÚPath)ÚLOGGERé   )ÚBaseBackendc                  ó6   ‡ — e Zd ZdZddˆ fd„Zdd„Zdd„Zˆ xZS )	ÚTensorFlowBackenda&  Google TensorFlow inference backend supporting multiple serialization formats.

    Loads and runs inference with Google TensorFlow models in SavedModel, GraphDef (.pb), TFLite (.tflite), and Edge TPU
    formats. Handles quantized model dequantization and task-specific output formatting.
    c                óT   •— |dv sJ d|› d�«       ‚|| _         t        ‰| �	  |||«       y)a�  Initialize the Google TensorFlow backend.

        Args:
            weight (str | Path): Path to the SavedModel directory, .pb file, or .tflite file.
            device (torch.device): Device to run inference on.
            fp16 (bool): Whether to use FP16 half-precision inference.
            format (str): Model format, one of "saved_model", "pb", "tflite", or "edgetpu".
        >   ÚpbÚtfliteÚedgetpuÚsaved_modelzUnsupported TensorFlow format: ú.N)ÚformatÚsuperÚ__init__)ÚselfÚweightÚdeviceÚfp16r   Ú	__class__s        €úd/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/ultralytics/nn/backends/tensorflow.pyr   zTensorFlowBackend.__init__   s>   ø€ ð ÐCÑCÐpÐGfÐgmÐfnÐnoÐEpÓpÐCØˆŒÜ‰Ñ˜ ¨Õ.ó    c                ó   ‡— | j                   dv rddlŠ| j                   dk(  rt        j                  d|› d�«       ‰j                  j                  |«      | _        t        |«      dz  }|j                  «       r'ddl	m
} | j                  |j                  |«      «       yy| j                   d	k(  �rt        j                  d|› d
�«       ddlm} ˆfd„}‰j                  «       j                  «       }t!        |d«      5 }|j#                  |j%                  «       «       ddd«        ||d ||«      ¬«      | _        	 t)        t        |«      j+                  «       j,                  j/                  t        |«      j0                  › d�«      «      }ddl	m
} | j                  |j                  |«      «       y	 ddlm}m}	 d| _        | j                   dk(  r­tC        | jD                  «      jG                  d«      r| jD                  dd nd}
t        j                  d|› d|
dd › d�«       ddddœtI        jJ                  «          } |tC        |«       |	|d|
i¬«      g¬«      | _&        tO        jD                  d «      | _"        n't        j                  d|› d!�«        ||¬"«      | _&        | jL                  jQ                  «        | jL                  jS                  «       | _*        | jL                  jW                  «       | _,        	 t[        j\                  |d#«      5 }|j_                  «       d   }|j%                  |«      ja                  d$«      }|d%k(  r%| j                  tc        jd                  |«      «       n$| j                  tg        jh                  |«      «       ddd«       y# 1 sw Y   �Œ†xY w# t2        $ r Y yw xY w# t<        $ rE ddlŠ‰| _        ‰j>                  j6                  ‰j>                  j@                  j8                  }	}Y �ŒFw xY w# 1 sw Y   yxY w# tZ        jj                  tl        tn        tb        jp                  f$ r Y yw xY w)&z±Load a Google TensorFlow model in SavedModel, GraphDef, TFLite, or Edge TPU format.

        Args:
            weight (str | Path): Path to the model file or directory.
        >   r   r   r   Nr   zLoading z' for TensorFlow SavedModel inference...zmetadata.yaml)ÚYAMLr   z% for TensorFlow GraphDef inference...)Ú
gd_outputsc                ó  •‡ — ‰j                   j                  j                  ˆ ˆfd„g «      }|j                  j                  }|j                  ‰j                  j                  ||«      ‰j                  j                  ||«      «      S )zXWrap a TensorFlow frozen graph for inference by pruning to specified input/output nodes.c                 óR   •— ‰j                   j                  j                  ‰ d¬«      S )NÚ )Úname)ÚcompatÚv1Úimport_graph_def)ÚgdÚtfs   €€r   ú<lambda>zITensorFlowBackend.load_model.<locals>.wrap_frozen_graph.<locals>.<lambda>?   s!   ø€ °r·y±y·|±|×7TÑ7TÐUWÐ^`Ð7TÓ7a€ r   )r!   r"   Úwrap_functionÚgraphÚas_graph_elementÚpruneÚnestÚmap_structure)r$   ÚinputsÚoutputsÚxÚger%   s   `    €r   Úwrap_frozen_graphz7TensorFlowBackend.load_model.<locals>.wrap_frozen_graph=   sc   ù€ à—I‘I—L‘L×.Ñ.Ô/aÐceÓf�Ø—W‘W×-Ñ-�Ø—w‘w˜rŸw™w×4Ñ4°R¸Ó@À"Ç'Á'×BWÑBWÐXZÐ\cÓBdÓeÐer   Úrbzx:0)r-   r.   z_saved_model*/metadata.yaml)ÚInterpreterÚload_delegater   Útpué   z:0z on device r   z* for TensorFlow Lite Edge TPU inference...zlibedgetpu.so.1zlibedgetpu.1.dylibzedgetpu.dll)ÚLinuxÚDarwinÚWindowsr   )Úoptions)Ú
model_pathÚexperimental_delegatesÚcpuz! for TensorFlow Lite inference...)r;   Úrzutf-8zmetadata.json)9r   Ú
tensorflowr   Úinfor   ÚloadÚmodelr   ÚexistsÚultralytics.utilsr   Úapply_metadataÚ#ultralytics.utils.export.tensorflowr   ÚGraphÚas_graph_defÚopenÚParseFromStringÚreadÚfrozen_funcÚnextÚresolveÚparentÚrglobÚstemÚStopIterationÚtflite_runtime.interpreterr3   r4   r%   ÚImportErrorÚliteÚexperimentalÚstrr   Ú
startswithÚplatformÚsystemÚinterpreterÚtorchÚallocate_tensorsÚget_input_detailsÚinput_detailsÚget_output_detailsÚoutput_detailsÚzipfileÚZipFileÚnamelistÚdecodeÚjsonÚloadsÚastÚliteral_evalÚ
BadZipFileÚSyntaxErrorÚ
ValueErrorÚJSONDecodeError)r   r   Úmetadata_filer   r   r1   r$   Úfr3   r4   r   ÚdelegateÚzfr    Úcontentsr%   s                  @r   Ú
load_modelzTensorFlowBackend.load_model'   s¥  ø€ ð �;‰;Ð/Ñ/Û#à�;‰;˜-Ò'Ü�K‰K˜( 6 (Ð*QÐRÔSØŸ™×,Ñ,¨VÓ4ˆDŒJä  ›L¨?Ñ:ˆMØ×#Ñ#Ô%Ý2à×#Ñ# D§I¡I¨mÓ$<Õ=ð &ð �[‰[˜DÓ Ü�K‰K˜( 6 (Ð*OÐPÔQÝFôfð —‘“×(Ñ(Ó*ˆBÜ�f˜dÓ#ð - qØ×"Ñ" 1§6¡6£8Ô,÷-á0°¸EÉ:ÐVXË>ÔZˆDÔðÜ $Ü˜“L×(Ñ(Ó*×1Ñ1×7Ñ7¼4À»<×;LÑ;LÐ:MÐMhÐ8iÓjó!�õ 3à×#Ñ# D§I¡I¨mÓ$<Õ=ðeßQà�”ð �{‰{˜iÒ'Ü,/°·±Ó,<×,GÑ,GÈÔ,N˜Ÿ™ Q R™ÐTX�Ü—‘˜h v h¨k¸&ÀÀ¸*¸ÐEoÐpÔqØ%6ÐBVÐcpÑqÜ—O‘OÓ%ñ�ñ $/Ü" 6›{Ù,9¸(ÈXÐW]ÐL^Ô,_Ð+`ô$�Ô ô $Ÿl™l¨5Ó1�•ä—‘˜h v hÐ.OÐPÔQÙ#.¸&Ô#A�Ô à×Ñ×-Ñ-Ô/Ø!%×!1Ñ!1×!CÑ!CÓ!EˆDÔØ"&×"2Ñ"2×"EÑ"EÓ"GˆDÔð	Ü—_‘_ V¨SÓ1ð H°RØŸ;™;›=¨Ñ+�DØ!Ÿw™w t›}×3Ñ3°GÓ<�HØ˜Ò.Ø×+Ñ+¬D¯J©J°xÓ,@ÕAà×+Ñ+¬C×,<Ñ,<¸XÓ,FÔG÷Hð H÷]-ñ -ûô !ò Ùðûô ò eÛ'à�”Ø-/¯W©W×-@Ñ-@À"Ç'Á'×BVÑBV×BdÑBd˜]“ð	eú÷6Hð Hûô ×&Ñ&¬´ZÄ×AUÑAUÐVò Ùðúsc   Ä  N$Ä?A7N1 Æ8O  ÌP ÌBPÎP Î$N.Î1	N=Î<N=Ï A
PÐPÐPÐP ÐP Ð-QÑQc                ó¨  — |j                  «       j                  «       }| j                  dk(  r1| j                  j	                  |«      }t        |t        «      �sE|g}�n@| j                  dk(  r'ddl}| j                  |j                  |«      ¬«      }�n
|j                  dd \  }}| j                  d   }|d   t        j                  t        j                  hv }|r"|d	   \  }}	||z  |	z   j                  |d   «      }| j                   j#                  |d
   |«       | j                   j%                  «        g }| j&                  D �]U  }
| j                   j)                  |
d
   «      }|r-|
d	   \  }}	|j                  t        j*                  «      |	z
  |z  }|j,                  dk(  rå|j                  d   dk(  s| j.                  rj|dd…dd…ddgfxx   |z  cc<   |dd…dd…ddgfxx   |z  cc<   | j0                  dk(  rŒ|dd…dd…ddd…fxx   |z  cc<   |dd…dd…ddd…fxx   |z  cc<   n]|dd…ddgfxx   |z  cc<   |dd…ddgfxx   |z  cc<   | j0                  dk(  r(|dd…ddd…fxx   |z  cc<   |dd…ddd…fxx   |z  cc<   |j3                  |«       �ŒX | j0                  dk(  rgt5        |d   j                  «      dk7  rt        t7        |«      «      }|d   j                  d   dk(  r|d   g}nt        j8                  |d   d«      |d<   |D �cg c].  }t        |t        j:                  «      r|n|j                  «       ‘Œ0 c}S c c}w )a8  Run Google TensorFlow inference with format-specific execution and output post-processing.

        Args:
            im (torch.Tensor): Input image tensor in BHWC format (converted from BCHW by AutoBackend).

        Returns:
            (list[np.ndarray]): Model predictions as a list of numpy arrays.
        r   r   r   N)r/   r   r6   ÚdtypeÚquantizationÚindexéÿÿÿÿé   é   Úposeé   é   Úsegmenté   )r   r6   r   rz   )r=   Únumpyr   rB   Úserving_defaultÚ
isinstanceÚlistr?   rL   ÚconstantÚshaper_   ÚnpÚint8Úint16Úastyper[   Ú
set_tensorÚinvokera   Ú
get_tensorÚfloat32ÚndimÚend2endÚtaskÚappendÚlenÚreversedÚ	transposeÚndarray)r   ÚimÚyr%   ÚhÚwÚdetailsÚis_intÚscaleÚ
zero_pointÚoutputr/   s               r   ÚforwardzTensorFlowBackend.forward|   s  € ð �V‰V‹X�^‰^ÓˆØ�;‰;˜-Ò'Ø—
‘
×*Ñ*¨2Ó.ˆAÜ˜a¤Õ&Ø�C’Ø�[‰[˜DÒ Û#à× Ñ  2§;¡;¨r£?Ð Ó3ŠAà—8‘8˜A˜a�=‰DˆAˆqà×(Ñ(¨Ñ+ˆGØ˜WÑ%¬"¯'©'´2·8±8Ð)<Ð<ˆFáØ$+¨NÑ$;Ñ!��zØ˜5‘j :Ñ-×5Ñ5°g¸gÑ6FÓG�à×Ñ×'Ñ'¨°Ñ(8¸"Ô=Ø×Ñ×#Ñ#Ô%àˆAØ×-Ñ-ó �Ø×$Ñ$×/Ñ/°°w±Ó@�ÙØ(.¨~Ñ(>Ñ%�E˜:ØŸ™¤"§*¡*Ó-°
Ñ:¸eÑC�AØ—6‘6˜Q’;à—w‘w˜r‘{ aÒ'¨4¯<ª<Øš!šQ  A ˜,›¨1Ñ,›Øš!šQ  A ˜,›¨1Ñ,›ØŸ9™9¨Ò.Øša¢ A D q D˜j›M¨QÑ.›MØša¢ A D q D˜j›M¨QÑ.œMàš!˜a ˜V˜)›¨Ñ)›Øš!˜a ˜V˜)›¨Ñ)›ØŸ9™9¨Ò.Øša   A ˜g›J¨!™O›JØša   A ˜g›J¨!™O›JØ—‘˜–ð'ð* �9‰9˜	Ò!Ü�1�Q‘4—:‘:‹ !Ò#Üœ !›Ó%�Ø�‰t�z‰z˜"‰~ Ò"Ø�q‘T�F‘ä—|‘| A a¡D¨,Ó7��!‘ØGHÖIÀ!”Z ¤2§:¡:Ô.‘°A·G±G³IÑ=ÒIÐIùÒIs   Ì3M)Fr   )r   ú
str | Pathr   ztorch.devicer   Úboolr   rW   )r   r    ÚreturnÚNone)r–   ztorch.Tensorr¢   zlist[np.ndarray])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rs   rŸ   Ú__classcell__)r   s   @r   r	   r	      s   ø„ ñö/óS÷j<Jr   r	   )Ú
__future__r   rh   rf   rY   rb   Úpathlibr   r€   r†   r\   rD   r   Úbaser   r	   © r   r   ú<module>r­      s5   ðõ #ã 
Û Û Û Ý ã Û å $å ôeJ˜õ eJr   