Ë
    ëÓ^jÿ  ã                  ó¾   — 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lmZ d dlmZ d dlmZmZmZ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«      Zy)é    )Úannotations)ÚPath)ÚAnyN)ÚAxes)ÚBoxAnnotatorÚColorÚ
DetectionsÚLabelAnnotator)ÚTensor)Ú
DataLoader)Úbox_cxcywh_to_xyxy)Ú
get_loggerc                  ód   — e Zd ZdZ	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	d„«       Zy)
ÚDatasetGridSaveraa  Utility for saving 3x3 image grids to visualize augmentation effects.

    Args:
        data_loader: Dataloader of the dataset to sample images from.
        output_dir: Directory where grid images will be saved.
        max_batches: Number of batches to draw samples from.
        dataset_type: Dataset split label, e.g. ``'train'`` or ``'val'``.
    c                óv   — || _         || _        || _        || _        | j                  j	                  dd¬«       y )NT)ÚparentsÚexist_ok)Údata_loaderÚ
output_dirÚmax_batchesÚdataset_typeÚmkdir)Úselfr   r   r   r   s        úe/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/datasets/save_grids.pyÚ__init__zDatasetGridSaver.__init__#   s:   € ð 'ˆÔØ$ˆŒØ&ˆÔØ(ˆÔØ�‰×Ñ d°TÐÕ:ó    c           
     ó”  — t        j                  g d¢g d¢¬«      }t        d¬«      }t        t        j
                  dd¬«      }t        | j                  «      D �]/  \  }\  }}|| j                  k\  r �nt        j                  ddd	¬
«      \  }}|j                  | j                  › d|› �«       |j                  «       }d}	t        t        |j                  |«      «      D ](  \  }	\  }
}|	dk\  r n| j!                  |
|||	   |||«       Œ* t#        |	d«      D ]  }||   j%                  d«       Œ |j'                  «        t        j(                  | j*                  | j                  › d|› d�z  d¬«       t        j,                  «        �Œ2 t.        j1                  d| j                  › d| j*                  j3                  «       › �«       y)zÂCreate and save image grids to ``output_dir``.

        Each grid is a 3x3 JPEG containing up to 9 images from a single batch, with bounding boxes and class labels
        drawn on top.
        )g:ÜŸ�wñ Àg’$I’$I ÀgŠgE#ßü¿)g!:ÜŸ�w@g·mÛ¶mÛ@grÇqÇ@)ÚmeanÚstdé   )Ú	thicknessg      à?é   )Ú
text_colorÚ
text_scaleÚtext_padding)é   r&   )Úfigsizez dataset, batch r   é	   ÚoffÚ_batchz	_grid.jpgéÈ   )ÚdpizSaved z! grids with augmented images to: N)ÚTÚ	Normalizer   r
   r   ÚBLACKÚ	enumerater   r   ÚpltÚsubplotsÚsuptitler   ÚflattenÚzipÚtensorsÚ_annotate_and_plotÚrangeÚaxisÚtight_layoutÚsavefigr   ÚcloseÚloggerÚinfoÚresolve)r   Úinv_normalizeÚbox_annotatorÚlabel_annotatorÚ	batch_idxÚsampleÚtargetÚfigÚaxesÚsample_indexÚsingle_imageÚsingle_targetÚis                r   Ú	save_gridzDatasetGridSaver.save_grid,   s®  € ô Ÿ™ÚAÚ1ô
ˆô %¨qÔ1ˆÜ(Ü—{‘{ØØô
ˆô ,5°T×5EÑ5EÓ+Fó 	Ñ'ˆIÑ'˜ Ø˜D×,Ñ,Ò,ÚäŸ™ Q¨°8Ô<‰IˆC�Ø�L‰L˜D×-Ñ-Ð.Ð.>¸y¸kÐJÔKØ—<‘<“>ˆDàˆLÜ?HÌÈVÏ^É^Ð]cÓIdÓ?eò Ñ;�Ñ;˜|¨]Ø 1Ò$ÙØ×'Ñ'Ø  -°°lÑ1CÀ]ÐTaÐcrõðô ˜<¨Ó+ò $�Ø�Q‘—‘˜UÕ#ð$ð ×ÑÔÜ�K‰K˜Ÿ™¨T×->Ñ->Ð,?¸vÀiÀ[ÐPYÐ*ZÑZÐ`cÕdÜ�I‰IŽKð+	ô. 	�‰�f˜T×.Ñ.Ð/Ð/PÐQU×Q`ÑQ`×QhÑQhÓQjÐPkÐlÕmr   c                óþ  — ddl m} |d   }t        |t        «      r|j	                  «       j                  «       }t        |d   «      t        |d   «      }	} || «      }
t        |
t        «      r,|
j	                  «       j                  «       j                  «       }
|j                  t        j                  |
j                  ddd«      dd«      dz  j                  t        j                  «      «      }t        |d	   «      dkD  �rN|d
   }t        |t        «      r@|j	                  «       j                  «       j                  «       j                  t        «      }nt        j                  |t        ¬«      }|d	   }t        |t        «      r|j	                  «       j                  «       }n|}t        j                  |D ��cg c]+  }t!        |«      }|d   |	z  |d   |z  |d   |	z  |d   |z  g‘Œ- c}}t        j"                  ¬«      }t%        ||¬«      }|D �cg c]  }t'        |«      ‘Œ }}|j)                  ||¬«      }|j)                  |||¬«      }|j+                  |«       |j-                  d«       yc c}}w c c}w )a|  De-normalize a single image tensor, annotate it with boxes and labels, and plot it on ``ax``.

        Args:
            single_image: Normalized image tensor of shape ``(C, H, W)``.
            single_target: Target dict with keys ``'size'``, ``'boxes'`` (cx,cy,wh normalized), and ``'labels'``.
            ax: Matplotlib axis to plot the annotated image on.
            inv_normalize: Inverse normalization transform to convert the tensor back to pixel values.
            box_annotator: ``BoxAnnotator`` instance for drawing bounding boxes.
            label_annotator: ``LabelAnnotator`` instance for drawing class labels.
        r   )ÚImageÚsizeé   r    g        g      ð?éÿ   ÚboxesÚlabels)Údtyper"   )ÚxyxyÚclass_id)ÚsceneÚ
detections)rW   rX   rS   r)   N)ÚPILrN   Ú
isinstancer   ÚdetachÚcpuÚintÚnumpyÚ	fromarrayÚnpÚclipÚ	transposeÚastypeÚuint8ÚlenÚasarrayr   Úfloat32r	   ÚstrÚannotateÚimshowr9   )rI   rJ   Úaxr@   rA   rB   ÚPILImageÚresized_sizeÚhÚwÚde_normalized_imgrW   Úlabels_tensorÚ	class_idsrR   Ú
boxes_iterÚboxÚbrU   rX   ÚcrS   s                         r   r7   z#DatasetGridSaver._annotate_and_plotV   s%  € õ& 	*à$ VÑ,ˆÜ�l¤FÔ+Ø'×.Ñ.Ó0×4Ñ4Ó6ˆLÜ�< ‘?Ó#¤S¨°a©Ó%9ˆ1ˆá)¨,Ó7ÐÜÐ'¬Ô0Ø 1× 8Ñ 8Ó :× >Ñ >Ó @× FÑ FÓ HÐØ×"Ñ"¤B§G¡GÐ,=×,GÑ,GÈÈ1ÈaÓ,PÐRUÐWZÓ$[Ð^aÑ$a×#iÑ#iÔjl×jrÑjrÓ#sÓtˆäˆ}˜WÑ%Ó&¨Ó*Ø)¨(Ñ3ˆMÜ˜-¬Ô0Ø)×0Ñ0Ó2×6Ñ6Ó8×>Ñ>Ó@×GÑGÌÓL‘	äŸJ™J }¼CÔ@�	à! 'Ñ*ˆEÜ˜%¤Ô(Ø"Ÿ\™\›^×/Ñ/Ó1‘
à"�
ä—:‘:ØEO×s¸cÔZlÐmpÓZqÐTU�!�A‘$˜‘(˜A˜a™D 1™H a¨¡d¨Q¡h°°!±°q±Ò9ÓsÜ—j‘jôˆDô $¨¸	ÔBˆJØ&/Ö0 ”c˜!•fÐ0ˆFÐ0Ø!×*Ñ*°À:Ð*ÓNˆEØ#×,Ñ,°5ÀZÐX^Ð,Ó_ˆEà
�	‰	�%ÔØ
�‰��ùó tùò 1s   Æ=0I4
ÈI:N)r"   Útrain)
r   r   r   r   r   r]   r   rh   ÚreturnÚNone)rx   ry   )rI   r   rJ   zdict[str, Any]rk   r   r@   zT.NormalizerA   r   rB   r
   rx   ry   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rL   Ústaticmethodr7   © r   r   r   r      s˜   „ ñð dkð;Ø%ð;Ø37ð;ØFIð;Ø]`ð;à	ó;ó(nðT ð5Øð5à%ð5ð ð5ð #ð	5ð
 $ð5ð (ð5ð 
ò5ó ñ5r   r   )Ú
__future__r   Úpathlibr   Útypingr   Úmatplotlib.pyplotÚpyplotr1   r^   r`   Útorchvision.transformsÚ
transformsr-   Úmatplotlib.axesr   Úsupervisionr   r   r	   r
   Útorchr   Útorch.utils.datar   Úrfdetr.util.box_opsr   Úrfdetr.util.loggerr   r=   r   r   r   r   ú<module>r�      sA   ðõ #å Ý å Û Ý "Ý  ß GÓ GÝ Ý 'å 2Ý )á	‹€÷sò sr   