onnx RyzenAI object-detection vision YOLO Pytorch dataset:COCO license:apache-2.0 region:us
---
license: apache-2.0
tags:
- RyzenAI
- object-detection
- vision
- YOLO
- Pytorch
datasets:
- COCO
metrics:
- mAP
---
# YOLOv5s model trained on COCO

YOLOv5s is the small version of YOLOv5 model trained on COCO object detection (118k annotated images) at resolution 640x640. It was released in [https://github.com/ultralytics/yolov5](https://github.com/ultralytics/yolov5).

We develop a modified version that could be supported by [AMD Ryzen AI](https://onnxruntime.ai/docs/execution-providers/Vitis-AI-ExecutionProvider.html).


## Model description

YOLOv5 🚀 is the world's most loved vision AI, representing Ultralytics open-source research into future vision AI methods, incorporating lessons learned and best practices evolved over thousands of hours of research and development.


## Intended uses & limitations

You can use the raw model for object detection. See the [model hub](https://huggingface.co/models?search=amd/yolov5) to look for all available YOLOv5 models.


## How to use

### Installation

   Follow [Ryzen AI Installation](https://ryzenai.docs.amd.com/en/latest/inst.html) to prepare the environment for Ryzen AI.
   Run the following script to install pre-requisites for this model.
   ```bash
   pip install -r requirements.txt 
   ```


### Data Preparation (optional: for accuracy evaluation)

The dataset MSCOCO2017 contains 118287 images for training and 5000 images for validation.

Download COCO dataset and create directories in your code like this:
  ```plain
  └── datasets
       └── coco
             ├── annotations
             |   ├── instances_val2017.json
             |   └── ...
             ├── labels
             |   ├── val2017
             |   |   ├── 000000000139.txt
             |       ├── 000000000285.txt
             |       └── ...
             ├── images
             |   ├── val2017
             |   |   ├── 000000000139.jpg
             |       ├── 000000000285.jpg
             └── val2017.txt
  ```
1. put the val2017 image folder under images directory or use a softlink
2. the labels folder and val2017.txt above are generate by **general_json2yolo.py**
3. modify the coco.yaml like this:
```markdown
path: /path/to/your/datasets/coco  # dataset root dir
train: train2017.txt  # train images (relative to 'path') 118287 images
val: val2017.txt  # val images (relative to 'path') 5000 images
```


### Test & Evaluation

 - Code snippet from [`infer_onnx.py`](infer_onnx.py) on how to use
```python
    args = make_parser().parse_args()
    onnx_path = args.onnx_model
    onnx_weight = onnxruntime.InferenceSession(onnx_path)
    grid = np.load("./grid.npy", allow_pickle=True)
    anchor_grid = np.load("./anchor_grid.npy", allow_pickle=True)
    path = args.image_path 
    new_path = args.output_path
    conf_thres, iou_thres, classes, agnostic_nms, max_det = 0.25, 0.45, None, False, 1000

    img0 = cv2.imread(path)
    img = pre_process(img0)
    onnx_input = {onnx_weight.get_inputs()[0].name: img}
    onnx_output = onnx_weight.run(None, onnx_input)
    onnx_output = post_process(onnx_output)
    pred = non_max_suppression(
        onnx_output[0], conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det
    )
    colors = Colors()
    det = pred[0]
    im0 = img0.copy()
    annotator = Annotator(im0, line_width=2, example=str(names))
    if len(det):
        # Rescale boxes from img_size to im0 size
        det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()

        # Write results
        for *xyxy, conf, cls in reversed(det):
            c = int(cls)  # integer class
            label = f"{names[c]} {conf:.2f}"
            annotator.box_label(xyxy, label, color=colors(c, True))
    # Stream results
    im0 = annotator.result()
    cv2.imwrite(new_path, im0)
```

 - Run inference for a single image
  ```python
  python infer_onnx.py --onnx_model ./yolov5s.onnx -i /Path/To/Your/Image --ipu --provider_config /Path/To/Your/Provider_config
  ```
*Note: __vaip_config.json__ is located at the setup package of Ryzen AI (refer to [Installation](#installation))*
 - Test accuracy of the quantized model
  ```python
  python eval_onnx.py --onnx_model ./yolov5s.onnx --ipu --provider_config /Path/To/Your/Provider_config
  ```

### Performance

|Metric |Accuracy on IPU|
| :----:  | :----: |
|AP\@0.50:0.95|0.356|


```bibtex
@software{glenn_jocher_2021_5563715,
  author       = {Glenn Jocher et. al.},
  title        = {{ultralytics/yolov5: v6.0 - YOLOv5n 'Nano' models, 
                   Roboflow integration, TensorFlow export, OpenCV
                   DNN support}},
  month        = oct,
  year         = 2021,
  publisher    = {Zenodo},
  version      = {v6.0},
  doi          = {10.5281/zenodo.5563715},
  url          = {https://doi.org/10.5281/zenodo.5563715}
}
```
