
    uki,                     P   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j2                  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j2                  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jB                          yy)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y)PoseTestc           	          |\  }}}t        j                  |j                  D cg c].  }|j                  |z  |j                  |z  |j
                  |z  f0 c}      S c c}w Nnpasarraylandmarkxyz)selflandmark_listimage_shaperowscols_lmks          _/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/mediapipe/python/solutions/pose_test.py_landmarks_list_to_arrayz!PoseTest._landmarks_list_to_arrayD   s^    MD$::"/"8"8: ceedlCEEDLA : ; ; :s   3Ac                     t        j                  |j                  D cg c]%  }|j                  |j                  |j
                  f' c}      S c c}w r    r!   )r(   r)   r.   s      r/   _world_landmarks_list_to_arrayz'PoseTest._world_landmarks_list_to_arrayI   sG    ::"/"8"8: suucee, : ; ; :s   *Ac                 \    t        j                  t        j                  ||z
        |       y r    )nptassert_array_lessr"   abs)r(   array1array2	thresholds       r/   _assert_diff_lesszPoseTest._assert_diff_lessM   s    "&&&19=    c                     t         j                  j                  t        j                         | j                         j                  d      d   |z         S )N.)ospathjointempfile
gettempdiridsplit)r(   names     r/   _get_output_pathzPoseTest._get_output_pathP   s9    77<<++-twwys/CB/G$/NOOr;   frameresultsidxc                     t        j                  ||j                  t        j                  t        j                                | j                  dj                  |            }t        j                  ||       y )N)landmark_drawing_specz_frame_{}.png)
mp_drawingdraw_landmarkspose_landmarksmp_posePOSE_CONNECTIONSr    get_default_pose_landmarks_stylerG   formatcv2imwrite)r(   rH   rI   rJ   r@   s        r/   	_annotatezPoseTest._annotateS   s]      ,MMO	Q
   !7!7!<=DKKer;   c                    | j                  dj                  |            }| j                  |      j                  |       | j                  dj                  |            }| j	                  ||      j                  |       y )Nz_segmentation_{}.pngz_segmentation_diff_{}.png)rG   rS   _segmentation_to_rgbsave_segmentation_diff_to_rgb)r(   segmentationexpected_segmentationrJ   r@   s        r/   _annotate_segmentationzPoseTest._annotate_segmentation\   so      !7!>!>s!CDDl+006  !<!C!CC!HID""|--1T$Zr;   c                 :   t        j                  |      }||k(  j                  d      }||k(  j                  d      }t        j                  ||      j                          t        j                  |j
                  d d t         j                        }d||<   |S )N   )axisdtype   )r"   arrayall
logical_orzerosshapeuint8)r(   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MM'8$((*88CIIbqM2DDNKr;   c                     |j                   \  }}t        j                  ||dft        j                        }||d d d d f<   |||dk(  <   t	        j
                  |      S )N   ra   rc   )rh   r"   rg   ri   r   	fromarray)r(   ro   rk   rl   heightwidthrj   s          r/   rX   zPoseTest._segmentation_to_rgbo   sS    JJMFE
((FE1%RXX
6CC1I C	N??3r;   c                 
   ||z  }||z  }||z  }t        j                  t         j                        j                  }|j	                         |j	                         |j	                         z   |j	                         z
  |z   z  }|S r    )r"   finfofloat32epssum)r(   segm_expectedsegm_actualintersectionexpected_dot
actual_dotry   results           r/   _segmentation_iouzPoseTest._segmentation_iouw   s     ;.L =0L{*J
((2::

"
"C<#3#3#5#->>#3$4#/#3#3#5$68;$< =F Mr;   c                    |j                   \  }}t        j                  ||dft        j                        }||t        j                  |dk(  |dk(        <   ||t        j                  |dk(  |dk(        <   t        j                  |      S )Nrr   ra   rc   r   )rh   r"   rg   ri   logical_andr   rs   )r(   r{   r|   expected_coloractual_colorrt   ru   rj   s           r/   rZ   z"PoseTest._segmentation_diff_to_rgb   s{     "''MFE
((FE1%RXX
6C@NC});!+;<=@LC});!+;<=??3r;   c           	      6   t        j                         5 }| j                  t        d      5  |j	                  t        j                  dt
        j                        j                  ddd             d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nz0Input image must contain three channel rgb data.$   ra   rr      )	rP   PoseassertRaisesRegex
ValueErrorprocessr"   arangeri   reshape)r(   r	   s     r/   test_invalid_image_shapez!PoseTest.test_invalid_image_shape   s    	 E4!!
HJ ERYYr2::1aCDEE EE EE Es#   BAB2BB	BBc                 X   t        j                  d      5 }t        j                  g dt        j                        }|j                  d       |j                  |      }| j                  |j                         | j                  |j                         d d d        y # 1 sw Y   y xY w)NT)enable_segmentation)d   r   rr   ra      )
rP   r   r"   rg   ri   fillr   assertIsNonerO   segmentation_mask)r(   r	   imagerI   s       r/   test_blank_imagezPoseTest.test_blank_image   sz    	$	/ 34hh}BHH5ejjoU#g
../
1123 3 3s   B B  B))static_liteTr   rr   )static_fullTrc   rr   )static_heavyTr_   rr   )
video_liteFr   rr   )
video_fullFrc   rr   )video_heavyFr_   rr   c                    t         j                  j                  t         j                  j                  t              d      }t         j                  j                  t         j                  j                  t              d      }t        j                  |      }| j                  t        j                  |      j                  d            }t        j                  ||d      5 }t        |      D ]C  }	|j                  t        j                  |t
        j                               }
|
j"                  j%                         j'                  t(        j*                        }| j-                  |j/                         |
|	       | j1                  |||	       | j3                  | j5                  |
j6                  |j8                        d d d df   t:        t<               | j3                  | j?                  |
j@                        tB        tD               | jG                  | jI                  ||      tJ               F 	 d d d        y # 1 sw Y   y xY w)Nztestdata/pose.jpgztestdata/pose_segmentation.pngRGBT)static_image_modemodel_complexityr   r_   )&r?   r@   rA   dirname__file__rT   imreadrp   r   openconvertrP   r   ranger   cvtColorCOLOR_BGR2RGBr   roundastyper"   ri   rV   copyr]   r:   r0   rO   rh   EXPECTED_POSE_LANDMARKSDIFF_THRESHOLDr2   pose_world_landmarksEXPECTED_POSE_WORLD_LANDMARKSWORLD_DIFF_THRESHOLDassertGreaterEqualr   IOU_THRESHOLD)r(   r   r   
num_frames
image_pathexpected_segmentation_pathr   r\   r	   rJ   rI   r[   s               r/   test_on_imagezPoseTest.test_on_image   s    bggooh79LMJ!#
!#C"EJJz"E 55

-.66u=? 
(9'7*.
0 37z" #,,s||E33D3DEF00668??I 	uzz|Wc2##L2GM))'*@*@*/++778"1"u>#^	5 	//0L0LM)+?	A 	""#8,G	  s   #EI  I	)fullrc   zpose_squats.full.npzc                    d}d}t         j                  j                  t         j                  j                  t              d      }t         j                  j                  t         j                  j                  t              dj                  |            }t        j                  |      }g }g }	d}
t        j                  d|      5 }	 |j                         \  }}|snt        j                  |t        j                        }|j                  |      }| j                  |j                  |j                         }| j#                  |j$                        }|j'                  |       |	j'                  |       t        j                  |t        j(                        }| j+                  |||
       |
d	z  }
	 d
d
d
       t-        j.                  |      }t-        j.                  |	      }| j1                  |      }t-        j2                  |||       | j1                  |j5                  dd            }t7        |d      5 }t-        j8                  |d      j;                         t-        j8                  |d      j;                         d}|j=                  t?        j@                  |dd             d
d
d
       t-        jB                  |      d   }|j                   |j                   k(  s+J dj                  |j                   |j                                | jE                  |dd
df   |dd
df   |       t-        jB                  |      d   }|j                   |j                   k(  s+J dj                  |j                   |j                                | jE                  |||       y
# 1 sw Y   xY w# 1 sw Y   xY w)zTests pose models on a video.r
   r   ztestdata/pose_squats.mp4ztestdata/{}r   F)r   r   )r   rc   N)predictionspredictions_worldz.npzz.jsonwrr   r_   ),z: )indent
separatorsr   z1Unexpected shape of predictions: {} instead of {}.)r9   r   z7Unexpected shape of world predictions: {} instead of {})#r?   r@   rA   r   r   rS   rT   VideoCapturerP   r   readr   r   r   r0   rO   rh   r2   r   appendCOLOR_RGB2BGRrV   r"   rd   rG   savezreplacer   aroundtolistwritejsondumpsloadr:   )r(   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   rO   r   actualactual_worldnpz_path	json_pathfl	dump_dataexpectedexpected_worlds                            r/   test_on_videozPoseTest.test_on_video   sS   
 Nbggooh78:JGGLL!:!.!5!5m!DFM   ,II	'7
9 <@(~~/
 ll;0A0ABK066v7L7L7B7H7HJ#BB'' ) 	/%%&:;ll;0A0AB{FI6Q	'  , XX&'F8823L $$]3HHHX6\J %%m&;&;FG&LMI	i	 H61-446!yyq9@@Bi 	hhtzz)A+FGH ww}%m4H<<8>>) +;BBLL(..	*+) 	sBQBw#rr'*n  F WW]+,?@N!5!55 7AHH 4 4	675 	n0D  Fg >H Hs   C.N'?A1N4'N14N>N)r   r   r   )r   r   r   ))r   r   r   r   )__name__
__module____qualname__r0   r2   r:   rG   r"   ndarrayr   intrV   r]   rp   rX   r   rZ   r   r   r   named_parametersr   r    r;   r/   r   r   B   s    ;
;>PRZZ * 3 8"%8 2='2	 3>'2  0;-8 E3 "=!!"="=">"="=">@@< "=!!)+DF+DFr;   r   __main__)"__doc__r   r?   rB   typingr   absl.testingr   r   rT   numpyr"   numpy.testingtestingr4   PILr   mediapipe.python.solutionsr   r   rM   r	   rP   TEST_IMAGE_PATHr   rd   r   r   r   r   TestCaser   r   mainr   r;   r/   <module>r      s   1  	   ! & 
    6 B 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    ( **0*2G**0*2G* * 0* 2G* 	* 1	* 3G	*
 *
 /*
 1E* * 0* 2D* * 0* 2G* * 0* 2C* * ,* .A* * .* 0C* * ,* .B* !  @F}%% @FF z(--/ r;   