a
    DfO                     @   s  d Z ddl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mZ ee Zejd Zeeejvre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.m/Z/ dd
l0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6 dd Z7dd Z8dd Z9e6 dddddddddddddddde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; Z>e<e> dS )%a  
Validate a trained YOLOv5 detection model on a detection dataset

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

Usage - formats:
    $ python val.py --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 ]^ }}}tt |dd| d }|r^|g||R n
|g|R }	t|d.}
|
dt|	  |	 d  W d    q1 s0    Y  qd S )N)   r   r   r   r      az%g 
)	torchtensortolistr   viewopenwritelenrstrip)predn	save_confshapefilegnZxyxyconfclsZxywhlinef r4   9/data/NAS7/SABIOD/METHODE/ermites/yolo-dyni/yolov5/val.pysave_one_txt1   s    $ r6   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 qtd S )Nr         c                 S   s   g | ]}t |d qS )   )round.0xr4   r4   r5   
<listcomp>D       z!save_one_json.<locals>.<listcomp>)image_idZcategory_idbboxscore)stem	isnumericintr   zipr%   appendr:   )r+   jdictpath	class_mapr@   boxpbr4   r4   r5   save_one_json;   s    0rN   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 rzt
t|d||d |d f dddf fd  }|d jd dkrX||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< qzt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   r8   r7   r    T)return_indexdtypedevice)npzerosr-   astypeboolr   ranger)   r#   wherecatstackcpunumpyargsortuniquerE   r$   rR   )	
detectionslabelsiouvcorrectZiouZcorrect_classir=   matchesr4   r4   r5   process_batchH   s    	 *$<""" re         MbP?333333?,  val    Fruns/valexpTc           c         s
  |d u}|rNt | jdddf\}}}}||jdkM }|rD| n|  nt||d}tt|| |d}|rz|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}"|
rLd
n
t| d }#tjddd|d}$|$ }%|s&|r|
s|j j!}&|&|#ksJ | d|& d|# d|j"|rd
n|d||fd |dkrdnd|f\}'}(|dv r|nd}t#| | ||| |
|'|(|	t$| dd	d  }d  t%|#d!})t&|d"rF|j'n|j(j'}*t|*t)t*frjt+t,|*}*|"rvt- n
t)t.d#}+d$d% },d&\
}-}.}/}0}1}2}3}4}5}6t/ t/ t/ f}7tj0d|d}8g g g g f\}9}:};}<|1d' t2||,t3d(}=t,|=D ] \}>\}?}@}A|1d) |7d  Z |!r8|?j4|dd*}?4||rF|? n|? }?|?d+ }?|?j5\}B}C}D}EW d    n1 sz0    Y  |7d
 2 |r||?n||?|d,d f\}F}GW d    n1 s0    Y  |r|8||Gd
 7 }8d d d-d f  tj6|E|D|E|Df|d9  < |r2fd.d/t.|BD ng }H|7d- & t7|F|||Hd|
|d0}FW d    n1 sl0    Y  t,|FD ]0\}I}Jd d d f |Ikd
d f }K|Kj5d  |Jj5d   }L}Mt|@|I |A|I d   }N}Otj0|M|%tj8|d1}P d
7  |Md krT|Lr~|:9|Pgtj0d2|d|Kd d d f R  |r~|)j:d |Kd d d f d3 q~|
rjd |Jd d d4f< |J; }Qt<|?|I j5d
d  |Qd d d d5f |O|A|I d
  |Lr&t=|Kd d d
d4f }Rt<|?|I j5d
d  |R|O|A|I d
  t>|Kd d d d
f |Rfd
}St:|Q|S|$}P|r&|):|Q|S |:9|P|Jd d d5f |Jd d d4f |Kd d d f f |rt?|Q||O|d |Nj@ d6 d7 |rtA|Q|9|N|+ |1d8|J|Q|N|*|?|I  q~|r|>dk rtB|?|@|d9|> d: |* tB|?tC|F|@|d9|> d; |* |1d<|>|?|@|A|F qd=d/ tD|: D }:tE|:r|:d  F rtG|:|||*d>\}-}.}/}0}1};}<|;d d d f |;Hd
 }5};|/H |0H |5H |;H f\}2}3}4}6tIjJ|:d Kt|#d?}Td@}Ut|UdA |TL |2|3|4|6f  |TL d krtMdB| dC |s|#dDk rp|sp|#d
krptE|:rpt,|<D ]>\}V}Wt|U|*|W  |T|W |/|V |0|V |5|V |;|V f  q0t* fdEdF|7D }X|s|d||f}OtdG|O |X  |r|)jN|t)|*O dH |1dI|T|-|.|/|0|1|;|5|<|) |
rJtE|9
rJ|d u	rtt|t)	r|d  n|j@ndJ}YttdK}Zt||Y dL }[tdM|[ dN tP|[dO}\tQR|9|\ W d    n1 	s0    Y  ztSdP d dQlTmU}] d dRlVmW}^ |]|Z}_|_X|[}J|^|_|JdS}`|"	rdTd/ |jYjZD |`j[_\|`]  |`^  |`_  |`j`d d- \}6}4W n6 ta
yH }a ztdU|a  W Y d }a~an
d }a~a0 0 |  |
s|
rdVtEt)|bdW dX|d  ndJ},tdYt$dZ| |,  tI0|#|6 }bt,|<D ]\}V}W|;|V |b|W< 
q|2|3|4|6g|8c tE| d R |b|XfS )[NTFr[   )
batch_size)exist_okr`   )parentsrq   )rR   dnndatafp16)sr   z-Forcing --batch-size 1 square inference (1,3,,z) for non-PyTorch modelsrk   Zcocozval2017.txtncg      ?gffffff?
   )rR   z (z< classes) trained on different --data than what you passed (zV classes). Pass correct combination of --weights and --data that are trained together.r9   )imgszspeed)        Ftrainrk   testz: )padrectworkersprefixr   )rx   namesi  z%22s%11s%11s%11s%11s%11s%11s)ZClassZImages	InstancesPRZmAP50zmAP50-95)
r|   r|   r|   r|   r|   r|   r|   r|   r|   r|   Zon_val_start)desc
bar_formatZon_val_batch_start)non_blocking   )augmentr7   c                    s,   g | ]$}  d d df |kdd f qS )Nr   r   r4   )r<   rc   )targetsr4   r5   r>      r?   zrun.<locals>.<listcomp>)r`   Zmulti_labelZagnosticmax_detrP   )r7   r   )r_   r`   r8   r   .txt)r.   Zon_val_image_endZ	val_batchz_labels.jpgz	_pred.jpgZon_val_batch_endc                 S   s    g | ]}t |d   qS )r   )r#   rY   r[   r\   r;   r4   r4   r5   r>     r?   )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   c                 3   s   | ]}|j   d  V  qdS )g     @@N)tr;   )seenr4   r5   	<genexpr>$  r?   zrun.<locals>.<genexpr>zKSpeed: %.1fms pre-process, %.1fms inference, %.1fms NMS per image at shape )r   r   Z
on_val_endrl   z3../datasets/coco/annotations/instances_val2017.jsonz_predictions.jsonz&
Evaluating pycocotools mAP... saving ...wzpycocotools>=2.0.6)COCO)COCOevalrA   c                 S   s   g | ]}t t|jqS r4   )rE   r   rC   r;   r4   r4   r5   r>   @  r?   zpycocotools unable to run: r"   zlabels/*.txtz labels saved to zResults saved to bold)enext
parametersrR   typehalffloatr   r   r   mkdirr   strideptjitenginer   ru   rp   r   infor
   eval
isinstancegetstrendswithosseprE   r#   linspacenumelmodelrx   warmupr   r   r   hasattrr   modulelisttupledict	enumerater   rW   r	   rT   runr   r   tor-   r$   r   rV   rG   re   cloner   r   rY   r6   rC   rN   r   r   rF   r)   anyr   meanrS   bincountrU   sumwarningr   valuesr'   jsondumpr   Zpycocotools.cocor   Zpycocotools.cocoevalr   ZloadResdatasetZim_filesparamsZimgIdsZevaluate
accumulate	summarizestats	Exceptionglobr[   r%   )crt   weightsrp   rz   
conf_thres	iou_thresr   taskrR   r   
single_clsr   verbosesave_txtsave_hybridr,   	save_jsonprojectnamerq   r   rs   r   
dataloaderr   plots	callbackscompute_losstrainingr   r   r   r   cudais_cocorx   ra   ZniouZncmr   r   Zconfusion_matrixr   rJ   rv   tpfprL   rf1mpmrZmap50Zap50mapdtlossrH   r   ZapZap_classpbarZbatch_iZimpathsshapesnb_heightwidthZpredsZ	train_outlbsipredr`   nlnprrI   r-   rb   r+   ZtboxZlabelsnntZpfrc   cr   r   Z	anno_jsonZ	pred_jsonr3   r   r   annor   emapsr4   )r   r   r5   r   a   sH    
*$





.
B. 
&	 
,4$ 6   $ *8,,
&,r   c                  C   s  t  } | jdttd dd | jddt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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-sizerf   z
batch sizez--imgszz--imgz
--img-sizerg   zinference size (pixels)z--conf-thresrh   zconfidence thresholdz--iou-thresri   zNMS IoU thresholdz	--max-detrj   zmaximum detections per imagez--taskrk   z train, val, test, speed or study)r   r   z--devicerl   z%cuda device, i.e. 0 or 0,1,2,3 or cpuz	--workersrm   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	--projectrn   zsave to project/namez--namero   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   ROOTrE   r   
parse_argsr   rt   r   r   r   r   r   vars)parseroptr4   r4   r5   	parse_optS  s:    r  c              	   C   s  t dd | jdv rX| jdkr2td| j d | jrBtd tf i t|  nTt| j	t
rj| j	n| j	g}tj o| jdk| _| jd	krd
\| _| _| _|D ] | _	tf i t| ddi qn| jdkr|D ]| _	dt| jj dt| j	j d}t
tdddg  }}|D ]P| _td| d| j d tf i t| ddi\}}}|||  qtj||dd qtg d t|d ntd| j dd S )N)ZtensorboardZthop)excluder}   rh   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   FZstudyZstudy_r   r      i     z	
Running z	 --imgsz r   z%10.4g)fmt)rF   z-rz	study.zipzstudy_*.txt)r=   z--task z2 not in ("train", "val", "test", "speed", "study"))r   r   r   r   r   r   r   r  r   r   r   r#   r   is_availablerR   r   r   r   r   rt   rC   rW   rz   rG   rS   savetxt
subprocessr   NotImplementedError)r  r   r3   r=   yr   r   r   r4   r4   r5   mains  s2    






"
 r  __main__)?__doc__r   r   r   r  syspathlibr   r\   rS   r#   r   __file__resolveFILErr   r   r   rI   rG   relpathcwdZmodels.commonr   utils.callbacksr   utils.dataloadersr   utils.generalr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   utils.metricsr   r   r   utils.plotsr   r   r   utils.torch_utilsr   r   r6   rN   re   r   r  r  __name__r  r4   r4   r4   r5   <module>   sv   
D
 r #
