
    4Aj&*                        d Z ddlm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mZmZmZ  G d de
          ZdS )	uF  Face tracking tool using MediaPipe Face Mesh.

Tracks face bounding boxes, landmarks, and head pose across video frames.
Outputs per-frame face data as JSON — used by auto_reframe, face_enhance,
and other tools that need to know where the speaker's face is.

Falls back to OpenCV Haar cascade if MediaPipe is not installed.
    )annotationsN)Path)Any)BaseToolDeterminismExecutionModeResourceProfile
ToolResultToolStability
ToolStatusToolTierc                  v   e Zd ZdZdZej        ZdZdZ	e
j        Zej        Zej        ZdgZdZdgZg dZd	d
gddiddddddddddddddZd	ddiddiddiddiddiddidd	ddiddid	ddiddiddiddidddddddZ ed d!d"d#$          Zg d%Zd&gZd'gZg Zd:d*Zd:d+Z d;d-Z!d<d1Z"d=d7Z#d>d8Z$d9S )?FaceTrackerface_trackerz0.1.0analysis	mediapipez
cmd:ffmpegzFor best results install MediaPipe:
pip install mediapipe opencv-python

Falls back to OpenCV Haar cascade (ships with opencv-python).ffmpeg)face_detectionface_trackingface_bounding_boxhead_pose_estimationobject
input_pathtypestringz"Path for face tracking JSON output)r   descriptionnumber   z:Frames per second to sample (lower = faster, less precise))r   defaultr         ?        g      ?)r   r   minimummaximum)r   output_path
sample_fpsmin_detection_confidence)r   required
propertiesintegerarrayxywidthheight)r   r(   )frame_indextimestamp_secondsbbox)r   items)frame_countface_detected_countvideo_widthvideo_heightfpsduration_secondsfaces   i   r   d   )	cpu_coresram_mbvram_mbdisk_mb)r   r%   r&   z(writes face tracking JSON to output_pathz.Spot-check bounding boxes against video framesreturnboolc                2    	 dd l }dS # t          $ r Y dS w xY wNr   TF)r   ImportError)selfr   s     J/app/working/workspaces/default/OpenMontage/tools/analysis/face_tracker.py_has_mediapipezFaceTracker._has_mediapipeu   s:    	4 	 	 	55	    
c                2    	 dd l }dS # t          $ r Y dS w xY wrD   )cv2rE   )rF   rK   s     rG   _has_opencvzFaceTracker._has_opencv|   s7    	JJJ4 	 	 	55	rI   r   c                    |                                  r |                                 rt          j        S |                                 rt          j        S t          j        S )N)rH   rL   r   	AVAILABLEDEGRADEDUNAVAILABLE)rF   s    rG   
get_statuszFaceTracker.get_status   sX       	(T%5%5%7%7 	('' 	'&&%%    inputsdict[str, Any]r
   c                   t          |d                   }|                                st          dd|           S |                                 st          dd          S t          |                    dt          |                    d                                        }|j                            dd	           |                    d
d          }|                    dd          }t          j	                    }| 
                                r|                     |||          }n|                     ||          }t          j	                    |z
  }|                    t          j        |d          d           t          dt          |          |d         |d         |d         |d         |d         |d         | 
                                rdnddt          |          gt!          |d                    S )Nr   FzInput not found: )successerrorz=opencv-python is required. Install: pip install opencv-pythonr$   z.faces.jsonT)parentsexist_okr%   r   r&   r    r;   )indentzutf-8)encodingr6   r7   r8   r9   r4   r5   r   opencv_haar)outputr6   r7   r8   r9   frames_sampledfaces_detectedmethod)rV   data	artifactsr9   )r   existsr
   rL   getstrwith_suffixparentmkdirtimerH   _track_mediapipe_track_opencv
write_textjsondumpsround)	rF   rS   r   r$   r%   
confidencestartresult_dataelapseds	            rG   executezFaceTracker.execute   s   &.//
  "" 	Ue3Sz3S3STTTT!! 	U   
 JJ}c**@*@*O*O&P&PQQ
 
 	   ===ZZa00
ZZ :C@@
	   	E//
J
SSKK,,ZDDK)++%tz+a@@@7SSSk***=9 +N ;"5)$/0B$C"-m"<"-.C"D)-)<)<)>)>Q++M	 	 ;''("7A..
 
 
 	
rR   r   r%   floatrp   dictc                p   dd l }dd l}|j        j        }|                    t          |                    }|                    |j                  pd}t          |                    |j	                            }	t          |                    |j
                            }
t          |                    |j                            }|dk    r||z  nd}t          dt          ||z                      }g }d}d}|                    d|          5 }|                                r2|                                \  }}|sn||z  dk    r|dz  }|                    ||j                  }|                    |          }|j        rt          |j        d           }|j        j        }|                    |t/          ||z  d          t/          |j        d         d          t/          |j        d          t/          |j        d          t/          |j        d          t/          |j        d          d	d
           |dz  }|                                2d d d            n# 1 swxY w Y   |                                 |	|
t/          |d          t/          |d          |t=          |          |dS )Nr         >@   )model_selectionr&   c                    | j         d         S )Nr   )score)ds    rG   <lambda>z.FaceTracker._track_mediapipe.<locals>.<lambda>   s    !'!* rR   )key      r+   r0   r1   rp   r2   r;   r6   r7   r8   r9   r4   r5   r:   )rK   r   	solutionsr   VideoCapturere   rd   CAP_PROP_FPSintCAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTCAP_PROP_FRAME_COUNTmaxFaceDetectionisOpenedreadcvtColorCOLOR_BGR2RGBprocess
detectionslocation_datarelative_bounding_boxappendro   r|   xminyminr.   r/   releaselen)rF   r   r%   rp   rK   mpmp_facecap	video_fpsvideo_wvideo_htotal_framesdurationsample_interval
faces_data	frame_idxsampleddetectorretframergbresultsdetr2   s                           rG   rj   zFaceTracker._track_mediapipe   s    	


,-s://GGC,--5	cggc67788cggc788993773#;<<==/81}}<)++! aY%;!<!<==!#
	""%/ # 
 
 !	 ,,..  XXZZ
U .!33qLG,,uc.?@@C&..s33G) !#. 4 4    #0F"))+416y97La1P1P*/	!a*@*@%*49a%8%8%*49a%8%8).tz1)=)=*/Q*?*?	% %	
+ 
+ 
 
 
 Q	; ,,.. 	!	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	 !	F 	 ##A&& %h 2 2"#&z??
 
 	
s   EI&&I*-I*c                H   ddl }|j        j        dz   }|                    |          }|                    t          |                    }|                    |j                  pd}t          |                    |j	                            }t          |                    |j
                            }	t          |                    |j                            }
|dk    r|
|z  nd}t          dt          ||z                      }g }d}d}|                                r9|                                \  }}|sn||z  dk    r|dz  }|                    ||j                  }|                    |ddd	          }t%          |          dk    rd
 |D             }|                    t          |                    }||         \  }}}}|                    |t+          ||z  d          dt+          ||z  d          t+          ||	z  d          t+          ||z  d          t+          ||	z  d          dd           |dz  }|                                9|                                 ||	t+          |d          t+          |d          |t%          |          |dS )z-Fallback: OpenCV Haar cascade face detection.r   Nz#haarcascade_frontalface_default.xmlrx   ry   g?r   )<   r   )scaleFactorminNeighborsminSizec                "    g | ]\  }}}}||z  S  r   ).0_whs       rG   
<listcomp>z-FaceTracker._track_opencv.<locals>.<listcomp>  s$    @@@|1aQU@@@rR   r   r!   r   r+   r   r;   r   )rK   ra   haarcascadesCascadeClassifierr   re   rd   r   r   r   r   r   r   r   r   r   COLOR_BGR2GRAYdetectMultiScaler   indexr   ro   r   )rF   r   r%   rK   cascade_pathcascader   r   r   r   r   r   r   r   r   r   r   r   graydetectedareasbest_idxr,   r-   r   r   s                             rG   rk   zFaceTracker._track_opencv   s   


x,/TT''55s://GGC,--5	cggc67788cggc788993773#;<<==/81}}<)++!aY%;!<!<==!#
	llnn 	JC ?*a//1||E3+=>>"33c8 4   x==1$$@@x@@@E${{3u::66H!)(!3JAq!Q%%'0-29y3H!-L-L&)!&q7{A!6!6!&q7{A!6!6%*1w;%:%:&+AK&;&;	! !	
' 
' 
 
 
 NI; llnn 	> 	 ##A&& %h 2 2"#&z??
 
 	
rR   N)rA   rB   )rA   r   )rS   rT   rA   r
   )r   r   r%   ru   rp   ru   rA   rv   )r   r   r%   ru   rA   rv   )%__name__
__module____qualname__nameversionr   COREtier
capabilityproviderr   EXPERIMENTAL	stabilityr   SYNCexecution_moder   DETERMINISTICdeterminismdependenciesinstall_instructionsagent_skillscapabilitiesinput_schemaoutput_schemar	   resource_profileidempotency_key_fieldsside_effectsuser_visible_verificationfallback_toolsrH   rL   rQ   rt   rj   rk   r   rR   rG   r   r      sN       DG=DJH*I"'N+K >L	H 
 :L  L !N!8, C 
 ![  !	) )
 
 L0 "I.$*I#6"I.#Y/H%!' 2$(.	':.4h-?$,&,h%7&,h%7*0();+18*<	+ +! !# #  
 
 M> '4TWXXXUUU>?L8! N      & & & &,
 ,
 ,
 ,
\C
 C
 C
 C
J=
 =
 =
 =
 =
 =
rR   r   )__doc__
__future__r   rm   ri   pathlibr   typingr   tools.base_toolr   r   r   r	   r
   r   r   r   r   r   rR   rG   <module>r      s     # " " " " "              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]
 ]
 ]
 ]
 ]
( ]
 ]
 ]
 ]
 ]
rR   