o
    Ďi8                     @   s   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZ 	dd
efddZG dd dZ	d ddZ						d!ddZ						d"ddZd#ddZ				d$ddZdd Zdd ZdS )%    )PathN)	AutoShapeDetectMultiBackend)attempt_load)ClassificationModelSegmentationModel)LOGGERlogging)select_deviceTFhf_tokenc              
   C   s  |st tj t|}zKt| |||d}|rV|jr&t|jt	r&t 
d n0|jr5t|jtr5t 
d n!zt|}W n tyU } zt 
d|  W Y d}~nd}~ww W n! tyx } zt 
d|  t| |dd}W Y d}~nd}~ww |st tj ||S )	a  
    Creates a specified YOLOv5 model

    Arguments:
        model_path (str): path of the model
        device (str): select device that model will be loaded (cpu, cuda)
        pretrained (bool): load pretrained weights into the model
        autoshape (bool): make model ready for inference
        verbose (bool): if False, yolov5 logs will be silent
        hf_token (str): huggingface read token for private models

    Returns:
        pytorch model

    (Adapted from yolov5.hubconf.create)
    )devicefuser   u   WARNING ⚠️ YOLOv5 ClassificationModel is not yet AutoShape compatible. You must pass torch tensors in BCHW to this model, i.e. shape(1,3,224,224).u   WARNING ⚠️ YOLOv5 SegmentationModel is not yet AutoShape compatible. You will not be able to run inference with this model.u!   WARNING ⚠️ autoshape failed: Nu*   WARNING ⚠️ DetectMultiBackend failed: F)r   r   )r   setLevelr	   WARNINGr
   r   pt
isinstancemodelr   warningr   r   	Exceptionr   INFOto)
model_pathr   	autoshapeverboser   r   e r   J/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/helpers.py
load_model   s>   
r   c                   @   s(   e Zd ZdddZdd Zdd	d
ZdS )YOLOv5NTc                 C   sR   t dt || _|| _|r$t|jd jddd t||dd| _	d S d | _	d S )NzfYOLOv5 class is deprecated and will be removed in future release. Use 'model = yolov5.load()' instead.r   Tparentsexist_okr   r   r   )
warningswarnDeprecationWarningr   r   r   r    mkdirr   r   )selfr   r   load_on_initr   r   r   __init__D   s   
zYOLOv5.__init__c                 C   s2   t | jjd jddd t| j| jdd| _dS )z%
        Load yolov5 weight.
        r   Tr   r"   N)r   r   r    r&   r   r   r   )r'   r   r   r   r   Q   s   
zYOLOv5.load_model  Fc                 C   s&   | j dus	J d| j |||d}|S )z
        Perform yolov5 prediction using loaded model weights.

        Returns results as a yolov5.models.common.Detections object.
        Nz.before predict, you need to call .load_model())imssizeaugment)r   )r'   
image_listr,   r-   resultsr   r   r   predictZ   s   zYOLOv5.predict)NT)r*   F)__name__
__module____qualname__r)   r   r0   r   r   r   r   r   C   s    
	r   object-detectionr*   c                 C   s   ddl m} |d urd| d}d| d| d}nd }}d	| d
| d| d|  d| d| d| d|  d|  d|  d| d| d|  dS )Nr   )__version__z
datasets:
- 
z
    dataset:
      type: z
      name: z
      split: validation
 z' 
---
tags:
- yolov5
- yolo
- vision
- z1
- pytorch
library_name: yolov5
library_version: z
inference: false
z
model-index:
- name: z"
  results:
  - task:
      type: zh
    metrics:
      - type: precision  # since mAP@0.5 is not available on hf.co/metrics
        value: z`  # min: 0.0 - max: 1.0
        name: mAP@0.5
---

<div align="center">
  <img width="640" alt="z" src="https://huggingface.co/z/resolve/main/sample_visuals.jpg">
</div>

### How to use

- Install [yolov5](https://github.com/fcakyon/yolov5-pip):

```bash
pip install -U yolov5
```

- Load model and perform prediction:

```python
import yolov5

# load model
model = yolov5.load('a  ')
  
# set model parameters
model.conf = 0.25  # NMS confidence threshold
model.iou = 0.45  # NMS IoU threshold
model.agnostic = False  # NMS class-agnostic
model.multi_label = False  # NMS multiple labels per box
model.max_det = 1000  # maximum number of detections per image

# set image
img = 'https://github.com/ultralytics/yolov5/raw/master/data/images/zidane.jpg'

# perform inference
results = model(img, size=a  )

# inference with test time augmentation
results = model(img, augment=True)

# parse results
predictions = results.pred[0]
boxes = predictions[:, :4] # x1, y1, x2, y2
scores = predictions[:, 4]
categories = predictions[:, 5]

# show detection bounding boxes on image
results.show()

# save results into "results/" folder
results.save(save_dir='results/')
```

- Finetune the model on your custom dataset:

```bash
yolov5 train --data data.yaml --img z --batch 16 --weights z} --epochs 10
```

**More models available at: [awesome-yolov5-models](https://github.com/keremberke/awesome-yolov5-models)**
)yolov5r5   )repo_idap50task
input_size
dataset_idyolov5_versiondatasets_str_1datasets_str_2r   r   r   generate_model_usage_markdowne   sL   
	*7LLrA   c                 C   s   ddl m}m}	 |	| ||dd t|d }
|| t|
dd|dd	 t| ||||d
}t|d }t|d}|| W d    n1 sFw   Y  || t|t|jd|dd	 d S )Nr   upload_filecreate_repoTr9   tokenprivater!   zval_batch0_labels.jpgzsample_visuals.jpgzupload sample visualsr   r9   path_or_fileobjpath_in_repocommit_messagerF   	repo_type)r;   r<   r=   r:   z	README.mdwzAdd yolov5 model card)	huggingface_hubrC   rD   r   strrA   openwritename)r9   
exp_folderr:   r   r<   r;   rG   r=   rC   rD   sample_visual_pathmodelcard_markdownmodelcard_pathfile_objectr   r   r   push_model_card_to_hfhub   sF   


rX   c                 C   s   ddl m}m} ddl}	|||d}
t|d }t|d}|	|
| W d   n1 s.w   Y  || ||dd || t|t|jd	|d
d dS )a  
    Pushes a yolov5 config to huggingface hub

    Arguments:
        repo_id (str): The name of the repository to create on huggingface.co
        exp_folder (str): The path to the experiment folder
        best_ap50 (float): The best ap50 score of the model
        input_size (int): The input size of the model (default: 640)
        task (str): The task of the model (default: object-detection)
        hf_token (str): The huggingface token to use to push the model
        private (bool): Whether the model should be private or not
    r   rB   N)r<   r;   	best_ap50zconfig.jsonrM   TrE   zAdd yolov5 configr   rH   )	rN   rC   rD   jsonr   rP   dumprO   rR   )r9   rS   rY   r<   r;   r   rG   rC   rD   rZ   configconfig_pathrW   r   r   r   push_config_to_hfhub   s*   
r^   c           	      C   s   ddl m}m} ddlm} t|d }|| dd }|| ||dd || t|t|jd	|d
d || t|t|jd|d
d dS )a'  
    Pushes a yolov5 model to huggingface hub

    Arguments:
        repo_id (str): huggingface repo id to be uploaded to
        exp_folder (str): yolov5 experiment folder path
        hf_token (str): huggingface write token
        private (bool): whether to make the repo private or not
    r   rB   )globzweights/best.ptz/events.out.tfevents*TrE   zUpload yolov5 best modelr   rH   zUpload yolov5 tensorboard logsN)rN   rC   rD   r_   r   rO   rR   )	r9   rS   r   rG   rC   rD   r_   best_model_pathtensorboard_log_pathr   r   r   push_model_to_hfhub*  s4   

rc   c              
   C   sz   ddl m} ddlm}	m}
m} t|d d|   |	| ||||||d |
| |||||||d || |||d d S )	Nr   colorstr)r^   rX   rc   zhub:z Pushing to hf.co/)r9   rS   rY   r<   r;   r   rG   )r9   rS   r<   r;   r   rG   r=   r:   )r9   rS   r   rG   )yolov5.utils.generalre   yolov5.helpersr^   rX   rc   r   info)hf_model_idr   
hf_privatesave_dirhf_dataset_idr<   rY   r;   re   r^   rX   rc   r   r   r   push_to_hfhubR  s2   
	

rm   c                 C   s*  dd l }ddlm} d}d}t| jdd}||}|dd ur$d}|dd ur-d}W d    n1 s7w   Y  |rE| jrEtd	|rdd
l	m
} ddlm}	 d}
|	 r[d}
|| j|d |
d}|| _t|dd?}||}|d |d< |d |d< |d |d< |d |d< |dd ur|d |d< |dd ur|d |d< W d    n1 sw   Y  t|d}||| W d    n1 sw   Y  |d d }|jddd d|v rt|d  r||d t|d  d|v rt|d  r||d t|d  d S d S d S d S )Nr   )copyfileFignoreerrorstrain_json_pathTyolo_s3_data_dirzg'--upload_dataset' argument cannot be passed when 'yolo_s3_data_dir' field is not empty in 'data.yaml'.)export_coco_as_yolov5_via_yml)is_colabdata)yml_path
output_dirdisable_symlinkval_json_pathtrain_image_dirval_image_dircoco_s3_data_dirrM   cocor   z
train.jsonzval.json)yamlshutilrn   rP   rv   	safe_loadgetupload_dataset
ValueErrorsahi.utils.cocort   rf   ru   r[   r&   r   is_filerO   )optrk   r   rn   is_coco_datahas_yolo_s3_data_dirf	data_infort   ru   ry   rv   updated_data_inforM   r   r   r   convert_coco_dataset_to_yolo}  sf   



$r   c                 C   s  dd l }dd l}ddlm} ddlm}m} t|dd}||}	W d    n1 s,w   Y  dt	t
| jdd|j d |jd	 }
t|d
 d|
  |
d }|| j|d}|
d }||	d |d}|
d }||	d |d}|rt|d
 d|
  d S d S )Nr   rd   )upload_file_to_s3upload_folder_to_s3ro   rp   zs3://r7   rv   /zaws:z% Uploading yolo formatted dataset to z
/data.yaml)
local_files3_filez/train/train)local_folder	s3_folderz/val/valz+ Dataset has been successfully uploaded to )r   osrf   re   yolov5.utils.awsr   r   rP   r   rO   r   s3_upload_dirreplacerR   sepr   rh   rv   )r   rv   rk   r   r   re   r   r   r   r   r   r   results3_folder_trains3_folder_valr   r   r   upload_to_s3  s4   
r   )NTFN)r4   r*   N)Nr*   r4   FN)Nr*   r4   NF)NF)Nr*   Nr4   )pathlibr   r#   yolov5.models.commonr   r   yolov5.models.experimentalr   yolov5.models.yolor   r   rf   r   r	   yolov5.utils.torch_utilsr
   rO   r   r   rA   rX   r^   rc   rm   r   r   r   r   r   r   <module>   sD    
8#
i
6

--
+: