
    FPhhi                         d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
Z
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mZmZmZ d dlmZmZmZmZ d dlmZmZ d Z  G d	 d
ejB                        Z"y)    N)OrderedDict
namedtuple)Path)Image)ARM64LINUXLOGGERROOT	yaml_load)check_requirementscheck_suffixcheck_version
check_yaml)attempt_download_assetis_urlc                    t        | t              rt        t        |             } t        | t              r| j	                         D ci c]  \  }}t        |      t        |       } }}t        |       }t        | j                               |k\  rHt        | d|dz
   dt        | j                                dt        | j                                d      t        | d   t              rO| d   j                  d      r;t        t        dz        d	   }| j	                         D ci c]  \  }}|||    } }}| S c c}}w c c}}w )
zw
    Check class names.

    Map imagenet class codes to human-readable names if required. Convert lists to dicts.
    z(-class dataset requires class indices 0-   z%, but you have invalid class indices -z defined in your dataset YAML.r   n0zcfg/datasets/ImageNet.yamlmap)
isinstancelistdict	enumerateitemsintstrlenmaxkeysKeyErrormin
startswithr   r
   )nameskvn	names_maps        eC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\ultralytics/nn/autobackend.pycheck_class_namesr*      s$    %Yu%&%,1KKM:MDAqQQM:Juzz|!aS HQOt!%**,/0#ejjl2C1DDbd e eeAh$q)<)<T)B!$)E"EFuMI16?AQ	!_E?L ; @s   	D>)Ec                        e Zd ZdZ ej
                         d ej                  d      dddddf fd	       ZddZd	 Z	dd
Z
ed        Zedd       Z xZS )AutoBackendaQ  
    Handles dynamic backend selection for running inference using Ultralytics YOLO models.

    The AutoBackend class is designed to provide an abstraction layer for various inference engines. It supports a wide
    range of formats, each with specific naming conventions as outlined below:

        Supported Formats and Naming Conventions:
            | Format                | File Suffix      |
            |-----------------------|------------------|
            | PyTorch               | *.pt             |
            | TorchScript           | *.torchscript    |
            | ONNX Runtime          | *.onnx           |
            | ONNX OpenCV DNN       | *.onnx (dnn=True)|
            | OpenVINO              | *openvino_model/ |
            | CoreML                | *.mlpackage      |
            | TensorRT              | *.engine         |
            | TensorFlow SavedModel | *_saved_model    |
            | TensorFlow GraphDef   | *.pb             |
            | TensorFlow Lite       | *.tflite         |
            | TensorFlow Edge TPU   | *_edgetpu.tflite |
            | PaddlePaddle          | *_paddle_model   |
            | ncnn                  | *_ncnn_model     |

    This class offers dynamic backend switching capabilities based on the input model format, making it easier to deploy
    models across various platforms.
    z
yolov8n.ptcpuFNTc                   X t         Y|           t        t        |t              r|d   n|      }t        |t
        j                  j                        }	| j                  |      \  }
}}}}}}}}}}}}}||
xs |xs |xs |xs
 |xs |	xs |z  }|xs |xs
 |xs |xs |}d}d\  }}t
        j                  j                         xr |j                  dk7  }|r&t        |	|
||g      st        j                  d      }d}|
s|s|	st        |      }|	r|j                  |      }|r|j!                  |      n|}t#        |d      r|j$                  }t'        t)        |j*                  j'                               d      }t#        |d      r|j,                  j.                  n|j.                  }|r|j1                         n|j3                          || _        d	}

n|
rdd
lm}  |t        |t              r|n||d	|      }t#        |d      r|j$                  }t'        t)        |j*                  j'                               d      }t#        |d      r|j,                  j.                  n|j.                  }|r|j1                         n|j3                          || _        
n#|rt;        j<                  d| d       ddi} t
        j>                  jA                  || |      }|r|j1                         n|j3                          | d   	rtC        jD                  | d   d       }	n|rEt;        j<                  d| d       tG        d       tH        jJ                  jM                  |      }!	nV|rt;        j<                  d| d       tG        d|rdndf       ddl'}"|rddgndg}#|"jQ                  ||#      }$|$jS                         D %cg c]  }%|%jT                   }&}%|$jW                         jX                  }n|r0t;        j<                  d| d       tG        d       ddl-m.}'m/}(m0})  |'       }*tc        |      }|je                         stg        |ji                  d             }|*jk                  t        |      |jm                  d!      "      }+|+jo                         d   jq                         jr                  r(|+jo                         d   ju                   |(d#              |)|+      },|,jv                  r|,jy                         }-|*j{                  |+d$%      }.|j|                  d&z  }n|rt;        j<                  d| d'       	 ddl?}/t        |/j                  d+d	,       |j                  dk(  rt        j                  d-      }t        d.d/      }0|/j                  |/j                  j                        }1t        |d0      5 }2|/j                  |1      5 }3t(        j                  |2j                  d1      d23      }4tC        jD                  |2j                  |4      j                  d4            }|3j                  |2j                               }ddd       ddd       |j                         }5t               }6g }&d}d}7t        |j                        D ]1  }8|j                  |8      }9|/j                  |j                  |8            }:|j                  |8      rbd5t        |j                  |8            v r0d	}7|5j                  |8t        |j                  d|8      d6                |:t        j                  k(  rd	}n|&j                  |9       t        |5j                  |8            };t        j                  t        jr                  |;|:7            j                  |      }< |0|9|:|;|<t)        |<j                                     |6|9<   4 t        d8 |6j                         D              }=|6d9   j                  d   }-n|rOt;        j<                  d| d:       ddl`}>|>j                  j                  |      }t        |j                        }np|rqt;        j<                  d| d;       ddleXd}?|?r%Xj                  j                  j                  |      nXj                  jA                  |      }tc        |      d&z  }n|rt;        j<                  d| d<       ddleXdd=limj}@ Xfd>}AXj                         j                         }Bt        |d0      5 }2Bj                  |2j                                ddd        ABd? @|B      @      }Cnn|s|r6	 ddAlnmo}Dmp}E |rFt;        j<                  d| dB       dCdDdEdFt        j                            }F D| E|F      gG      }Gn"t;        j<                  d| dH        D|I      }GGj                          |Gj                         }H|Gj                         }It        j                  t        j                        5  t        j                  |dJ      5 }|j                         d   }Jt        j                  |j                  |J      j                  d4            }ddd       ddd       n3|rt        dK      |r
t;        j<                  d| dL       tG        |rdMndN       ddlm}K tc        |      }|je                         stg        |j                  dO            }Kj	                  t        |      t        |jm                  dP                  }L|rLj                  dQdR       Kj                  L      }M|Mj                  |Mj                         d         }N|Mj                         }&|j                  dS   d&z  }n|rt;        j<                  d| dT       tG        t        rdUndV       ddl}O|Oj                         }!||!j                  _        tc        |      }|je                         stg        |ji                  dW            }|!j!                  t        |             |!j                  t        |jm                  d!                   |j|                  d&z  }n9|rtG        dX       ddYlm}P  |P|      }nddZlim}Q t)        d[| d\ |Q              t        |t        tb        f      r&tc        |      j+                         rt-        |      }|r||j                         D ]=  \  }R}S|Rd]v rt)        S      |R<   Rd^v st        St              s/t/        S      |R<   ? |d_   }|d`   }T|da   }U|db   }V|dc   }|j1                  d      }n |
s|s|	st;        j2                  dd| de       dct5               vr| j7                  |      }t9              }|
r|j;                         D ]	  }Wd|W_         | j>                  jA                  t5                      yc c}%w # t        $ r t        rtG        d(d)*       ddl?}/Y w xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# t        $ r> ddleXXj                  j                  Xj                  j                  j                  }E}DY Dw xY w# 1 sw Y   /xY w# 1 sw Y   xY w)fa  
        Initialize the AutoBackend for inference.

        Args:
            weights (str): Path to the model weights file. Defaults to 'yolov8n.pt'.
            device (torch.device): Device to run the model on. Defaults to CPU.
            dnn (bool): Use OpenCV DNN module for ONNX inference. Defaults to False.
            data (str | Path | optional): Path to the additional data.yaml file containing class names. Optional.
            fp16 (bool): Enable half-precision inference. Supported only on specific backends. Defaults to False.
            fuse (bool): Fuse Conv2D + BatchNorm layers for optimization. Defaults to True.
            verbose (bool): Enable verbose logging. Defaults to True.
        r       )NNr-   F)verbose	kpt_shapemoduleT)attempt_load_weights)deviceinplacefusezLoading z for TorchScript inference...z
config.txt )_extra_filesmap_locationc                 4    t        | j                               S N)r   r   xs    r)   <lambda>z&AutoBackend.__init__.<locals>.<lambda>   s    W[\]\c\c\eWf    )object_hookz! for ONNX OpenCV DNN inference...zopencv-python>=4.5.4z for ONNX Runtime inference...onnxzonnxruntime-gpuonnxruntimeNCUDAExecutionProviderCPUExecutionProvider)	providersz for OpenVINO inference...zopenvino>=2023.0)CoreLayout	get_batchz*.xmlz.bin)modelweightsNCHWAUTO)device_namezmetadata.yamlz for TensorRT inference...znvidia-tensorrtz*-U --index-url https://pypi.ngc.nvidia.com)cmdsz7.0.0)hardzcuda:0Binding)namedtypeshapedataptrrb   little)	byteorderzutf-8   )rR   c              3   >   K   | ]  \  }}||j                   f  y wr;   )rU   ).0r'   ds      r)   	<genexpr>z'AutoBackend.__init__.<locals>.<genexpr>   s     'P?Otq!AEE
?Os   imagesz for CoreML inference...z' for TensorFlow SavedModel inference...z% for TensorFlow GraphDef inference...)
gd_outputsc                     j                   j                  j                   fdg       }|j                  j                  }|j                  j                  j                  ||      j                  j                  ||            S )z"Wrap frozen graphs for deployment.c                  R    j                   j                  j                   d      S )Nr7   )rQ   )compatv1import_graph_def)gdtfs   r)   r>   zAAutoBackend.__init__.<locals>.wrap_frozen_graph.<locals>.<lambda>   s    ryy||7T7TUW^`7T7ar?   )rd   re   wrap_functiongraphas_graph_elementprunenestmap_structure)rg   inputsoutputsr=   gerh   s   `    r)   wrap_frozen_graphz/AutoBackend.__init__.<locals>.wrap_frozen_graph   sc    IILL../acefWW--wwrww44R@"''BWBWXZ\cBdeer?   zx:0)ro   rp   )Interpreterload_delegatez* for TensorFlow Lite Edge TPU inference...zlibedgetpu.so.1zlibedgetpu.1.dylibzedgetpu.dll)LinuxDarwinWindows)
model_pathexperimental_delegatesz! for TensorFlow Lite inference...)rx   rz2YOLOv8 TF.js inference is not currently supported.z for PaddlePaddle inference...zpaddlepaddle-gpupaddlepaddlez	*.pdmodelz
.pdiparamsi   )memory_pool_init_size_mb	device_idr   z for ncnn inference...z'git+https://github.com/Tencent/ncnn.gitncnnz*.paramztritonclient[all])TritonRemoteModelexport_formatszmodel='z]' is not a supported model format. See https://docs.ultralytics.com/modes/predict for help.

)stridebatch)imgszr$   r1   r   taskr   r   r$   u-   WARNING ⚠️ Metadata not found for 'model=')super__init__r   r   r   torchnnModule_model_typecudais_availabletypeanyr4   r   tor6   hasattrr1   r   r   r   r2   r$   halffloatrI   ultralytics.nn.tasksr3   r	   infojitloadjsonloadsr   cv2dnnreadNetFromONNXrB   InferenceSessionget_outputsrQ   get_modelmetacustom_metadata_mapopenvino.runtimerF   rG   rH   r   is_filenextglob
read_modelwith_suffixget_parameters
get_layoutempty
set_layout	is_static
get_lengthcompile_modelparenttensorrtImportErrorr   r   __version__r   LoggerINFOopenRuntime
from_bytesreaddecodedeserialize_cuda_enginecreate_execution_contextr   rangenum_bindingsget_binding_namenptypeget_binding_dtypebinding_is_inputtupleget_binding_shapeset_binding_shapeget_profile_shapenpfloat16append
from_numpydata_ptrr   rS   coremltoolsmodelsMLModelr   user_defined_metadata
tensorflowkeras
load_modelsaved_modelultralytics.engine.exporterra   Graphas_graph_defParseFromStringtflite_runtime.interpreterrs   rt   liteexperimentalplatformsystemallocate_tensorsget_input_detailsget_output_details
contextlibsuppresszipfile
BadZipFileZipFilenamelistastliteral_evalNotImplementedErrorpaddle.inference	inferencerglobConfigenable_use_gpucreate_predictorget_input_handleget_input_namesget_output_namesparentsr   r~   Netoptuse_vulkan_compute
load_paramultralytics.utils.tritonr   r   	TypeErrorexistsr   evalgetwarninglocals_apply_default_class_namesr*   
parametersrequires_grad__dict__update)ZselfrJ   r4   r   rT   fp16r6   r0   w	nn_moduleptr   rA   xmlenginecoremlr   pbtfliteedgetputfjspaddler~   tritonnhwcr   rI   metadatar   r1   r$   r3   extra_filesnetrB   rE   sessionr=   output_namesrF   rG   rH   coreov_model	batch_dim
batch_sizeov_compiled_modeltrtrP   loggerfruntimemeta_lencontextbindingsdynamicirQ   rR   rS   imbinding_addrsctr   ra   rr   rg   frozen_funcrs   rt   delegateinterpreterinput_detailsoutput_details	meta_filepdiconfig	predictorinput_handlepyncnnr   r   r%   r&   r   r   r   prh   	__class__sZ                                                                                           @r)   r   zAutoBackend.__init__G   sN   * 	j$7
WEw8	Q 	iCsFFKVWdTZ\`bhIcITISIFIiI6I???f?$x zz&&(AV[[E-AYC89\\%(FD f	&q)A JJv&E37EJJwJ/UEuk*!OO	U\\--/0"5F*1%*BELL&&E EJJLekkmDJBA(Jw4MST0615.24E uk*!OO	U\\--/0"5F*1%*BELL&&E EJJLekkmDJKK(1#%BCD',KIINN1;VNTE EJJLekkm<(::k,&?MfgKK(1#%FGH56''))!,CKK(1#%CDET(9}UVMQ02HIXnWoI!221	2JG,3,?,?,AB,AqAFF,ALB,,.BBHKK(1#%?@A12@@6DQA99;)SVQ]]6=RSH&&(+668>>'')!,77vG!(+I""&113
 $ 2 28 2 Pxx/1HKK(1#%?@A'&
 #//7>{{e#h/ ,UVGZZ

0Fa!S[[%8G>>!&&)x>H::affX&6&=&=g&FG77A &9 446G"}HLDG5--.--a0

5#:#:1#=>))!,U5#:#:1#=>>"&11!U5;R;RSTVW;XYZ;[5\]

*# ''-g77:;%%bhhuE&BCFFvN!(ueRR[[]AS!T / ('Px~~?O'PPM!(+11!4JKK(1#%=>?$II%%a(EE778HKK(1#%LMN#E5:BHHOO..q1@S@STU@VEAw0HKK(1#%JKL#>f ((*Ba!""1668, +BujQSnUKweQ hqc)STU.2,. /7oo.?A *QP]^fPgOhihqc)JKL)Q7((*'99;M(;;=N$$W%7%78__Q, % 0 3I"//

90E0L0LW0UVH - 98 %&Z[[KK(1#%CDET1~N*QA99;-.ZZAAMM,,G(HIF%%tq%Q,,V4I$55i6O6O6QRS6TUL$557Lyy|o5HKK(1#%;<=EHW]^!**,C)-CGG&QA99;	*+NN3q6"NN3q}}V456xx/1H23B%a(EBgaS )##1#3"46 7 7
 hd,h1F1F1H *H (1++"%a&HQK99jC>P"&q'HQK	 )
 h'FF#DW%EW%EW%E [1I)NNJ7)STUV &("33D9E!%( %%'"' ( 	VX&] C,  '&'8?kl&' &9%8b   e'-/WW-@-@"''BVBVBdBd]e$ -, 98s   xx 	yA9x:y yy!  z87Az+>z8 x76x7:y	?yyy!Az('z(+z5	0z88{c                    |j                   \  }}}}| j                  r-|j                  t        j                  k7  r|j                         }| j                  r|j                  dddd      }| j                  s| j                  r+|s|r| j                  |||      n| j                  |      }	nO| j                  r| j                  |      }	n0| j                  rU|j                         j                         }| j                  j!                  |       | j                  j#                         }n| j$                  rm|j                         j                         }| j&                  j)                  | j*                  | j&                  j-                         d   j.                  |i      }nV| j0                  rH|j                         j                         }t3        | j5                  |      j7                               }n| j8                  r| j:                  r|j                   | j<                  d   j                   k7  r| j                  j?                  d      }	| j@                  jC                  |	|j                          | j<                  d   jE                  |j                         | j<                  d<   | j*                  D ]g  }
| j                  j?                  |
      }	| j<                  |
   jF                  jI                  tK        | j@                  jM                  |	                   i | j<                  d   j                   }|j                   |k(  s(J d|j                    d	| j:                  rd
nd d|        tO        |jQ                               | jR                  d<   | j@                  jU                  t3        | jR                  j7                                      tW        | j*                        D cg c]  }| j<                  |   jF                   }}n| jX                  r|d   j                         j                         }t[        j\                  |dz  j_                  d            }| j                  ja                  d|i      }d|v rtc        d| d      te        |      dk(  rt3        |j7                               }n;te        |      dk(  r,t3        tg        |j7                                     }n| jh                  r|j                         j                         j_                  tj        jl                        }| jn                  jq                  |       | jr                  j)                          | j*                  D cg c]+  }| jr                  ju                  |      jw                         - }}nJ| jx                  r| jz                  j}                  |d   j                         j                               }| j                  j                         }| j                  j                         | j                  j+                         }}|j                  |d   |       g }|D ]U  }| jz                  j}                         }|j                  ||       |j                  tk        j                  |      d          W nC| j                  r1|j                         j                         }| j                  |      }n|j                         j                         }| j                  rF| j                  r| j                  |d      n| j                  |      }t        |t2              s	|g}n| j                  r| j                  | j                  j                  |            }te        |      dk(  rte        | j                        dk(  rte        |d   j                         dk(  rdnd\  }}||   j                   d   ||   j                   d   z
  dz
  }t        |      D 	ci c]  }	|	d|	 
 c}	| _M        n7| j                  d   }|d   tj        j                  tj        j                  fv }|r"|d   \  }}||z  |z   j_                  |d         }| j                  j                  |d   |       | j                  j                          g }| j                  D ]  }| j                  j                  |d         }|r-|d   \  }}|j_                  tj        jl                        |z
  |z  }|j                  dkD  r&|ddddgfxx   |z  cc<   |ddddgfxx   |z  cc<   |j                  |        te        |      dk(  rKte        |d   j                         dk7  rt3        tg        |            }tk        j                  |d   d      |d<   |D cg c].  }t        |tj        j                        r|n|j                         0 }}t        |t2        tJ        f      rAte        |      dk(  r| j                  |d         S |D cg c]  }| j                  |       c}S | j                  |      S c c}w c c}w c c}	w c c}w c c}w ) a  
        Runs inference on the YOLOv8 MultiBackend model.

        Args:
            im (torch.Tensor): The image tensor to perform inference on.
            augment (bool): whether to perform data augmentation during inference, defaults to False
            visualize (bool): whether to visualize the output predictions, defaults to False

        Returns:
            (tuple): Tuple containing the raw output tensor, and processed output for visualization (if visualize=True)
        r   r[      r   )augment	visualizer`   )rS   zinput size  >znot equal toz max model size    uint8image
confidenceziUltralytics only supports inference of non-pipelined CoreML models exported with 'nms=False', but 'model=z6' has an NMS pipeline created by an 'nms=True' export.NF)trainingr<     rW   )r   r   )r   r   classrR   quantizationindex)r   r5  r   r[   )[rS   r  rR   r   r   r   r  permuter  r  rI   r   r   r-   numpyr  setInputforwardrA   r  runr  
get_inputsrQ   r  r   r  valuesr  r"  r!  get_binding_indexr   r   _replacerT   resize_r   r   r   r   r%  
execute_v2sortedr	  r   	fromarrayastypepredictr   r   reversedr  r   float32r0  copy_from_cpur/  get_output_handlecopy_to_cpur~   r1  Matcreate_extractorinput_namesinputextractr   arrayr  r   r   r   r
  r'  rh   constantr$   r   r*  int8int16r)  
set_tensorinvoker+  
get_tensorndim	transposendarrayr   )r  r$  r6  r7  bchhr  yr#  rQ   sr=   im_pilmat_inexrY  r  output_namemat_outipibncdetailsintegerscale
zero_pointoutputs                               r)   rF  zAutoBackend.forwardH  s)    hh2q!99U]]2B99Aq!Q'B77dnnHOS\

2w)
DbfblblmobpAXX

2AXX!BHHb!  "AYY!B  !2!2T\\5L5L5Nq5Q5V5VXZ4[\AXX!BT++B/6689A[[||DMM(,C,I,I IJJ00:..q"((;*.--*A*J*JQSQYQY*J*Zh' --D

44T:AMM$',,44U4<<;Y;YZ[;\5]^ . h'--A88q=wKz$,,3Tb:ccstusv"ww=+.r{{}+=Dx(LL##D););)B)B)D$EF06t7H7H0IJ0I1q!&&0IAJ[[A""$B__b3h%6%6w%?@F

""GV#45Aq  !;;<#=s!u v v Q1$Q1!((*-.[[!((4B++B/NN LPL]L]^L]q11!4@@BL]A^YY[[__RUYY[%6%6%89F**,B(,(<(<(>@U@U@WKHH[^V,A+++//+

;0'*401  , [[!B

2A!B6:jjDJJrEJ2djjQSn!!T*A$$tww'7'7';$<q6Q;3tzz?c#9'*1Q4::!';VFB2Q!B%++a.81<B:?)!D)Q!uQC[.)!DDJ,,Q/!'*rww.AA(/(?%E:u*z199'':JKB  ++GG,<bA  '')"11F((33F7ODA,2>,B)zXXbjj1J>%Gvvz !aV))!aV))HHQK 2 1v{qtzz?a'Xa[)A||AaD,7!HIJ1jBJJ/QWWY>AJ a$',/FaK4??1Q4(\Z[=\Z[UVdooa>PZ[=\\??1%%a K, _2 "E4 K
 >]s   1 i%?0i*i/3i49i9c                     t        |t        j                        r.t        j                  |      j                  | j                        S |S )z
        Convert a numpy array to a tensor.

        Args:
            x (np.ndarray): The array to be converted.

        Returns:
            (torch.Tensor): The converted tensor
        )r   r   re  r   tensorr   r4   )r  r=   s     r)   r   zAutoBackend.from_numpy  s4     3=Q

2Ku||A!!$++.RQRRr?   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  f}t        |      r| j                  j                  dk7  s| j                  rzt        j                  || j                  rt        j                  nt        j                  | j                  d}t!        | j                  rdnd      D ]  }| j#                  |        yyy)a8  
        Warm up the model by running one forward pass with a dummy input.

        Args:
            imgsz (tuple): The shape of the dummy input tensor in the format (batch_size, channels, height, width)

        Returns:
            (None): This method runs the forward pass and don't return any value
        r-   )rR   r4   r[   r   N)r  r   rA   r  r   r
  r  r  r   r4   r   r   r   r  r   r   r   rF  )r  r   warmup_typesr$  _s        r)   warmupzAutoBackend.warmup  s     ww$))T[[$BRBRTXT[T[]a]h]hjnjxjxx|$++"2"2e";t{{e5::\`\g\ghB1a0R  1 @Kr?   c                     t        j                  t              5  t        t	        |             d   cddd       S # 1 sw Y   nxY wt        d      D ci c]  }|d| 
 c}S c c}w )zSApplies default class names to an input YAML file or returns numerical class names.r$   Nr?  r@  )r   r   	Exceptionr   r   r   )rT   r#  s     r)   r   z&AutoBackend._apply_default_class_names  sV       +Z-.w7 ,++(-c
3
1U1#;
333s   ;AA$c                    ddl m} t         |       j                        }t	        | d      st        | t              st        | |       t        |       j                  }|D cg c]  }||v  }}|dxx   |j                  d      z  cc<   |dxx   |d    z  cc<   t        |      rd}n8dd	lm}  ||       }|j                  xr |j                  xr |j                   d
v }||gz   S c c}w )z
        This function takes a path to a model file and returns the model type.

        Args:
            p: path to the model file. Defaults to path/to/model.pt
        r   r   F)check   z.mlmodel   	   )urlsplit>   grfchttp)r   r   r   Suffixr   r   r   r   r   rQ   endswithr   urllib.parser  netlocpathscheme)	r2  r   sfrQ   rj  typesr  r  urls	            r)   r   zAutoBackend._model_type  s     	?."))*au%jC.@BAw||$&'BqdB'aDMM*--aaL u:F-1+CZZOCHHO?O1OFx (s   #C))FF))r   r5    r  )zpath/to/model.pt)__name__
__module____qualname____doc__r   no_gradr4   r   rF  r   r}  staticmethodr   r   __classcell__)r3  s   @r)   r,   r,   +   s    6 U]]_%$U+~' ~'@|&|
S!  4 4    r?   r,   )#r   r   r   r   r   collectionsr   r   pathlibr   r   rD  r   r   torch.nnr   PILr   ultralytics.utilsr   r   r	   r
   r   ultralytics.utils.checksr   r   r   r   ultralytics.utils.downloadsr   r   r*   r   r,    r?   r)   <module>r     sQ         /  
     C C ` ` F*W ")) W r?   