o
    Ďi _                      @   s.  d Z ddl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	Z
ddlZddlmZ ee Zejd ZeeejvrFejee eejee 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"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZA ddlBmCZC ddlDmEZEmFZFmGZG dd ZHdd ZId)ddZJeG dddddddddddddddddddd dd!dddedd!ddde  fd"d#ZKd$d% ZLd&d' ZMeNd(kreMeL  dS dS )*a  
Validate a trained YOLOv5 segment model on a segment dataset

Usage:
    $ bash data/scripts/get_coco.sh --val --segments  # download COCO-segments val split (1G, 5000 images)
    $ yolov5 segment val --weights yolov5s-seg.pt --data coco.yaml --img 640  # validate COCO-segments

Usage - formats:
    $ yolov5 segment val --weights yolov5s-seg.pt                 # PyTorch
                                      yolov5s-seg.torchscript        # TorchScript
                                      yolov5s-seg.onnx               # ONNX Runtime or OpenCV DNN with --dnn
                                      yolov5s-seg_openvino_label     # OpenVINO
                                      yolov5s-seg.engine             # TensorRT
                                      yolov5s-seg.mlmodel            # CoreML (macOS-only)
                                      yolov5s-seg_saved_model        # TensorFlow SavedModel
                                      yolov5s-seg.pb                 # TensorFlow GraphDef
                                      yolov5s-seg.tflite             # TensorFlow Lite
                                      yolov5s-seg_edgetpu.tflite     # TensorFlow Edge TPU
                                      yolov5s-seg_paddle_model       # PaddlePaddle
    N)
ThreadPool)Path)tqdm   )DetectMultiBackend)SegmentationModel)	Callbacks)LOGGERNUM_THREADSTQDM_BAR_FORMATProfilecheck_datasetcheck_img_sizecheck_requirements
check_yamlcoco80_to_coco91_classcolorstrincrement_pathnon_max_suppression
print_argsscale_boxes	xywh2xyxy	xyxy2xywh)ConfusionMatrixbox_iou)output_to_targetplot_val_study)create_dataloader)mask_iouprocess_maskprocess_mask_nativescale_image)Metricsap_per_class_box_and_mask)plot_images_and_masks)de_parallelselect_devicesmart_inference_modec              	   C   s   t |g d }|  D ]L^ }}}tt |dd| d }|r/|g||R n|g|R }	t|d}
|
dt|	  |	 d  W d    n1 sTw   Y  qd S )N)r   r   r   r   r      az%g 
)	torchtensortolistr   viewopenwritelenrstrip)predn	save_confshapefilegnxyxyconfclsxywhlinef r?   N/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/segment/val.pysave_one_txt9   s   $  rA   c              	      s  ddl m   fdd}|j rt|jn|j}t| d d d df }|d d d df  |d d dd f d 8  < t|d}tt	}|
||}	W d    n1 sXw   Y  tt|  | D ]#\}
\}}|||t|d  d	d
 |D t|d d|	|
 d qhd S )Nr   encodec                    s@    t j| d d d d d f dddd }|d d|d< |S )NFuint8)orderdtyper   countszutf-8)npasarraydecode)xrlerB   r?   r@   single_encodeG   s   *z$save_one_json.<locals>.single_encoder(      )rO   r   r      c                 S   s   g | ]}t |d qS )   )round.0rL   r?   r?   r@   
<listcomp>V   s    z!save_one_json.<locals>.<listcomp>)image_idcategory_idbboxscoresegmentation)pycocotools.maskrC   stem	isnumericintr   rI   	transposer   r
   map	enumeratezipr.   appendrR   )r4   jdictpath	class_map
pred_masksrN   rV   boxpoolrlesipbr?   rB   r@   save_one_jsonC   s$   0
"
rn   Fc                 C   sN  |r`|r't |}tj||jd|ddd }||dd}t||kdd}|jdd |jdd krLtj	|d |jdd dddd	 }|
d
}t||jd	 d||jd	 d}	nt|ddddf | ddddf }	t| jd	 |jd	 ft}
|ddd	df | dddf k}tt |D ]}t|	|| k|@ }|d	 jd	 rtt|d|	|d	 |d f dddf fd  }|d	 jd	 dkr||dddf  ddd  }|tj|dddf ddd  }|tj|ddd	f ddd  }d|
|dddf t|f< qtj|
tj|jdS )z
    Return correct prediction matrix
    Arguments:
        detections (array[N, 6]), x1, y1, x2, y2, conf, class
        labels (array[M, 5]), class, x1, y1, x2, y2
    Returns:
        correct (array[N, 10]), for 10 IoU levels
    devicer   g      ?        NbilinearF)modealign_cornersr         ?r)   r(   rP   rO   T)return_indexrG   rp   )r2   r,   arangerp   r/   repeatwherer6   rD   interpolategt_r   r   rI   zerosastypeboolrangecatstackcpunumpyargsortuniquer^   r-   )
detectionslabelsiouvrg   gt_masksoverlapmasksnlindexioucorrectcorrect_classrk   rL   matchesr?   r?   r@   process_batch[   s0   	$
(* $<"""r   MbP?333333?,  val    runs/val-segexpTc            o         s2  |r
t dg t} nt} |d u r|d u rd}n|d ur|}|d u r(|d u r(d}n|d ur.|}|d u}!|!r]t| jdddf\}
}"}#}$||
jdkM }|rP| n|  t	|j
d j}%nlt|
|d}
tt|| |d	}|rs|d
 n|jddd t||
|| |d}|j|j|j|jf\}&}"}#}$t||&d}|j}t|trt	|j
j
d jnd}%|$r|j}n|j}
|"s|#sd}td| d| d t| } |  |
jdk}'t| dto| d  dt!j" d}(|rdnt#| d })t$j%ddd|
d}*|*& }+|!sY|"r|s|j
j'},|,|)ksJ | d|, d|) d|j(|"r#dn|d||fd |	dkr2d nd|"f\}-}.|	d!v r?|	nd}	t)| |	 |||&||-|.|t*|	 d"||d#d$ }d$ t+|)d%}/t,|d&ri|j-n|j.j-}0t|0t/t0fr{t1t2|0}0|(rt3 nt/t4d'}1d(d) }2t5 t5 t5 f}3t6 }4t$j7d*|
d}5g g }6}7t8||2t9d+}8t2|8D ]\}9\}:};}<}=|3d$ 6 |'r|:j:|
dd,}::|
|=:|
}=|= }=|r|: n|: }:|:d- }:|:j;\}>}?}@}AW d    n	1 sw   Y  |3d ! |r||:ng ||:|d.d d/ d R \}B}C}DW d    n	1 s#w   Y  |r7|5||D|Cf|=d 7 }5d d d/d f  t$j<|A|@|A|@f|
d9  < |r\fd0d1t4|>D ng }E|3d/  t=|B|||Ed|||%d2}BW d    n	1 szw   Y  g }Ft2t>|B|CD ]\}G\}H}Id d d$f |Gkdd f }J|Jj;d$ |Hj;d$ }K}Lt|;|G |<|G d$ }M}Nt$j7|L|+t$j?|
d3}Ot$j7|L|+t$j?|
d3}P d7  |Ld$kr |Kr|7@|O|Pgt$j7d4|
d|Jd d d$f R  |r|/jAd |Jd d d$f d5 q|r|Ggn	d d d$f |Gk}Q|=|Q }R| |I|Hd d d6d f |Hd d d d*f |:|G j;dd  d7}S|r>d$|Hd d d8f< |HB }TtC|:|G j;dd  |Td d d d*f |N|<|G d  |KrtD|Jd d dd8f }UtC|:|G j;dd  |U|N|<|G d  t$E|Jd d d$df |Ufd}VtA|T|V|*}PtA|T|V|*|S|R|dd9}O|r|/A|T|V |7@|O|P|Hd d d*f |Hd d d8f |Jd d d$f f t$jF|St$jGd:}S|r|9dk r|F@|Sd d;  |rtH|T||N|d
 |MjI d< d= |rtJ|:|G j;dd  |SKdd/d$L M N |N|<|G d }StO|T|6|M|1|S q|rO|9dk rOtP|Fr-t$jE|Fd$d>}FtQ|:|=|;|d?|9 d@ |0 tQ|:tR|Bd;dA|F|;|d?|9 dB |0 qdCd1 t>|7 D }7tP|7rt|7d$ S rttT|7|||0dD}W|4U|W tVjW|7d* Xt#|)dE}XdF}Yt|YdG |XY g|4Z R   |XY d$krt[dH|	 dI |s|)dJk r|!s|)dkrtP|7rt2|4j\D ]\}Z}[t|Y|0|[  |X|[ g|4]|ZR   qt0 fdKdL|3D }\|!s|d||f}NtdM|N |\  |r|/j^|t/|0_ dN |4Z \}]}^}_}`}a}b}c}d|rtP|6r|d ur+tt|t/r'|d$ n|jIndO}ettdP}ft||e dQ }gtdR|g dS t`|gdT}htab|6|h W d    n	1 s\w   Y  zSd$dUlcmd}i d$dVlemf}j |i|f}k|kg|g}Hg }W|j|k|HdW|j|k|HdXfD ]'}l|(rdYd1 |jhjiD |ljj_k|ll  |lm  |ln  |Wo|ljpd d/  q|W\}`}_}d}cW n tqy }m ztdZ|m  W Y d }m~mnd }m~mww |  |!s|rd[tPt/|rd\ d]|d
  ndO}2td^t*d_| |2  |]|^|_|`|a|b|c|df}ng |n|5M tP| s R |4t|)|\fS )`Npycocotools      TFr   r)   )
batch_size)exist_okr   )parentsr   )rp   dnndatafp16)sr   z-Forcing --batch-size 1 square inference (1,3,,z) for non-PyTorch modelsr   cocozval2017.txtncru   gffffff?
   ro   z (z< classes) trained on different --data than what you passed (zV classes). Pass correct combination of --weights and --data that are trained together.rQ   )imgszspeed)rq   Ftrainr   testz: )padrectworkersprefixoverlap_maskmask_downsample_ratior   )r   namesi  z,%22s%11s%11s%11s%11s%11s%11s%11s%11s%11s%11s)ClassImages	InstanceszBox(PRmAP50	mAP50-95)zMask(Pr   r   r   r(   )desc
bar_format)non_blocking   )augmentrO   c                    s,   g | ]}  d d df |kdd f qS )Nr   r   r?   )rT   rk   )targetsr?   r@   rU     s   , zrun.<locals>.<listcomp>)r   multi_labelagnosticmax_detnmrw   )rO   r   )r   r      )r6   rP   )r   r   )rG      .txt)r7   )dim	val_batchz_labels.jpg)r   z	_pred.jpgc                 S   s    g | ]}t |d   qS )r   )r,   r   r   r   rS   r?   r?   r@   rU   \  s     )plotsave_dirr   )	minlengthz<%22s%11i%11i%11.3g%11.3g%11.3g%11.3g%11.3g%11.3g%11.3g%11.3gallu"   WARNING ⚠️ no labels found in z, set, can not compute metrics without labels2   c                 3   s    | ]
}|j   d  V  qdS )g     @@N)trS   )seenr?   r@   	<genexpr>n  s    zrun.<locals>.<genexpr>zKSpeed: %.1fms pre-process, %.1fms inference, %.1fms NMS per image at shape )r   r   r   z3../datasets/coco/annotations/instances_val2017.jsonz_predictions.jsonz&
Evaluating pycocotools mAP... saving ...w)COCO)COCOevalrX   segmc                 S   s   g | ]	}t t|jqS r?   )r^   r   r\   rS   r?   r?   r@   rU     s    zpycocotools unable to run: r+   zlabels/*.txtz labels saved to zResults saved to bold)ur   r    r   next
parametersrp   typehalffloatr%   modelr   r&   r   r   mkdirr   strideptjitenginer   r   
isinstancer   r   r	   infor   evalgetstrendswithossepr^   r,   linspacenumelr   warmupr   r   r   hasattrr   modulelisttupledictra   r   r   r   r"   r}   r   r   tor6   r-   r   rb   r   rc   r   cloner   r   r   	as_tensorrE   rA   r\   r!   permute
contiguousr   r   rn   r2   r$   r   anyr#   updaterI   bincountr~   summean_resultswarningap_class_indexclass_resultr   valuesr0   jsondumppycocotools.cocor   pycocotools.cocoevalr   loadResdatasetim_filesparamsimgIdsevaluate
accumulate	summarizeextendstats	Exceptionglobr.   get_maps)or   weightsr   batchr   img
conf_thres	iou_thresr   taskrp   r   
single_clsr   verbosesave_txtsave_hybridr5   	save_jsonprojectnamer   r   r   r   
dataloaderr   plotsr   r   compute_loss	callbacksprocesstrainingr   r   r   r   r   cudais_cocor   r   niouncmr   r   confusion_matrixr   rf   r   dtmetricslossrd   r  pbarbatch_iimpathsshapesr   nb_heightwidthpredsprotos	train_outlb
plot_maskssipredprotor   r   nprre   r6   correct_maskscorrect_bboxesmidxr   rg   r4   tboxlabelsnresultsntpfrk   cr   mp_bboxmr_bbox
map50_bboxmap_bboxmp_maskmr_mask
map50_maskmap_maskr   	anno_json	pred_jsonr>   r   r   annor   efinal_metricr?   )r   r   r@   run   s  #
 
($






4. 
 
. >4$ 8 $

"*,,
,*rV  c                  C   s  t  } | jdttd dd | jddtddd	 | jd
tddd | jdddtddd | jdtddd | jdtddd | jdtddd | jdddd | jdd d!d | jd"td#d$d | jd%d&d'd( | jd)d&d*d( | jd+d&d,d( | jd-d&d.d( | jd/d&d0d( | jd1d&d2d( | jd3d&d4d( | jd5td6 d7d | jd8d9d:d | jd;d&d<d( | jd=d&d>d( | jd?d&d@d( |  }t|j	|_	| j
|jO  _
tt| |S )ANz--datazdata/coco128-seg.yamlzdataset.yaml path)r   defaulthelpz	--weights+zyolov5s-seg.ptzmodel path(s))nargsr   rW  rX  z--batch-sizer   z
batch sizez--imgszz--imgz
--img-sizer   zinference size (pixels)z--conf-thresr   zconfidence thresholdz--iou-thresr   zNMS IoU thresholdz	--max-detr   zmaximum detections per imagez--taskr   z train, val, test, speed or study)rW  rX  z--devicer   z%cuda device, i.e. 0 or 0,1,2,3 or cpuz	--workersr   z-max dataloader workers (per RANK in DDP mode)z--single-cls
store_trueztreat as single-class dataset)actionrX  z	--augmentzaugmented inferencez	--verbosezreport mAP by classz
--save-txtzsave results to *.txtz--save-hybridz-save label+prediction hybrid results to *.txtz--save-confz%save confidences in --save-txt labelsz--save-jsonzsave a COCO-JSON results filez	--projectr   zsave results to project/namez--namer   zsave to project/namez
--exist-okz*existing project/name ok, do not incrementz--halfz!use FP16 half-precision inferencez--dnnz!use OpenCV DNN for ONNX inference)argparseArgumentParseradd_argumentr   ROOTr^   r   
parse_argsr   r   r  r  r   vars)parseroptr?   r?   r@   	parse_opt  s8   re  c              	   C   s  t td dd | jdv r/| jdkrtd| j d | jr$td tdi t|  d S t	| j
tr8| j
n| j
g}tj oE| jd	k| _| jd
krid\| _| _| _|D ]| _
tdi t| ddi qVd S | jdkr|D ]Q| _
dt| jj dt| j
j d}ttdddg }}|D ]'| _td| d| j d tdi t| ddi\}}}|||  qtj||dd qptd t|d d S td| j d)Nzrequirements.txt)tensorboardthop)requirementsexcluder   r   u$   WARNING ⚠️ confidence threshold z! > 0.001 produces invalid resultsu\   WARNING ⚠️ --save-hybrid returns high mAP from hybrid labels, not from predictions aloner   r   )g      ?g?Fr!  Fstudystudy_r4  r      i     z	
Running z	 --imgsz r   z%10.4g)fmtzzip -r study.zip study_*.txt)rL   z--task z2 not in ("train", "val", "test", "speed", "study")r?   ) r   r`  r  r  r	   r   r  rV  rb  r   r  r   r,   r&  is_availablerp   r   r  r  r   r   r\   r   r   r   rc   rI   savetxtr   systemr   NotImplementedError)rd  r  r>   rL   yrr4  r   r?   r?   r@   main  s4   






"
 
ru  __main__)NNFF)O__doc__r]  r  r   sysmultiprocessing.poolr   pathlibr   r   rI   r,   r   __file__resolveFILEr   r`  r   re   rc   relpathcwdtorch.nn.functionalnn
functionalrD   yolov5.models.commonr   yolov5.models.yolor   yolov5.utils.callbacksr   yolov5.utils.generalr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   yolov5.utils.metricsr   r   yolov5.utils.plotsr   r    yolov5.utils.segment.dataloadersr   yolov5.utils.segment.generalr   r   r    r!   yolov5.utils.segment.metricsr"   r#   yolov5.utils.segment.plotsr$   yolov5.utils.torch_utilsr%   r&   r'   rA   rn   r   rV  re  ru  __name__r?   r?   r?   r@   <module>   s   
H

%   
#