o
    ĎiT                     @   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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rDejee eejee 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+m,Z, dd	l-m.Z.m/Z/m0Z0 dd
l1m2Z2m3Z3m4Z4 ddl5m6Z6m7Z7 dd Z8dd Z9dd Z:e7 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e dfddZ;dd Z<d d! Z=e>d"kre=  dS dS )#a  
Validate a trained YOLOv5 detection model on a detection dataset

Usage:
    $ yolov5 val --weights yolov5s.pt --data coco128.yaml --img 640

Usage - formats:
    $ yolov5 val --weights yolov5s.pt                 # PyTorch
                              yolov5s.torchscript        # TorchScript
                              yolov5s.onnx               # ONNX Runtime or OpenCV DNN with --dnn
                              yolov5s_openvino_model     # OpenVINO
                              yolov5s.engine             # TensorRT
                              yolov5s.mlmodel            # CoreML (macOS-only)
                              yolov5s_saved_model        # TensorFlow SavedModel
                              yolov5s.pb                 # TensorFlow GraphDef
                              yolov5s.tflite             # TensorFlow Lite
                              yolov5s_edgetpu.tflite     # TensorFlow Edge TPU
                              yolov5s_paddle_model       # PaddlePaddle
    N)Path)tqdm)DetectMultiBackend)	Callbacks)create_dataloader)LOGGER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ap_per_classbox_iou)output_to_targetplot_imagesplot_val_study)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      az%g 
)	torchtensortolistr   viewopenwritelenrstrip)predn	save_confshapefilegnxyxyconfclsxywhlinef r6   F/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/val.pysave_one_txt2   s   $  r8   c              	   C   s   |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|d  dd |D t|d dd q:d S )Nr         c                 S   s   g | ]}t |d qS )   )round.0xr6   r6   r7   
<listcomp>E   s    z!save_one_json.<locals>.<listcomp>)image_idcategory_idbboxscore)stem	isnumericintr   zipr%   appendr<   )r+   jdictpath	class_maprA   boxpbr6   r6   r7   save_one_json<   s   0
rP   c           	      C   s  t | jd |jd ft}t|ddddf | ddddf }|ddddf | dddf k}tt|D ]}}t	||| k|@ }|d jd rt
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< q=t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
    r   Nr   r   r:   r9   r    T)return_indexdtypedevice)npzerosr-   astypeboolr   ranger)   r#   wherecatstackcpunumpyargsortuniquerG   r$   rT   )	
detectionslabelsiouvcorrectioucorrect_classir?   matchesr6   r6   r7   process_batchI   s    	*$<"""ri   MbP?333333?,  val    Fruns/valexpTc           k         sV  |d u r|d u rd}n|d ur|}|d u r|d u rd}n|d ur"|}|d u}|rIt | jdddf\}
}} }!||
jdkM }|rD| n|  nct|
|d}
||
jdkM }tt|| |d}|rf|d n|j	ddd	 t
||
|| |d
}|j|j|j|jf\}"}} }!t||"d}|j}|!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}&|& }'|s9|r|s|j j!}(|(|%ksJ | d|( d|% d|j"|rdn|d||fd |	dkrdnd|f\})}*|	dv r!|	nd}	t#| |	 |||"||)|*|t$|	 d d!	d" }d" t%|%d#}+t&|d$rI|j'n|j(j'},t|,t)t*fr[t+t,|,},|$rat- nt)t.d%}-d&d' }.d(\
}/}0}1}2}3}4}5}6}7}8t/ t/ t/ f}9tj0d|
d}:g g g g f\};}<}=}>|1d) t2||.t3d*}?t,|?D ]\}@\}A}B}C|1d+ |9d" - |#r|Aj4|
dd,}A4|
|r|A n|A }A|Ad- }A|Aj5\}D}E}F}GW d    n	1 sw   Y  |9d  |r||An||A|d.d f\}H}IW d    n	1 s	w   Y  |r|:||Id 7 }:d d d/d f  tj6|G|F|G|Ff|
d9  < |r?fd0d1t.|DD ng }J|9d/  t7|H|||Jd||d2}HW d    n	1 s\w   Y  t,|HD ]\}K}Ld d d"f |Kkdd f }M|Mj5d" |Lj5d" }N}Ot|B|K |C|K d" }P}Qtj0|O|'tj8|
d3}R d7  |Od"kr|Nr|<9|Rgtj0d4|
d|Md d d"f R  |r|+j:d |Md d d"f d5 qe|rd"|Ld d d6f< |L; }St<|A|K j5dd  |Sd d d d7f |Q|C|K d  |Nr9t=|Md d dd6f }Tt<|A|K j5dd  |T|Q|C|K d  t>|Md d d"df |Tfd}Ut:|S|U|&}R|r9|+:|S|U |<9|R|Ld d d7f |Ld d d6f |Md d d"f f |rgt?|S||Q|d |Pj@ d8 d9 |rqtA|S|;|P|- |1d:|L|S|P|,|A|K  qe|r|@dk rtB|A|B|d;|@ d< |, tB|AtC|H|B|d;|@ d= |, |1d>|@|A|B|C|H qd?d1 tD|< D }<tE|<r|<d" F rtG|<|||,d@\}/}0}1}2}3}=}>|=d d d"f |=Hd}7}=|1H |2H |7H |=H f\}4}5}6}8tIjJ|<d Kt|%dA}VdB}Wt|WdC |VL |4|5|6|8f  |VL d"kr%tMdD|	 dE |s0|%dFk r^|s^|%dkr^tE|<r^t,|>D ]\}X}Yt|W|,|Y  |V|Y |1|X |2|X |7|X |=|X f  q>dG}Z|ZN }[g } | 9dC |VL t|4dHt|5dHt|6dHt|8dHg t,|>D ]-\}X}Y| 9|,|Y  |V|Y t|1|X dHt|2|X dHt|7|X dHt|=|X dHg qtOjP| |[dI}\|\Q }]tR|dJ dK}^|^S|] |^T  t* fdLdM|9D }_|s|d||f}QtdN|Q |_  |r|+jU|t)|,V dO |1dP|V|/|0|1|2|3|=|7|>|+ |rtE|;r|d ur(tt|t)r$|d" n|j@ndQ}`ttdR}at||` dS }btdT|b dU tR|bdK}ctWX|;|c W d    n	1 sYw   Y  zDtYdV d"dWlZm[}d d"dXl\m]}e |d|a}f|f^|b}L|e|f|LdY}g|$rdZd1 |j_j`D |gja_b|gc  |gd  |ge  |gjfd d/ \}8}6W n tgy }h ztd[|h  W Y d }h~hnd }h~hww |  |s|rd\tEt)|hd] d^|d  ndQ}.td_t$d`| |.  tI0|%|8 }it,|>D ]\}X}Y|=|X |i|Y< qtI0|%|6 }jt,|>D ]\}X}Y|7|X |j|Y< q
|4|5|6|8g|:i tE| j R |i|j|_fS )aN      TFr]   )
batch_size)exist_okrb   )parentsru   )rT   dnndatafp16)sr   z-Forcing --batch-size 1 square inference (1,3,,z) for non-PyTorch modelsrm   cocozval2017.txtncg      ?gffffff?
   )rT   z (z< classes) trained on different --data than what you passed (zV classes). Pass correct combination of --weights and --data that are trained together.r;   )imgszspeed)        Ftrainrm   testz: )padrectworkersprefixr   )r}   namesi  z%22s%11s%11s%11s%11s%11s%11s)ClassImages	InstancesPRmAP50zmAP50-95)
r   r   r   r   r   r   r   r   r   r   on_val_start)desc
bar_formaton_val_batch_start)non_blocking   )augmentr9   c                    s,   g | ]}  d d df |kdd f qS )Nr   r   r6   )r>   rg   )targetsr6   r7   r@      s   , zrun.<locals>.<listcomp>)rb   multi_labelagnosticmax_detrR   )r9   r   )ra   rb   r:   r   .txt)r.   on_val_image_end	val_batchz_labels.jpgz	_pred.jpgon_val_batch_endc                 S   s    g | ]}t |d   qS )r   )r#   r[   r]   r^   r=   r6   r6   r7   r@     s     )plotsave_dirr   )	minlengthz$%22s%11i%11i%11.3g%11.3g%11.3g%11.3gallu"   WARNING ⚠️ no labels found in z, set, can not compute metrics without labels2   z)Class Images Labels P R mAP@.5 mAP@.5:.95z0.3f)columnszresults.htmlwc                 3   s    | ]
}|j   d  V  qdS )g     @@N)tr=   )seenr6   r7   	<genexpr>?  s    zrun.<locals>.<genexpr>zKSpeed: %.1fms pre-process, %.1fms inference, %.1fms NMS per image at shape )r   r   
on_val_endrn   z3../datasets/coco/annotations/instances_val2017.jsonz_predictions.jsonz&
Evaluating pycocotools mAP... saving ...zpycocotools>=2.0.6)COCO)COCOevalrC   c                 S   s   g | ]	}t t|jqS r6   )rG   r   rE   r=   r6   r6   r7   r@   [  s    zpycocotools unable to run: r"   zlabels/*.txtz labels saved to zResults saved to bold)knext
parametersrT   typehalffloatr   r   r   mkdirr   strideptjitenginer   ry   rt   r   infor
   eval
isinstancegetstrendswithosseprG   r#   linspacenumelmodelr}   warmupr   r   r   hasattrr   modulelisttupledict	enumerater   rY   r	   rV   runr   r   tor-   r$   r   rX   rI   ri   cloner   r   r[   r8   rE   rP   r   r   rH   r)   anyr   meanrU   bincountrW   sumwarningsplitpd	DataFrameto_htmlr'   r(   closer   valuesjsondumpr   pycocotools.cocor   pycocotools.cocoevalr   loadResdatasetim_filesparamsimgIdsevaluate
accumulate	summarizestats	Exceptionglobr]   r%   )krx   weightsrt   batchr   img
conf_thres	iou_thresr   taskrT   r   
single_clsr   verbosesave_txtsave_hybridr,   	save_jsonprojectnameru   r   rw   r   
dataloaderr   plots	callbackscompute_losstrainingr   r   r   r   cudais_cocor}   rc   niouncmr   r   confusion_matrixr   rL   rz   tpfprN   rf1mpmrmap50ap50mapdtlossrJ   r   apap_classpbarbatch_iimpathsshapesnb_heightwidthpreds	train_outlbsipredrb   nlnprrK   r-   rd   r+   tboxlabelsnntpfrg   cheaderheaders
results_dfresults_html	text_filer   r   	anno_json	pred_jsonr5   r   r   annor   emapsmap50sr6   )r   r   r7   r   b   s  "("






	$. 

 
,4$ 6   $ *8<T
,
,*r   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d5d6d7d | jd8d9d7d | jd:d&d;d( | jd<d&d=d( | jd>d&d?d( |  }t|j	|_	| j
|j	d@O  _
| j|jO  _tt| |S )ANz--datazdata/coco128.yamlzdataset.yaml path)r   defaulthelpz	--weights+z
yolov5s.ptzmodel path(s))nargsr   r+  r,  z--batch-sizers   z
batch sizez--imgszz--imgz
--img-sizerr   zinference size (pixels)z--conf-thresrj   zconfidence thresholdz--iou-thresrk   zNMS IoU thresholdz	--max-detrl   zmaximum detections per imagez--taskrm   z train, val, test, speed or study)r+  r,  z--devicern   z%cuda device, i.e. 0 or 0,1,2,3 or cpuz	--workersro   z-max dataloader workers (per RANK in DDP mode)z--single-cls
store_trueztreat as single-class dataset)actionr,  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	--projectrp   zsave to project/namez--namerq   z
--exist-okz*existing project/name ok, do not incrementz--halfz!use FP16 half-precision inferencez--dnnz!use OpenCV DNN for ONNX inferencez	coco.yaml)argparseArgumentParseradd_argumentr   ROOTrG   r   
parse_argsr   rx   r   r   r   r   r   vars)parseroptr6   r6   r7   	parse_optq  s:   r9  c               	   C   s  t  } t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)N)tensorboardthop)excluder   rj   u$   WARNING ⚠️ confidence threshold z! > 0.001 produces invalid resultsu`   WARNING ⚠️ --save-hybrid will return high mAP from hybrid labels, not from predictions aloner]   r   )g      ?g?Fr   Fstudystudy_r  r      i     z	
Running z	 --imgsz r   z%10.4g)fmtzzip -r study.zip study_*.txt)r?   z--task z2 not in ("train", "val", "test", "speed", "study")r6   )r9  r   r   r   r   r   r   r   r6  r   r   r   r#   r   is_availablerT   r   r   r   r   rx   rE   rY   r   rI   rU   savetxtr   systemr   NotImplementedError)r8  r   r5   r?   yr   r  r   r6   r6   r7   main  s6   







"
 
rG  __main__)?__doc__r1  r   r   syspathlibr   r^   rU   pandasr   r#   r   __file__resolveFILErv   r4  r   rK   rI   relpathcwdyolov5.models.commonr   yolov5.utils.callbacksr   yolov5.utils.dataloadersr   yolov5.utils.generalr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   yolov5.utils.metricsr   r   r   yolov5.utils.plotsr   r   r   yolov5.utils.torch_utilsr   r   r8   rP   ri   r   r9  rG  __name__r6   r6   r6   r7   <module>   s~   
D
   $
