
    F4QhE              	         d dl mZ d dlZd dlZd dlZd dlZ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mZmZ d dlZd dlmZ d dlmZmZmZmZ d dlZd dlmZ d dlmZ ej>                  Z ddZ!e!e_         G d	 d
      Z" G d deejF                  ejH                  ejJ                  ejL                        Z' G d d      Z(y)    )annotationsN)AnyListMappingTuple)Image)ObjectDetectionResultObjectDetectionSessionObjectsDetectedSetting)DetectPlugin)	Rectanglec                B    t        | |||||      }t        |d       }|S )Nc                8    | d   t         j                  k7  | d   fS Nr      )socketAF_INETxs    F/server/volume/plugins/@scrypted/onnx/zip/unzipped/predict/__init__.py<lambda>z$custom_getaddrinfo.<locals>.<lambda>    s    AaDFNN4JAaD3Q     )key)original_getaddrinfosorted)hostportfamilytypeprotoflagsresultssorted_resultss           r   custom_getaddrinfor%      s)    "4vtUEJGG)QRNr   c                      e Zd ZdddZy)
PredictionNc                   t        |      | _        t        |      | _        t	        t        |j
                        t        |j                        t        |j                        t        |j                              | _	        || _
        y N)intidfloatscorer   xminyminxmaxymaxbbox	embedding)selfr+   r-   r2   r3   s        r   __init__zPrediction.__init__%   s]    b'5\
$))$))$))$))	
	 #r   r)   )r+   r*   r-   r,   r2   r   r3   str)__name__
__module____qualname__r5    r   r   r'   r'   $   s    #r   r'   c                      e Zd ZU ded<   	 	 	 d	 	 	 	 	 d fdZddZddZddZd ZddZ	d d!d	Z
d"d
Z	 d 	 	 	 d#dZd Zd$dZ	 	 	 	 	 	 d%dZd&dZd Zd Zd'dZ	 	 	 	 	 	 d%dZ	 	 	 	 	 	 d(dZd)dZd d)dZd Zd Zd Zd*dZ xZS )+PredictPlugindictlabelsc                    t            |       ddi _        | _        |s)t	        j
                         }|j                  d fd       g  _        d _        d  _	        | _
         j                  si  _         j                  s= j                  s0t	        j                   j                          j                         y y y )N)nativeIddeviceCreatorModeli@8  c                 $     j                         S r)   )requestRestartr4   s   r   r   z(PredictPlugin.__init__.<locals>.<lambda>H   s    1D1D1F r   r   loop)superr5   systemDevicepluginasyncioget_event_loop
call_laterbatchbatchingbatch_flushforkedforksensure_futurestartClusterrG   )r4   rJ   r@   rQ   rG   	__class__s   `    r   r5   zPredictPlugin.__init__6   s     	(+ W
  ))+DOOK)FG79
{{@BDJ{{4;;!!$"3"3"5DIIF $/{r   c                   	 t         j                  j                  t         j                  d   d      }t         j                  j                  ||      }t         j                  j	                  |      rt        d|       |S |dz   }t        d|       t        j                  t         j                  j                  |      d       t        d|       t        j                  j                  |      }|j                         d	k  s|j                         d
k\  rt        d      d}t        |d      5 }	 |j                  d      }	|	sn |t        |	      z  }|j!                  |	       4	 d d d        t        j"                  ||       t        d||d       |S # 1 sw Y   /xY w#  t%        j&                          t        d|        xY w)NSCRYPTED_PLUGIN_VOLUMEfileszFile already existsz.tmpzCreating directory forT)exist_okDownloading   ,  non-2xx response coder   wbi   
DownloadedbyteszError downloading)ospathjoinenvironisfileprintmakedirsdirnameurllibrequesturlopengetcode	Exceptionopenreadlenwriterename	traceback	print_exc)
r4   urlfilename	filesPathfullpathtmpresponsero   fdatas
             r   downloadFilezPredictPlugin.downloadFileU   sv   	RZZ0H%I7SIww||Ix8Hww~~h'+X6V#C*C0KK1DA-%~~--c2H!C'8+;+;+=+D"799Dc4 "A#==5DCI%DGGDM  	" IIc8$,$8O" "	!%s+s+   A=F   B/F  /6F&-F  FF   #Gc                H    t        | j                  j                               S r)   )listr>   valuesrE   s    r   
getClasseszPredictPlugin.getClassess   s    DKK&&())r   c                    dgS )Nmotionr:   rE   s    r   getTriggerClasseszPredictPlugin.getTriggerClassesv   s
    zr   c                f    t        j                  t        j                  j	                                y r)   )rK   rS   scrypted_sdkdeviceManagerrD   rE   s    r   rD   zPredictPlugin.requestRestarty   s    l88GGIJr   c                     y r)   r:   rE   s    r   get_input_detailszPredictPlugin.get_input_details}       r   c                    g S r)   r:   )r4   settingss     r   getModelSettingszPredictPlugin.getModelSettings   s    	r   c                     y)Nrgbr:   rE   s    r   get_input_formatzPredictPlugin.get_input_format   s    r   c                   g }i }||d<   ||d<   |D ]8  }| j                   j                  |j                  |j                        }i }|j                  j                  |j                  j
                  |j                  j                  |j                  j                  z
  |j                  j                  |j                  j
                  z
  f|d<   t        t        d |d               rt        d|j                         ||d<   |j                  |d<   t        |d      r|j                  |j                  |d<   |j                  |       ; |r|d   }g |d<   |D ]  }|d   }	 ||	d	   |	d
   f      \  }
} ||	d	   |	d   z   |	d
   |	d   z   f      \  }}|
|||
z
  d
z   ||z
  d
z   f|d<   t        t        d |d               rt        dj                         |d   j                  |        |S )N
detectionsinputDimensionsboundingBoxc                .    t        j                  |        S r)   mathisfiniter   s    r   r   z7PredictPlugin.create_detection_result.<locals>.<lambda>   s    T]]1%5!5 r   zunexpected nan detected	classNamer-   r3   r   r         c                .    t        j                  |        S r)   r   r   s    r   r   z7PredictPlugin.create_detection_result.<locals>.<lambda>   s    q)9%9 r   )r>   getr+   r2   r.   r/   r0   r1   anymaprf   r-   hasattrr3   append)r4   objssizeconvert_to_src_sizer   detection_resultobjr   	detectionbbr   yx2y2s                 r   create_detection_resultz%PredictPlugin.create_detection_result   s    35
,.)3&.2*+ 	)C7I/1I--	(Im$ 35y7OPQ/:%.Ik"!$IgsK(S]]-F),	+&i(#	)& ),7J-/\*' A	}-*BqE2a5>:1,bebemRURU]-KLB,-q"q&1*b1fqj+I	-(s99];STU3SXX> .55i@A  r   c                     y)N)NNr:   )r4   src_sizes     r   get_detection_input_sizez&PredictPlugin.get_detection_input_size   s    
 r   c                     y r)   r:   rE   s    r   get_input_sizezPredictPlugin.get_input_size   r   r   c                   K   y wr)   r:   )r4   inputr   r   cvsss        r   detect_oncezPredictPlugin.detect_once   s      	   c                   K   y wr)   r:   )r4   inputss     r   detect_batchzPredictPlugin.detect_batch   s	     r   c                t  K   | j                   }g | _         d| _        t        |      rW|D cg c]  }|d   	 }}	 | j                  |       d {   }t	        |      D ]  \  }}||   d   j                  |        y y c c}w 7 5# t        $ r%}|D ]  }|d   j                  |        Y d }~y d }~ww xY wwr   )rN   rO   rp   r   	enumerate
set_resultrm   set_exception)	r4   rN   r   r   r#   iresulter   s	            r   	run_batchzPredictPlugin.run_batch   s     


u:$)*qad*F*. $ 1 1& 99!*7!3 3IAv!HQK**623	 *9  ." .E!H**1-..sJ   *B8B B8B B.B >B8B 	B5B0+B80B55B8c                N   K   d | _         | j                          d {    y 7 wr)   )rP   r   rE   s    r   flush_batchzPredictPlugin.flush_batch   s     nns   %#%c                   K   t        j                  t        j                               } j                  j	                  ||f        j
                  rZ j
                  dz
   _         j
                  r: j                  s$ j                  j                  d fd       _        | d {   S  j                          d {    | d {   S 7 &7 7 w)NrF   r   g      ?c                 J    t        j                   j                               S r)   )rK   rS   r   rE   s   r   r   z+PredictPlugin.queue_batch.<locals>.<lambda>   s    W%:%:4;K;K;M%N r   )
rK   FuturerL   rN   r   rO   rP   rG   rM   r   )r4   r   futures   `  r   queue_batchzPredictPlugin.queue_batch   s     W%;%;%=>

5&/*== MMA-DM}}'''+yy';';N(D$ $|#nn| $s6   B'C*C+CC	CCCCCc                   K   	 | j                  ||||      }t        j                  |d       d {   S 7 #  t        j                          t        d       | j                           xY ww)N<   z@encountered an error while detecting. requesting plugin restart.)r   rK   wait_forrs   rt   rf   rD   )r4   r   r   r   r   r{   s         r   safe_detect_oncezPredictPlugin.safe_detect_once   sd     	  (DAA ))!R0000	!TU!s%   A--8 68 A-8 2A**A-c                x  K   |xr |j                  d      }|xr |j                  d      xs d}| xj                  |z  c_        |j                  |j                  }}| j	                         \  }}||d }	|j                  }|j                  }d }
n!d }	||z  ||z  fd}
||k7  s||k7  r||d}	|j
                  xs | j                         }| j                         dk(  r|j                  dk7  r|j
                  xs d	}|j                  |	|d
       d {   }| j                         d	k(  r,t        j                  j                  |||f|       d {   }n| j                         dk(  r,t        j                  j                  |||f|       d {   }nJ| j                         dk(  r,t        j                  j                  |||f|       d {   }nt        d      	 | j                  ||||f|
       d {   }||j!                          S 7 7 7 7 G7 # |j!                          w xY ww)Nr   rN   r   c                    | S r)   r:   )points    r   r   z/PredictPlugin.run_detection_image.<locals>.cvss  s    r   c                $    | d   z  | d   z  fS r   r:   )r   xsyss    r   r   z/PredictPlugin.run_detection_image.<locals>.cvss!  s    Qx"}eAhm33r   )widthheightyuvj444pTr   )resizeformatrgbazunsupported format)r   rO   r   r   r   r   r   ffmpegFormatstoBuffercommoncolorsensureRGBDataensureRGBADataensureYCbCrADatarm   r   close)r4   imagedetection_sessionr   rN   iwihwhr   r   r   br|   retr   r   s                  @@r   run_detection_imagez!PredictPlugin.run_detection_image
  s#     %J):)>)>z)J"E'8'<'<W'EK!ellB""$19	FAA FRBRB4 Qw"'
 8!6!6!8   "j0""d*...  
 
   "e+44QAGGD""$.55a!QHHD""$
277Aq66JJD011	--dHr2hMMCJJL)
 HHJ
 N JJLsr   DH:H=H:H>H:H>H:H!H:+H% H#H% 
H:H:H:!H:#H% %H77H:c                   K    j                   r# j                   j                  |       d {   S |j                  dd       st        d       j                  rt        d       j
                  j                  d       }|sZt        j                  dd j                  gii|xs i       } fd}|j                  j                  |       | j
                  <   |j                   d {   }|S 7 7 w)NclusterWorkerIdzclusterWorkerId requiredzcannot fork a forkr>   requirec                T    t        d       j                  j                         y )Nzcluster worker exit)rf   rR   pop)r   r   r4   s    r   clusterWorkerExitz>PredictPlugin.forkInterfaceInternal.<locals>.clusterWorkerExitY  s    +_=

/r   )rJ   forkInterfaceInternalr   rm   rQ   rR   r   forkpluginIdexitadd_done_callbackr   )r4   optionsrQ   r   r   r   s   `    @r   r   z#PredictPlugin.forkInterfaceInternalH  s     ;;::7CCC!++&7>677;;0116!&&I7KGMrKF0 KK))*;<*0DJJ'}}$/ D, %s"   +C<C8CC<1C:2C<:C<c                D  K   |t         j                  j                  j                  k7  rt	        d      | j                  |       d {   }| j                  s|j                          d {   }|S | j                  dk(  r|j                          d {   }|S | j                  dk(  r|j                          d {   }|S | j                  dk(  r|j                          d {   }|S |j                  | j                         d {   }|S 7 7 7 7 Z7 37 w)Nzunsupported fork interfacetextrecognitionfacerecognitionclipembedding)r   ScryptedInterfaceObjectDetectionvaluerm   r   r@   	getPlugingetTextRecognitiongetFaceRecognitiongetClipEmbeddinggetCustomDetection)r4   forkInterfacer   r   r   s        r   r  zPredictPlugin.forkInterfacec  s	    L::JJPPP89911'::}}((**C 
 ]]//1133C 
 ]]//1133C
 
	 ]]o-//11C 
 11$--@@C
 ;*331@sl   AD 	D
#D -D.(D D(D ?D (D (D)$D DD D D D D D c                   K   	 t         j                  }|sy |j                          d {   }|j                         }|D ]  }||k(  rvt        d       } |_        t        j                         }t        j                   j                        |_        |j                  j                  |       | j                  |<   ~|f fd	}t        j                   |        j                          y 7 #  t	        j
                          Y y xY ww)NrF   c                p   K   t        d|        	 j                  d| i       d {    y 7 #  Y y xY ww)Nzstarting cluster workerr   )rf   r   )r   r4   s    r   startClusterWorkerz6PredictPlugin.startCluster.<locals>.startClusterWorker  s@     /A44*O<  s    6/ -/ 6/ 36)r   clusterManagergetClusterWorkersgetClusterWorkerIdrs   rt   ForkrJ   
PluginForkrK   r   rG   r   r   rR   rS   )r4   r  workersthisClusterWorkerIdcwidselfForkpfr  s   `       r   rT   zPredictPlugin.startClustert  s     	)88N!*<<>>G"0"C"C"E
  	HD**:"&!,,.#NN		:			$$X.#%

4 9=  !!"4"6TYYG-	H ?	!s7   DC2 DC2 C0C2  B0D0C2 2D
Dc                   K   g }|j                  dddd       |j                  dddd       |j                  dd	d
dd       |S w)Nnamez
Model Namez=The name or description of this model. E.g., Bird Classifier.)r   titledescriptionru   z	Model URLzZThe URL of the model. This should be a Github repo or url path to the model's config.json.infohtmlzSample Modelzc<a href='https://github.com/scryptedapp/bird-classifier'>A reference bird classification model.</a>)r   r    r  r   )r   )r4   r   s     r   getCreateDeviceSettingsz%PredictPlugin.getCreateDeviceSettings  sg     

!Z
 	 	

 w
 	 	

#z	
 	 
s   AAc                  K   |j                  dd       }|st        d      |j                  dd       }|st        d      |j                  d      s`| j                  j	                  d      d   }t        j                  d|      }|st        d	      |j                         \  }}d
| d| d| d}t        j                  j                  |      }|j                         dk  s|j                         dk\  rt        d      |j                         }	t        j                  |	      }
dj!                  t#        j$                  dd            }| j'                  ||       d {   }ddlm} | j-                  |       d {   }|j.                  j1                  d|       |j.                  j1                  dt        j2                  |
             |j5                          |S 7 7 cw)Nr  zModel name not providedru   zModel URL not providedzconfig.json/r   z#https://github\.com/([^/]+)/([^/]+)zInvalid GitHub repository URL.z"https://raw.githubusercontent.com/z/refs/heads/main/models/z/config.jsonr[   r\   r]    0123456789abcdef   )k)CustomDetection
config_urlconfig)r   rm   endswithr   splitrematch
ValueErrorgroupsri   rj   rk   rl   ro   jsonloadsrc   randomchoicesreportDevicecustom_detectr  	getDevicestoragesetItemdumps
init_model)r4   r   r  	model_urlplugin_suffixr#  orgreporz   r|   r  r@   r+   r  devices                  r   createDevicezPredictPlugin.createDevice  s    ||FD)566!eT2	455!!-0 MM//4Q7MHHCYOE !ABBIC<SE4&H`an`oo{|I>>)))4#x'7'7'9S'@355}}D!776>>*<BC$$Xt442(,x(@"@|Y7xF);<	 5 #As%   E G'"G##G'G%A"G'%G'c                ~  K   t         j                  j                  |t         j                  j                  j
                  t         j                  j                  j
                  t         j                  j                  j
                  t         j                  j                  j
                  dg|d       d {   S 7 w)NCustomObjectDetection)r@   r    
interfacesr  )
r   r   onDeviceDiscoveredScryptedDeviceTypeBuiltinr   r   ClusterForkInterfacer   Settings)r4   r@   r  s      r   r*  zPredictPlugin.reportDevice  s     !//BB$$77??EE 22GGMM 22BBHH 22;;AA+	 

 
 	
 
s   B4B=6B;7B=)NNF)rJ   r<   r@   z
str | NonerQ   bool)ru   r6   rv   r6   )returnz	list[str])r@  zTuple[int, int, int]r)   )r   r   r@  zlist[Setting])r@  r6   )r   zList[Prediction]r@  r   )r@  zTuple[int, int])r   zImage.Imager   r   r@  r   )r   	List[Any]r@  rA  )r   r   r@  rA  )r   zscrypted_sdk.Imager   r
   r@  r   )r   r=   )r@   r6   r  r6   )r7   r8   r9   __annotations__r5   r}   r   r   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rT   r  r6  r*  __classcell__)rU   s   @r   r<   r<   3   s   L !%#	GG G 	G><*K AE) $) 	) V ,/	
.
 
,/
	
J<'<<R<	<|6"!HH.!F
r   r<   c                  4    e Zd ZddZd Zd Zd Zd Zd	dZy)
r	  c                4    |r |d      | _         y d | _         y )NT)rQ   rJ   )r4   
PluginTypes     r   r5   zFork.__init__  s    $D1DKDKr   c                "   K   | j                   S wr)   rF  rE   s    r   r   zFork.getPlugin  s     {{s   c                T   K   | j                   j                  d       d {   S 7 w)Nr   rJ   r,  rE   s    r   r   zFork.getTextRecognition  "     [[**+<====   (&(c                T   K   | j                   j                  d       d {   S 7 w)Nr   rJ  rE   s    r   r   zFork.getFaceRecognition  rK  rL  c                T   K   | j                   j                  d       d {   S 7 w)Nr   rJ  rE   s    r   r   zFork.getClipEmbedding  s!     [[**?;;;;rL  c                T   K   | j                   j                  |       d {   S 7 wr)   rJ  )r4   r@   s     r   r  zFork.getCustomDetection  s!     [[**84444rL  N)rG  r   )r@   r6   )	r7   r8   r9   r5   r   r   r   r   r  r:   r   r   r	  r	    s     >><5r   r	  )r   r   r   r   ))
__future__r   r&  r(  r"  rK   r   ra   r   rs   urllib.requestri   typingr   r   r   r   r   PILr   scrypted_sdk.typesr	   r
   r   r   common.colorsr   detectr   predict.rectangler   getaddrinfor   r%   r'   r=  ScryptedSystemDeviceDeviceCreatorDeviceProviderr<   r	  r:   r   r   <module>r\     s    "   	   	    , ,  : :   '))  ( # #l
L,"C"C\EfEfht  iC  iC  EQ  E`  E` l
\5 5r   