
    Wpf,                     F   d 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 ddl	Z	ddl
ZddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ d
ZdZ ej        g ddgddgddgddgddgddgddgddgddgddgddgddgddgddgdd gd!d gd"d#gd$d gd%d&gd'd(gd)d*gd+d,gdd&gd-d.gddgd/d0gd1d2gd3d4gd5d6gd7d8gd9d:gd;d<gd=d>g          Zd?Z ej        g g d@g dAg dAg dAg dBg dBg dBg dCg dDg dEg dFg dGg dHg dIg dJg dKg dLg dMg dNg dOg dPg dQg dRg dSg dTg dUg dVg dWg dXg dYg dZg d[g d\          Zd]Z G d^ d_ej                  Ze d`k    r ej!                     dS dS )az*Tests for mediapipe.python.solutions.pose.    N)
NamedTuple)absltest)parameterized)Image)drawing_styles)drawing_utils)posez#mediapipe/python/solutions/testdata   i  i  i  i  i  i  i  i  i  i  i  i  i&  i!  i?  i  iI  in  iC  iw  i<  i  i+  i3  i  i  i2  i  i7  i  i0  i  i9  i  i  id  i&  if  i  i  ie  i]  ic  i  ip  ik  iv  i  iy  i/  it  g?))\(zG333333ÿ)
ףp=
{Gzg{GzĿ)r   r   Q)g{Gz?gr   )gQr   g)gQ뱿=
ףp=r   )r   r   gQ)g
ףp=
?\(\߿r   )r         gQ)=
ףp=?Q޿r   )gzGڿr   {Gz)g{Gz?r   g(\ſ)g)\(RQgp=
ף)gffffff?r   RQȿ)gQg(\r   )
ףp=
?r   gq=
ףpͿ)gGzgHzGr   )gQ?r   r   )r   gp=
ףr   )g
ףp=
?g        {Gz)r   g       gQ?)r   gq=
ףp?r   )gQۿ皙?r   )gGz?g\(\?r   )r   gGz?r   )r   p=
ף?r   )r   gRQ?r   )g?g      ?r   )r   r   r   g333333?c                       e Zd Zd Zd Zd Zd Zdej        de	de
fdZde
fd	Z	 	 ddZ	 	 ddZd Z	 	 ddZd Zd Z ej        dddddd          d             Z ej        d          d             ZdS )PoseTestc                 ^    |\  }t          j        fd|j        D                       S )Nc                 J    g | ]}|j         z  |j        z  |j        z  f S  xyz).0lmkcolsrowss     d/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/mediapipe/python/solutions/pose_test.py
<listcomp>z5PoseTest._landmarks_list_to_array.<locals>.<listcomp>F   sB     : : : cedlCEDLA : : :    npasarraylandmark)selflandmark_listimage_shape_r(   r)   s       @@r*   _landmarks_list_to_arrayz!PoseTest._landmarks_list_to_arrayD   sQ    MD$: : : : : :"/"8: : : ; ; ;r,   c                 H    t          j        d |j        D                       S )Nc                 6    g | ]}|j         |j        |j        fS r!   r"   )r&   r'   s     r*   r+   z;PoseTest._world_landmarks_list_to_array.<locals>.<listcomp>J   s5     : : : suce, : : :r,   r-   )r1   r2   s     r*   _world_landmarks_list_to_arrayz'PoseTest._world_landmarks_list_to_arrayI   s5    : : :"/"8: : : ; ; ;r,   c                 Z    t          j        t          j        ||z
            |           d S N)nptassert_array_lessr.   abs)r1   array1array2	thresholds       r*   _assert_diff_lesszPoseTest._assert_diff_lessM   s)    "&&119=====r,   c                     t           j                            t          j                    |                                                     d          d         |z             S )N.)ospathjointempfile
gettempdiridsplit)r1   names     r*   _get_output_pathzPoseTest._get_output_pathP   s?    7<<+--twwyys/C/CB/G$/NOOOr,   frameresultsidxc                     t          j        ||j        t          j        t          j                               |                     d                    |                    }t          j
        ||           d S )N)landmark_drawing_specz_frame_{}.png)
mp_drawingdraw_landmarkspose_landmarksmp_posePOSE_CONNECTIONSr    get_default_pose_landmarks_stylerM   formatcv2imwrite)r1   rN   rO   rP   rF   s        r*   	_annotatezPoseTest._annotateS   sv     ,MOO	Q Q Q Q
   !7!7!<!<==DKer,   c                 H   |                      d                    |                    }|                     |                              |           |                      d                    |                    }|                     ||                              |           d S )Nz_segmentation_{}.pngz_segmentation_diff_{}.png)rM   rY   _segmentation_to_rgbsave_segmentation_diff_to_rgb)r1   segmentationexpected_segmentationrP   rF   s        r*   _annotate_segmentationzPoseTest._annotate_segmentation\   s      !7!>!>s!C!CDDDl++00666  !<!C!CC!H!HIID""|- --1T$ZZZZZr,      r   r   r   r   re   c                 H   t          j        |          }||k                        d          }||k                        d          }t          j        ||                                           t          j        |j        d d         t           j                  }d||<   |S )N   )axisdtype   )r.   arrayall
logical_orzerosshapeuint8)r1   img
back_colorfront_coloris_backis_frontsegms          r*   _rgb_to_segmentationzPoseTest._rgb_to_segmentationd   s    
(3--Cj %%1%--G{"''Q'//HM'8$$((***8CIbqbM222DDNKr,   c                     |j         \  }}t          j        ||dft          j                  }||d d d d f<   |||dk    <   t	          j        |          S )N   rj   rl   )rq   r.   rp   rr   r   	fromarray)r1   rx   rt   ru   heightwidthrs   s          r*   r^   zPoseTest._segmentation_to_rgbo   s\    JMFE
(FE1%RX
6
6
6CC111I C	N?3r,   c                    ||z  }||z  }||z  }t          j        t           j                  j        }|                                |                                |                                z   |                                z
  |z   z  }|S r:   )r.   finfofloat32epssum)r1   segm_expectedsegm_actualintersectionexpected_dot
actual_dotr   results           r*   _segmentation_iouzPoseTest._segmentation_iouw   s     ;.L =0L{*J
(2:


"C<#3#3#5#5#->>#3#3$4#/#3#3#5#5$68;$< =F Mr,   r   re   r   c                    |j         \  }}t          j        ||dft          j                  }||t          j        |dk    |dk              <   ||t          j        |dk    |dk              <   t          j        |          S )Nr{   rj   rl   r   )rq   r.   rp   rr   logical_andr   r|   )r1   r   r   expected_coloractual_colorr}   r~   rs   s           r*   r`   z"PoseTest._segmentation_diff_to_rgb   s}     "'MFE
(FE1%RX
6
6
6C@NC});!+;<<=@LC});!+;<<=?3r,   c           	      T   t          j                    5 }|                     t          d          5  |                    t          j        dt
          j                                      ddd                     d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nz0Input image must contain three channel rgb data.$   rj   r{      )	rV   PoseassertRaisesRegex
ValueErrorprocessr.   arangerr   reshape)r1   r	   s     r*   test_invalid_image_shapez!PoseTest.test_invalid_image_shape   s;   	 E4!!
HJ J E ERYr222::1aCCDDDE E E E E E E E E E E E E E EE E E E E E E E E E E E E E E E E Es5   BA	B9BB			BB		BB!$B!c                 b   t          j        d          5 }t          j        g dt          j                  }|                    d           |                    |          }|                     |j                   |                     |j	                   d d d            d S # 1 swxY w Y   d S )NT)enable_segmentation)d   r   r{   rj   re   )
rV   r   r.   rp   rr   fillr   assertIsNonerU   segmentation_mask)r1   r	   imagerO   s       r*   test_blank_imagezPoseTest.test_blank_image   s    	$	/	/	/ 34h}}}BH555ejjoooU##g
.///
12223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3s   BB$$B(+B()static_liteTr   r{   )static_fullTrl   r{   )static_heavyTrh   r{   )
video_liteFr   r{   )
video_fullFrl   r{   )video_heavyFrh   r{   c                    t           j                            t           j                            t                    d          }t           j                            t           j                            t                    d          }t          j        |          }|                     t          j	        |          
                    d                    }t          j        ||d          5 }t          |          D ]^}	|                    t          j        |t
          j                            }
|
j                                                            t(          j                  }|                     |                                |
|	           |                     |||	           |                     |                     |
j        |j                  d d d df         t:          t<                     |                     |                     |
j                   tB          tD                     | #                    | $                    ||          tJ                     `	 d d d            d S # 1 swxY w Y   d S )Nztestdata/pose.jpgztestdata/pose_segmentation.pngRGBT)static_image_modemodel_complexityr   rh   )&rE   rF   rG   dirname__file__rZ   imreadry   r   openconvertrV   r   ranger   cvtColorCOLOR_BGR2RGBr   roundastyper.   rr   r\   copyrc   rA   r5   rU   rq   EXPECTED_POSE_LANDMARKSDIFF_THRESHOLDr8   pose_world_landmarksEXPECTED_POSE_WORLD_LANDMARKSWORLD_DIFF_THRESHOLDassertGreaterEqualr   IOU_THRESHOLD)r1   r   r   
num_frames
image_pathexpected_segmentation_pathr   rb   r	   rP   rO   ra   s               r*   test_on_imagezPoseTest.test_on_image   sm    bgooh779LMMJ!#
!!#C"E "EJz""E 55
-..66u==? ? 
(9'7*.
0 
0 
0 37z""  #,,s|E33DEEFF06688??II 	uzz||Wc222##L2GMMM))'*@*/+7 778qq"1"u>#^	5 	5 	5 	//0LMM)+?	A 	A 	A 	""#8,GG	 	 	 	                 s   *E0I((I,/I,)fullrl   zpose_squats.full.npzc                    d}d}t           j                            t           j                            t                    d          }t           j                            t           j                            t                    d                    |                    }t          j        |          }g }g }	d}
t          j	        d|          5 }	 |
                                \  }}|snt          j        |t          j                  }|                    |	          }|                     |j        |j                  }|                     |j                  }|                    |           |	                    |           t          j        |t          j                  }|                     |||
           |
d
z  }
	 ddd           n# 1 swxY w Y   t-          j        |          }t-          j        |	          }|                     |          }t-          j        |||           |                     |                    dd                    }t7          |d          5 }t-          j        |d                                          t-          j        |d                                          d}|                    t?          j         |dd                     ddd           n# 1 swxY w Y   t-          j!        |          d         }|j        |j        k    s(J d                    |j        |j                              | "                    |dddf         |dddf         |           t-          j!        |          d         }|j        |j        k    s(J d                    |j        |j                              | "                    |||           dS )zTests pose models on a video.r
   r   ztestdata/pose_squats.mp4ztestdata/{}r   F)r   r   T)r   rl   N)predictionspredictions_worldz.npzz.jsonwr{   rh   ),z: )indent
separatorsr   z1Unexpected shape of predictions: {} instead of {}.)r@   r   z7Unexpected shape of world predictions: {} instead of {})#rE   rF   rG   r   r   rY   rZ   VideoCapturerV   r   readr   r   r   r5   rU   rq   r8   r   appendCOLOR_RGB2BGRr\   r.   rm   rM   savezreplacer   aroundtolistwritejsondumpsloadrA   )r1   r   expected_namediff_thresholdworld_diff_threshold
video_pathexpected_path	video_capactual_per_frameactual_world_per_frame	frame_idxr	   successinput_framer   rU   r   actualactual_worldnpz_path	json_pathfl	dump_dataexpectedexpected_worlds                            r*   test_on_videozPoseTest.test_on_video   s[   
 Nbgooh778: :JGLL!:!:!.!5!5m!D!DF FM  ,,II	'7
9 
9 
9 <@(~~// 	
 l;0ABBK0066v7L7B7HJ J#BB' )  ) 	///%%&:;;;l;0ABB{FI666Q	'               , X&''F8233L $$]33HHX6\JJJJ %%m&;&;FG&L&LMMI	i		 H61--4466!yq99@@BB i 	hhtz)A+FFFGGGH H H H H H H H H H H H H H H w}%%m4H<8>)));BBL(.	* 	* *)) 	sBQBw#rr'*n  F F F W]++,?@N!5555AHH 4	6 	6 655 	n0D  F F F F Fs&   C1G

GG"A:K((K,/K,N)rd   rf   )r   rd   )__name__
__module____qualname__r5   r8   rA   rM   r.   ndarrayr   intr\   rc   ry   r^   r   r`   r   r   r   named_parametersr   r   r!   r,   r*   r   r   B   s       ; ; ;
; ; ;> > >P P PRZ * 3    8"%8 8 8 8 2='2	 	 	 	 3>'2          0;-8       E E E3 3 3 "=!"="=">"="=">@ @ @ @< "=!)+ +DF DF+ +DF DF DFr,   r   __main__)"__doc__r   rE   rH   typingr   absl.testingr   r   rZ   numpyr.   numpy.testingtestingr;   PILr   mediapipe.python.solutionsr   r   rS   r	   rV   TEST_IMAGE_PATHr   rm   r   r   r   r   TestCaser   r   mainr!   r,   r*   <module>r      sp   1 0  				        ! ! ! ! ! ! & & & & & & 



                 6 5 5 5 5 5 B B B B B B 6 6 6 6 6 67""( 
$HS#J 
$Hc
 
$HS#J 
$H%(#J
$H14c

$H=@#J
$H%(#J
$H14c

$H=@#J
$H &)#J
$H 25c

$H >A#J
$H &)#J	
$H 25c
	
$H >A#J	
$H
 &)#J
$H
 25c

$H
 >A#J
$H &)#J
$H 25c

$H >A#J
$H &)#J
$H 25c

$H >A#J
$H &)#J
$H 25c

$H >A#J
$H &)#J
$H 25c

$H >A#J
$H &)#J
$H 25c

$H >A#J
$H 
I 
I    ( **000*2G2G2G**000*2G2G2G* * 0//* 2G1F1F* 	* 100	* 3G2F2F	*
 *
 /..*
 1E0D0D* * 0//* 2D1C1C* * 0//* 2G1F1F* * 0//* 2C1B1B* * ,++* .A-@-@* * .--* 0C/B/B* * ,++* .B-A-A* ! !  @F @F @F @F @F}% @F @F @FF z(-///// r,   