o
    rqi$m                     @   s  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Z	d dl
m  mZ d dlmZ d dlmZ d dlmZ d dlmZ e ZG dd dZdd	 ZdLddZdd Zdd Zdd Zdd Zdd Z		dMddZ dd Z!dd Z"dd Z#d d! Z$d"d# Z%d$d% Z&d&d' Z'd(d) Z(d*d+ Z)d,d- Z*d.d/ Z+	dNd0d1Z,d2d3 Z-d4d5 Z.dOd7d8Z/dPd9d:Z0d;d< Z1d=d> Z2d?g d@fdAdBZ3dCdD Z4ddg dEdfdFdGZ5	H	IdQdJdKZ6dS )R    N)Image)
OutputKeys)
load_image)loggerc                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )InputPadderz5 Pads images such that dimensions are divisible by 8 sintelc                 C   s   |dd  \| _ | _| j d d d | j  d }| jd d d | j d }|dkr?|d ||d  |d ||d  g| _d S |d ||d  d|g| _d S )N      r      r   )htwd_pad)selfdimsmodeZpad_htZpad_wd r   f/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/modelscope/utils/cv/image_utils.py__init__   s   

zInputPadder.__init__c                    s    fdd|D S )Nc                    s   g | ]}t j| jd dqS )Z	replicate)r   )Fpadr   ).0xr   r   r   
<listcomp>$   s    z#InputPadder.pad.<locals>.<listcomp>r   )r   Zinputsr   r   r   r   #   s   zInputPadder.padc                 C   sd   |j dd  \}}| jd || jd  | jd || jd  g}|d|d |d |d |d f S )Nr   r      r   r
   .)shaper   )r   r   r   r   cr   r   r   unpad&   s   ,&zInputPadder.unpadN)r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s
    
r   c                 C   sB   | |    |  |    d  } | d tj} t| tj} | S )zto convert a np.array with shape(h, w) to cv2 img

    Args:
        img_array (np.array): input data

    Returns:
        cv2 img
    h㈵>   )minmaxastypenpuint8cv2ZapplyColorMapZCOLORMAP_JET)Z	img_arrayr   r   r   numpy_to_cv2img,   s   
	r+   皙?c              
   C   sr  g d}g d}g d}g d}g d}g d}	|j d dkr&|}
|}|}n|j d d	kr3|}
|}|	}tt|
D ]U}|
| }||krDq9|| |k sP|d
 |k rQq9||v r\||v r\d}n||v rg||v rgd}nd}t| t||df t||d
f ft|| d t||d
f f|d q9t|j d D ] }|| |k rqt| t||df t||d
f fddd qd S )N)r   r   r   r
   r   r   r            r	   r-   r.               )r
   r   r-   r/   	   r0   r2      )r      r.   r	   
   r1   r3      )r   r   r
   r   r   r
   r-   r.   r3   r	   r4   r3   r0   r1   r
   )r   r   r6   r	   r4   r7   )r-   r.   r/   r0   r1   r2   r      r5   r
   r   r$   r   r$   r   r   r   r$   r$   r   r-   r   r   r$   )r   rangelenr*   lineintcircle)imageZnp_kpsscore	thresholdZlst_parent_ids_17Zlst_left_ids_17Zlst_right_ids_17Zlst_parent_ids_15Zlst_left_ids_15Zlst_right_ids_15Zlst_parent_idsZlst_left_idsZlst_right_idsipidcolorr   r   r   draw_joints<   sF   $"&rJ   c                 C   s>   t | t|d t|d ft|d t|d fdd d S )Nr   r
   r   r   r=   )r*   	rectanglerB   )rD   boxr   r   r   draw_boxh   s   rM   c                 C   s8   |D ]}t | |d |d f|d |d fdd q| S )Nr   r
   r   r   r;   )r*   rK   )rD   bboxesbboxr   r   r   "realtime_object_detection_bbox_vism   s
   "rP   c           	   
   C   s   t | t|d t|d ft|d t|d fdd g d}tjddtjddtjddf}t|d d t|d d	 f}t|D ]!\}}|| | }t | | |d |d |d	  ft jd
|d qId S )Nr   r
   r   r   r=   )zgender      : zage         : zorient      : zhat         : zglass       : zhand_bag    : zshoulder_bag: zback_pack   : zupper_wear  : zlower_wear  : zupper_color : zlower_color : r$   r-            ?)	r*   rK   rB   r(   randomrandint	enumerateputTextFONT_HERSHEY_SIMPLEX)	rD   rL   labelstitleZclrpointidxZlbszr   r   r   draw_attributet   s     
r]   c                 C   s   t | tj }t | tj }t | tj }t|t|kr(t|t|ks*J t|d}t	t|D ]}t
|t ||  t|t || t ||  q6|S Nr>   )r(   arrayr   	KEYPOINTSSCORESBOXESr@   r*   imreadr?   rM   rJ   )outputoriginal_imageZposesscoresboxesrD   rG   r   r   r   draw_keypoints   s   $"rh   c                 C   sp   t | tj }t | tj }t|t|ksJ t|d}tt|D ]}t	|t || ||  q&|S r^   )
r(   r_   r   LABELSrb   r@   r*   rc   r?   r]   )rd   re   rX   rg   rD   rG   r   r   r   draw_pedestrian_attribute   s   rj         @c                    s  g d}g d}g d}g d}g d}	g d}
g d}g d}g d	}t | }tt|D ]}t|t||  q/t j|d   d
} fdd}tt|D ]}|| }|||| |||| |||| |||| ||	|| ||
|| |||| |||| |||| t|}t|D ]>}t|| d }t|| d }t 	|t
|t|  t|  ft jddd t |t|  t|  fddt j qqQ|d urt || |S )N)!r   r
   r   r   r6   r-   r.   r/   r	   r4   r7   r0   r1   r2   r3   r5   r8   r9         rQ                                        )
!   "   #   $   %   &   '   (   )   rz   )
*   +   ,   -   .   /   0   1   2   r   )	B   C   D   E   F   G   H   I   r   )	K   L   M   N   O   P   Q   R   r   )3   4   5   6   )7   8   9   :   ;   <   =   >   ?   @   A   )T   U   V   W   X   Y   Z   [   \   ]   ^   _   r   )	`   a   b   c   d   e   f   g   r   )ZdsizeZfxfyc                    s   t t| d D ]>}| | }| |d  }t|| d   t|| d   f}t|| d   t|| d   f}tj|||ddd qd S )Nr
   r   r=   r   )	thickness)r?   r@   rB   r*   rA   )Zpoint_indexrD   rZ   rG   Z	cur_indexZ
next_indexZcur_ptZnext_ptscaler   r   	draw_line   s   z)draw_106face_keypoints.<locals>.draw_liner   r
   rR   r:   r   )r*   rc   r?   r@   rM   r(   r_   resizerB   rV   strrW   rC   ZFILLEDimwrite)Zin_pathZ	keypointsrg   r   	save_pathZface_contour_point_indexZleft_eye_brow_point_indexZright_eye_brow_point_indexZleft_eye_point_indexZright_eye_point_indexZnose_bridge_point_indexZnose_contour_point_indexZmouth_outer_point_indexZmouth_inter_point_indeximgrG   rD   r   Zpointssizer   yr   r   r   draw_106face_keypoints   sN   

"
 r   c                 C   s   t |tj }t |tj }t| }|d us J d|  tt|D ]2}|| 	t j
}|\}}}	}
|| }t|||f|	|
fdd tj||d||
fdddddd	 q&td
t| d |S )NCan't read img: r;   r   .2fr
         ?r:   r	   r   ZlineTypeFound  faces)r(   r_   r   rb   ra   r*   rc   r?   r@   r'   int32rK   rV   print)img_pathdetection_resultrN   rf   r   rG   rO   x1y1x2y2rE   r   r   r    draw_face_detection_no_lm_result   s&   
r   c              
   C   st   |t j }|t j }|t| }t| }|d us!J d|  tj|d|ddddddd t	d| |S )	Nr   zfacial expression: {}r7   r7   r
   r   r:   r	   r   )
r   ra   ri   r(   argmaxr*   rc   rV   formatr   )r   Zfacial_expression_resultrf   rX   labelr   r   r   r   draw_facial_expression_result   s   



r   c              
   C   s   |t j }|t j }|d t|d  }|d t|d  }t| }|d us0J d|  tj|d|ddddddd	 tj|d
|ddddddd	 t	
d| t	
d
| |S )Nr   r
   r   zface gender: {}r   r   r:   r	   r   zface age interval: {})r7   r   r;   )r   ra   ri   r(   r   r*   rc   rV   r   r   info)r   Zface_attribute_resultrf   rX   Zlabel_genderZ	label_ager   r   r   r   draw_face_attribute_result  s2   




r   c                 C   s  t |tj }t |tj }t |tj }t| }|d us(J d|  tt	|D ]N}|| 
t j}|| dd
t j}|| }	|\}
}}}t||
|f||fdd |D ]}t|t|ddd q]tj||	d|
|fddd	dd
d q.tdt	| d |S )Nr   r>   r   r;   r
   r=   r   r   r:   r	   r   r   r   )r(   r_   r   rb   r`   ra   r*   rc   r?   r@   r'   r   reshaperK   rC   tuplerV   r   )r   r   rN   kpssrf   r   rG   rO   kpsrE   r   r   r   r   kpr   r   r   draw_face_detection_result  s.   
r   c                 C   s  dd }t |tj }t |tj }t |tj }g }g d}t| }||g7 }|d us7J d|  tt	|D ]}	||	 
t j}
||	 dd
t j}|d d |d d  d |d d	 |d d	  d  }|d d |d	 d  d |d d	 |d	 d	  d  }||krd
nd}||||}||g7 }||	 }|
\}}}}t|||f||fdd t|D ]\}}tj|t|d	|| dd qtj||d||fd	ddd	dd q=|S )Nc           
      S   s   d}|dkr|}t || }n|}t || }t|d |d |d |d g}td|d gddg|d dg|d |d gg}t||}t| |||f}	|	S )Ni  r
   r   r   r   )rB   r(   Zfloat32r*   ZgetPerspectiveTransformZwarpPerspective)
Zsrc_imgr   ratioZ
short_sizeZobj_hZobj_wZ	input_ptsZ
output_ptsMZobj_imgr   r   r   warp_img:  s   "z,draw_card_detection_result.<locals>.warp_img)r;   r:   r=   r<   r   r>   r   r   r   r
   gq=
ףp?gɝ3 ?r;   r6   r7   rI   r   r   r   r:   r	   r   )r(   r_   r   rb   r`   ra   r*   rc   r?   r@   r'   r   r   rK   rU   rC   r   rV   )r   r   r   rN   r   rf   Zimg_listZver_colr   rG   rO   r   _w_hr   Zcard_imgrE   r   r   r   r   kr   r   r   r   draw_card_detection_result8  s>   

88
r   c                 C   sZ   t | }tt|tj}t|t|d t|d ft|d t|d fdd |S )Nr   r
   r   r   r:   )r   r*   cvtColorr(   ZasarrayCOLOR_RGB2BGRrK   rB   )Zimage_inrL   rD   r   r   r   r   created_boxed_imageh  s   2r   c                 C   s   t | }tt|D ]R}|| }| \}}|du r t| d|dkrC|jd |jd f}t dddd}	t ||	|	t j
|d	}
t ||d |d f|d
 |d fdd |
| q|
j |  d S )NF( can not be correctly decoded by OpenCV.r   r
   r   JPGTr   r   r:   r-   )r*   VideoCapturer?   r@   read	Exceptionr   VideoWriter_fourccVideoWritergetCAP_PROP_FPSrK   writerelease)video_in_pathrN   video_save_pathcaprG   rL   successframer   fourccvideo_writerr   r   r   show_video_tracking_resultp  s*   
$r  c                 C   sF  g dg dg dg dg dg dg dg dd	}d
dl m } d
d l}t| }|t|d}|d| tt|D ]}	||	 t	}
||	 }|
 \}}|du r\t| d|	d
kr|jd |jd
 f}tdddd}t|||tj|d}d}d}d}|j\}}}t|jtj}t|
|D ][\}}t||d
 |d f|d |d f|| d tj|||d
 |d t	||  ftjt||| |t||| || d tj||d
 |d f|d |d f|| dd}qt|d|dd
}|| |d q@W d    n	1 sw   Y  |j |  d S )N)   r   r   )r  r  r   )r   r   r   )r   r  r  )r   r  r   )   r  r   )r   r   r  )r	  r   r  )Zpersonbicyclecar
motorcyclebustruckztraffic lightz	stop signr   )tqdm)totalzWriting results to video: {}Fr   r
   r   r   r   r   TgMbP?{Gz?r   r   )ZfontFaceZ	fontScaler   rI   r>   r   r   g?)r  mathr*   r   r@   set_descriptionr   r?   r'   rB   r   r   r   r   r   r   r   r(   zerosr)   ziprK   rV   ZFONT_HERSHEY_TRIPLEXr%   ceilZaddWeightedr   updater   )r   Zbboxes_listZlabels_listr  ZPALETTEr  r  r  ZpbarrG   rN   rX   r  r  r   r  r  Z
FONT_SCALEZTHICKNESS_SCALEZTEXT_Y_OFFSET_SCALEHW_Z
zeros_maskrO   lr   r   r   "show_video_object_detection_result  sx   

"
(r  c           	      C   s   t | d jd | d jd dg}ddlm} |dd}ddlm} tg d}t| D ](\}}|| }t	||v rE||}t	||v s;|
t	| |t}|||< q-|S )	Nr   r
   r   get_palettecoco   )_get_bias_color)r   r   r   )r(   r  r    mmdet.core.visualization.paletter  Zmmdet.core.visualization.imager!  setrU   r   addr'   bool)	masksdraw_imgr  mask_paletter!  Ztaken_colorsrG   mask
color_maskr   r   r   panoptic_seg_masks_to_image  s   $


r+  c                 C   sj   ddl m} |dd}t| d jd | d jd dg}t| D ]\}}|| }|t}|||< q!|S )Nr   r  r  r   r
   r   )r"  r  r(   r  r   rU   r'   r%  )r&  r  r(  r'  rG   r)  r*  r   r   r   semantic_seg_masks_to_image  s   
$

r,  c                 C   s   |t j }t| }tt|D ]A}|| }| \}}|du r%t| d|dkrH|jd |jd f}	t	dddd}
t
||
|tj|	d	}|dkrQ|| q|  |  d S )
NFr   r   r
   r   r   r   r   T)r   ZOUTPUTr*   r   r?   r@   r   r   r   r   r   r   r   r   r   )r   resultr  Zframe_indexesr  rG   r[   r  r  r   r  r  r   r   r   show_video_summarization_result  s*   


r.  c           
      C   s  |t j }|t j }|t j }t| }|d usJ d|  t|||D ]R\}}}	t|t|	d t|	d ft|	d t|	d fdd tj	||dt|	d t|	d fddd	dd
d tj	||t|	d t|	d fddd	dd
d q%|d urt
|| |S )Nr   r   r
   r   r   r=   r   r   r:   r	   r   )r   ra   ri   rb   r*   rc   r  rK   rB   rV   r   )
r   r   r   rf   rX   rN   r   rE   r   rL   r   r   r   'show_image_object_detection_auto_result  s8   



r/  c                 C   sV   t d}||  |  |   d tjd d d d d df }t|tj}|S )NZplasma   r   )	pltZget_cmapr&   r'   r(   r)   r*   r   r   )depthZcolormapZdepth_colorr   r   r   depth_to_color  s   
r3  c            	      C   s  d} d}d}d}d}d}| | | | | | }t |df}d}d|d| df< t dt d|  |  |d| d	f< ||  }dt dt d| |  |||| df< d|||| d	f< || }d|||| d	f< t dt d| | |||| d
f< || }dt dt | |  |||| d	f< d|||| d
f< || }d|||| d
f< t dt d| | |||| df< || }dt dt | |  |||| d
f< d|||| df< |S )a  
    Generates a color wheel for optical flow visualization as presented in:
        Baker et al. "A Database and Evaluation Methodology for Optical Flow" (ICCV, 2007)
        URL: http://vision.middlebury.edu/flow/flowEval-iccv07.pdf

    Code follows the original C++ source code of Daniel Scharstein.
    Code follows the the Matlab source code of Deqing Sun.

    Returns:
        np.ndarray: Color wheel
    r5   r.   r6   r0   r2   r   r   r$   r
   r   )r(   r  floorZarange)	ZRYZYGZGCZCBZBMZMRncols
colorwheelcolr   r   r   make_colorwheel  s6   &.*,*,r8  Fc                 C   s^  t | jd | jd dft j}t }|jd }t t | t | }t | |  t j }|d d |d  }t 	|
t j}	|	d }
d|
|
|k< ||	 }t|jd D ]T}|dd|f }||	 d }||
 d }d| | ||  }|dk}d|| d||    ||< ||  d || < |rd| n|}t 	d| |dddd|f< qX|S )	a  
    Applies the flow color wheel to (possibly clipped) flow components u and v.

    According to the C++ source code of Daniel Scharstein
    According to the Matlab source code of Deqing Sun

    Args:
        u (np.ndarray): Input horizontal flow of shape [H,W]
        v (np.ndarray): Input vertical flow of shape [H,W]
        convert_to_bgr (bool, optional): Convert output image to BGR. Defaults to False.

    Returns:
        np.ndarray: Flow visualization image of shape [H,W,3]
    r   r
   r   r   Ng     o@g      ?r$   )r(   r  r   r)   r8  sqrtsquareZarctan2pir4  r'   r   r?   )uvconvert_to_bgrZ
flow_imager6  r5  radaZfkZk0Zk1frG   tmpZcol0Zcol1r7  r[   Zch_idxr   r   r   flow_uv_to_colorsP  s*    
"rC  c                 C   s   | j dks	J d| jd dksJ d|durt| d|} | dddddf }| dddddf }tt|t| }t|}d}|||  }|||  }t|||S )	ay  
    Expects a two dimensional flow image of shape.

    Args:
        flow_uv (np.ndarray): Flow UV image of shape [H,W,2]
        clip_flow (float, optional): Clip maximum of flow values. Defaults to None.
        convert_to_bgr (bool, optional): Convert output image to BGR. Defaults to False.

    Returns:
        np.ndarray: Flow visualization image of shape [H,W,3]
    r   z%input flow must have three dimensionsr   z"input flow must have shape [H,W,2]Nr   r
   r#   )ndimr   r(   Zclipr9  r:  r&   rC  )Zflow_uvZ	clip_flowr>  r<  r=  r?  Zrad_maxepsilonr   r   r   flow_to_imagew  s   
rF  c                 C   s&   | d  ddd  } t| }|S )Nr   r
   r   )ZpermutecpunumpyrF  )ZflowZ
flow_colorr   r   r   flow_to_color  s   rI  c                 C   sd   | d j \}}}t|tjd d||f}t| D ]\}}|t|tj	tj
 q|  d S )Nr   ZMP4Vrr   )r   r*   r   r   rU   r   r   r'   r(   r)   r   r   )Zdepthsr  heightwidthZlayersoutrG   r   r   r   r   "show_video_depth_estimation_result  s   rM  z
result.jpg)r
   r
   r
   c              	   C   s>  | tj}|d r6|D ])}t|d t|d ft|d t|d f}}tj| ||g ddtjd q| tj}tj	|d j
d |d j
d dftjd}	|d r_g d|	|d dk< |d rmg d	|	|d dk< |	}
t|
d}|dk}| | d
 |
| d
  | |< |d urt|| d d d d d d df  | S )Nr   r
   r   r   )r$   r$   r   r   )Zdtyper:   r;   rR   r>   )r   r   rb   rB   r*   rK   ZLINE_AAZMASKSr(   r  r   r)   meanr   )r   resultsout_fileZif_drawrN   r   c1c2r-  Z
color_areaZ	color_segr*  Zmsk_idxr   r   r   $show_image_driving_perception_result  s,   2 $rS  c                 C   s>   g }t | jd D ]}t| | }|| || q	|S )Nr   )r?   r   r   Z	fromarrayZ
putpaletteappend)r&  paletteZ	vis_masksrA  Zimg_Er   r   r   masks_visualization  s   
rV  r   c
              
      s  |j d |j d ksJ d|j d  d|j d  tjddd|d\}
|
d j| dd	 |
d j|dd	 tdD ]#}|
|  g  |
|  g  |
| j	 D ]}|
d
 qVq;tjdd |d ur|d usoJ |
d j|d d df |d d df ddd |
d j|d d df |d d df ddd |j d dkr|j d dkrj  j }||
d j|||
d j| fddtt|D _|
d j|d d df |d d df  dd |
d j|d d df |d d df  dd | d dd df  dkrdnd}jddd|jd jddd|d |	rFtjt|	ddd t  d S S )Nr   zmkpts0: z v.s. mkpts1: r
   r   )r7   r.   )Zfigsizedpigray)ZcmapF)r   w)r   sc              	      sP   g | ]$}t jj|d f |d f f|df |df fj | ddqS )r   r
   )	transformr   Z	linewidth)
matplotliblinesZLine2DtransFigure)r   rG   rI   figZfkpts0Zfkpts1r   r   r     s    z(make_matching_figure.<locals>.<listcomp>r6   r      r   r  gGz?
r5   topleft)r[  ZfontsizevaZharI   tight)bbox_inchesZ
pad_inches)r   r1  ZsubplotsZimshowr?   Z	get_yaxisZ	set_ticksZ	get_xaxisZspinesvaluesZset_visibleZtight_layoutZscatterZcanvasZdrawr^  invertedr[  Z	transDatar@   r]  rN  textjoinaxesZ	transAxessavefigr   close)img0img1Zmkpts0Zmkpts1rI   kpts0kpts1rj  rW  pathrl  rG   Zspiner^  Z	txt_colorr   r_  r   make_matching_figure  sX   .. 


..&
rt  quadtree_match.pngQuadTreeAttentionc                 C   sx   t dt| d tt| }tt|}t|}	|dt|g}
t|||||	|
d}|j	t|ddd d S )Nr   z matcheszMatches: {})rj  i,  rf  )rW  rg  )
r   r@   r*   rc   r   cmZjetr   rt  rm  )Z	img_name0Z	img_name1rq  rr  confZoutput_filenamemethodro  rp  rI   rj  r`  r   r   r   match_pair_visualization  s   
rz  )r,   )rk   N)N)F)NF)ru  rv  )7osr*   r\  Zmatplotlib.cmrw  Zmatplotlib.pyplotZpyplotr1  rH  r(   Ztorch.nn.functionalnnZ
functionalr   ZPILr   Zmodelscope.outputsr   Zmodelscope.preprocessors.imager   Zmodelscope.utilsr   loggingZ
get_loggerr   r+   rJ   rM   rP   r]   rh   rj   r   r   r   r   r   r   r   r  r  r+  r,  r.  r/  r3  r8  rC  rF  rI  rM  rS  rV  rt  rz  r   r   r   r   <module>   sn   
,
A0<
 
2
'

F