
    Z|h                     <    d dl Z d dlZd dlmZ d dlZ G d d      Zy)    N)YOLOc                   B    e Zd Zd Zd Zededefd       Zed        Z	y)
Proctoringc                     t        d      | _        | j                  j                  j                          t	        j
                  t        j                  j                  dd      | _        y)z
        Load face detection (YOLOv8) and landmark detection (face_alignment) models.
        Use case: Detect faces and estimate head pose in a given frame.
        z'services/proctor/models/yolov8n-face.ptFcpu)
flip_inputdeviceN)	r   faceDetectormodelfuseface_alignmentFaceAlignmentLandmarksTypeTWO_Dfa)selfs    :E:\xampp\htdocs\new-grp\engine\services\proctor\proctor.py__init__zProctoring.__init__   sQ    
 !!JK$$& ..((..
    c           
         |j                   dd \  }}| j                  j                  |dd      d   }d}d}d}|j                  D ]  }t	        t
        |j                  d   j                               \  }	}
}}d}|dz  }||
||	|f   }| j                  j                  |      }|d|d   }|t        j                  |	|
g      z  }t        j                  |d	   |d
   |d   |d   |d   |d   gt        j                        }t        j                  g dg dg dg dg dg dgt        j                        }|}t        j                  |d|dz  gd||dz  gg dgt        j                        }t        j                  d      }t        j                  ||||      \  }}}|r*t        j                   |      \  }}t        j"                  |d   dz  |d   dz  z         }|dk  r:t        j$                  |d    |d         }t        j$                  |d    |      }d}nRt        j$                  |d   |d         }t        j$                  |d    |      }t        j$                  |d   |d         }t'        t        j(                  |      d      t'        t        j(                  |      d      t'        t        j(                  |      d      d } n |||d!S )"z
        Analyze the frame to detect faces and compute head orientation.
        Returns:
            dict with keys: face_detected, people_count, head_pose (yaw, pitch, roll)
        Use case: Core vision engine for your proctoring system.
        N   i  F)sourceimgszverboser   T         $   -   0   6   )dtype)        r#   r#   )r#   gOg      ))gfffffE皙Y@@      :)gfffffE@r$   r%   )fffff<r&   皙8)gfffff<@r&   r'   )r   r   r   )   r   )r   r   )r   r   gư>)r   r   )r   r   )r   r   )r   r   )r   r   )yawpitchroll)face_detectedpeople_count	head_pose)shaper
   predictboxesmapintxyxytolistr   get_landmarks_from_imagenparrayfloat64zeroscv2solvePnP	Rodriguessqrtarctan2rounddegrees)r   framehwpredsfaceDetectedpeopleCountheadPoseboxx1y1x2y2faceCrop	landmarkslmimagePointsmodelPointsfocalLengthcameraMatrix
distCoeffssuccessrot_Rsyxyzs                                r   analyzeFramezProctoring.analyzeFrame   s    {{2A1!!))c5)QRST;;C chhqk&8&8&:;NBBL1KRUBrE\*H88BI 1B"((B8$$B ((212222$ ZZ!K ((#$#%$$ ZZ!K K88aQ'KQ'% ZZ	!L &)J!ll;\S]^OGS!}}S)1WWQtWaZ!D'1*459

AdG8QtW5A

AdG8R0AA

1T7AdG4A

AdG8R0A

1T7AdG4A !A2"2::a=!4!"**Q-3  D *'!
 	
r   emotionsreturnc                     | d   | d   z   | d   z   dz  }| d   | d   z   dz  }| d   }| d   }| d   }|||||d	}t        ||j                  
      S )Nfearangrydisgust   happyneutralr   sad)nervousrelaxedrf   rh   rb   )key)maxget)r_   ri   rj   rf   rh   rb   	composites          r   fuseEmotionszProctoring.fuseEmotionsh   s    F#hw&77(9:MMQRRG$x	'::a?!uo
	 9)--00r   c                 >   g }| dkD  r|j                  d       n| dk  r|j                  d       |dkD  r|j                  d       n|dk  r|j                  d       |d	kD  r|j                  d
       n|dk  r|j                  d       |rdj                  |      S dS )N   zlooking rightizlooking left   zlooking downr   z
looking up   zhead tilted rightizhead tilted leftz, zfacing forward)appendjoin)r)   r*   r+   orientations       r   describeHeadPosezProctoring.describeHeadPosey   s    8[''83Y**>:3;**>:RZ++L9"9k(()<=CZ++,>?)4tyy%J:JJr   N)
__name__
__module____qualname__r   r^   staticmethoddictstrro   rw    r   r   r   r      sF    
S
h 1t 1 1 1  K Kr   r   )r;   numpyr7   ultralyticsr   r   r   r~   r   r   <module>r      s    
   |K |Kr   