o
    ٷi)                     @   s4  d dl 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 dlZd'd	d
Zd(ddZdd Z						d)ddZ						d*dedee	jB de	jdedededefddZdde	jdddddfdeded ede	jdededed!ed"efd#d$Zd+d%d&Z dS ),    N)	Rectangle)Image)SAM2ImagePredictor)SAM2ImageOnnxPredictor)load_sam2_modelFTc           
         s   |rt jt jdt dggdd}nt g d}| jdd  \}}| t j} | ||d|ddd }|r\dd l  	|  j
 j\}}	 fd	d
|D } j||dddd}|| d S )N   333333?r   )axis)g?g?g      ?r      c                    s   g | ]
} j |d ddqS )g{Gz?T)epsilonclosed)approxPolyDP).0contourcv2 b/home/ubuntu/.local/lib/python3.10/site-packages/onnxruntime/transformers/models/sam2/sam2_demo.py
<listcomp>!   s    zshow_mask.<locals>.<listcomp>)r   r   r   g      ?   )	thickness)npconcatenaterandomarrayshapeastypeuint8reshaper   findContoursRETR_EXTERNALCHAIN_APPROX_NONEdrawContoursimshow)
maskaxrandom_colorborderscolorhw
mask_imagecontours_r   r   r   	show_mask   s   $r0   w  c              	   C   s|   | |dk }| |dk }|j |d d df |d d df dd|ddd |j |d d df |d d df dd|ddd d S )	Nr   r   green*whiteg      ?)r*   markers	edgecolor	linewidthred)scatter)coordslabelsr'   marker_size
pos_points
neg_pointsr   r   r   show_points&   s   &&
r@   c              
   C   sV   | d | d }}| d | d  | d | d  }}| t||f||dddd d S )Nr   r   r   r   r2   )r   r   r   r   )r7   	facecolorlw)	add_patchr   )boxr'   x0y0r,   r+   r   r   r   show_box1   s   ""rG   c	                 C   s   t t||ddD ]\}	\}
}tjdd t|  t|
t |d |d ur5|d us-J t||t  |d ur@t|t  t	|dkrVtj
d|	d  d|d	d
d td |r| d|	 d}tj|rpt| tj|dddd t|tr|| tjdd t  q	d S )NFstrict
   rK   figsize)r)   r   zMask z	, Score: z.3f   fontsizeoffr/   .pngpngtightr   )formatbbox_inches
pad_inches)block)	enumeratezippltfigurer%   r0   gcar@   rG   lentitler	   ospathexistsremovesavefig
isinstancelistappendshowclose)imagemasksscorespoint_coords
box_coordsinput_labelsr)   output_image_file_prefiximage_filesir&   scorefilenamer   r   r   
show_masks7   s,   
 




ru   sam2_hiera_largetorch CUDAExecutionProvidersam2_dirdevicedtypeimage_encoder_onnx_pathimage_decoder_onnx_pathimage_decoder_multi_onnx_pathproviderc	              	   C   s<   t | ||d}	|dkrt|	}
|
S t|	||||||d}
|
S )N)r{   rw   )r}   r~   r   r   r{   
onnx_dtype)r   r   r   )rz   r{   r|   
model_typeenginer}   r~   r   r   
sam2_model	predictorr   r   r   get_predictor\   s   	r   r   r   use_gpuenable_batchc	                 C   s  |rt j s	J dt v sJ d}	nd}	t |rdnd}
|r9|dkr9t jdjdkr9dt jjj	_
dt jj_
tjd	 td
}t|d}t| |
|||||||	d	}|| d| d}tddgg}tdg}|j||dd\}}}t|d d d }|| }|| }|| }g }t|||||d|d |d tddgddgg}tddg}|t|d d d d f }|j|||d d d d d f dd\}}}t||||||d |d tddgddgg}tddg}|t|d d d d f }|j|||d d d d d f dd\}}}t||||||d |d tg d}|jd d |d d d f dd\}}}t|||||d |d  tg d}td!d"gg}tdg}|j|||dd\}}}t|||||||d# |d$ |rtg d%g dg d&g d'g}|jd d |dd\}}}tjd(d) t| |D ]}t|dt dd* q|D ]
}t|t  qt d+ t!  t"|d,  |#|d,  |S )-Nry   CPUExecutionProvidercudacpurw   r      Tr   z	truck.jpgRGB)r   
sam2_demo_r/   i  r1   r   )rm   point_labelsmultimask_outputr   	multimask)rm   ro   r)   rp   rq   ie  iq  F)rm   r   
mask_inputr   multi_points)rm   ro   rp   rq   background_point)i  iX  i  ik  )rm   r   rD   r   rD   )rn   rp   rq   i?    box_and_point)rn   rm   ro   rp   rq   )K   i  i  iR  )i_  i&  ir  i   )i  i  ix  r   rJ   rL   )r(   rQ   zbatch_prompt.png)$rw   r   is_availableonnxruntimeget_available_providersr{   get_device_propertiesmajorbackendsmatmul
allow_tf32cudnnr   r   seedr   openr   convertr   	set_imagepredictargsortru   argmaxr[   r\   r%   r0   squeezer]   rG   r	   rh   rd   rg   )rz   r   r   r|   r}   r~   r   r   r   r   r{   rj   r   prefixinput_pointinput_labelrk   rl   logits
sorted_indrq   r   r/   	input_boxinput_boxesr&   rD   r   r   r   run_demow   s  





r   c           
      C   sR  t jdt| dd\}}tt| |ddD ]|\}\}}t|}t|}	|d|f | |d|f j|	dd	d	dd
d |d|f 
d |d|f |jd |jd   |d|f |	 |d|f j|	dd	d	dd
d |d|f 
d |d|f |	jd |	jd   qt   t jd| d	dddd t   d S )Nr   )g3333333@g%@)nrowsncolsrM   FrH   r   r   rx   rR   rK   rO   rQ   r   	sam2_demorS   rT   i  )rU   rV   dpi)r[   subplotsr^   rY   rZ   mpimgimreadr%   	set_titlereplacer	   
set_aspectr   tight_layoutrd   rh   )
left_imagesright_imagessuffixfigaxesrr   left_img_pathright_img_pathleft_img	right_imgr   r   r   show_all_images.  s   

&"&$r   )FT)r1   )NNNTNN)rv   rw   rx   rx   rx   ry   )rx   )!r`   matplotlib.imagerj   r   matplotlib.pyplotpyplotr[   numpyr   rw   matplotlib.patchesr   PILr   sam2.sam2_image_predictorr   sam2_image_onnx_predictorr   
sam2_utilsr   r   r0   r@   rG   ru   strr{   r|   r   float32boolr   r   r   r   r   r   <module>   s   



)	
	
 8