ultralytics / yolov3

YOLOv3 in PyTorch > ONNX > CoreML > TFLite
https://docs.ultralytics.com
GNU Affero General Public License v3.0
10.18k stars 3.44k forks source link

how to using onnx model? #1800

Closed Sun-Pak closed 3 years ago

Sun-Pak commented 3 years ago

❔Question

i create onnx model. using export.py. (using tutorial) I loaded the onnx model, but don't know how to check the result. I checked that the number of inputs is 1 and the number of outputs is 4, I don't know why output is 4. I know that there should be 3 outputs.

i need help how i use it.

Additional context

232

And i edit onnx export in export.py output_name = ['output']

aaaa

In Netron

sdsxc

I can't understand that result.

github-actions[bot] commented 3 years ago

👋 Hello @Sun-Pak, thank you for your interest in YOLOv3 🚀! Please visit our ⭐️ Tutorials to get started, where you can find quickstart guides for simple tasks like Custom Data Training all the way to advanced concepts like Hyperparameter Evolution.

If this is a 🐛 Bug Report, please provide screenshots and minimum viable code to reproduce your issue, otherwise we can not help you.

If this is a custom training ❓ Question, please provide as much information as possible, including dataset images, training logs, screenshots, and a public link to online W&B logging if available.

For business inquiries or professional support requests please visit https://www.ultralytics.com or email Glenn Jocher at glenn.jocher@ultralytics.com.

Requirements

Python 3.8 or later with all requirements.txt dependencies installed, including torch>=1.7. To install run:

$ pip install -r requirements.txt

Environments

YOLOv3 may be run in any of the following up-to-date verified environments (with all dependencies including CUDA/CUDNN, Python and PyTorch preinstalled):

Status

CI CPU testing

If this badge is green, all YOLOv3 GitHub Actions Continuous Integration (CI) tests are currently passing. CI tests verify correct operation of YOLOv3 training (train.py), testing (test.py), inference (detect.py) and export (export.py) on MacOS, Windows, and Ubuntu every 24 hours and on every commit.

github-actions[bot] commented 3 years ago

👋 Hello, this issue has been automatically marked as stale because it has not had recent activity. Please note it will be closed if no further activity occurs.

Access additional YOLOv3 🚀 resources:

Access additional Ultralytics ⚡ resources:

Feel free to inform us of any other issues you discover or feature requests that come to mind in the future. Pull Requests (PRs) are also always welcomed!

Thank you for your contributions to YOLOv3 🚀 and Vision AI ⭐!

matiassalriv1998 commented 2 years ago

❔Question

i create onnx model. using export.py. (using tutorial) I loaded the onnx model, but don't know how to check the result. I checked that the number of inputs is 1 and the number of outputs is 4, I don't know why output is 4. I know that there should be 3 outputs.

i need help how i use it.

Additional context

232

And i edit onnx export in export.py output_name = ['output'] aaaa

In Netron

sdsxc

I can't understand that result.

Did you get some information? I have a similar question.

The fields input and output are tensors, input tensor with your images shape and output tensor (this one's shape is something i don't understand well). I want to interpretate the output tensor in order to make inference on a video flux using C#.

glenn-jocher commented 2 years ago

@matiassalriv1998 your ONNX model is out of date, export a new model with current code:

image

glenn-jocher commented 2 years ago

@matiassalriv1998 for C inference see export tutorial

matiassalriv1998 commented 2 years ago

What I'm actually looking for is to get some light on how to interpretate the output tensor. That's the most important.

One thing I don't understand also is why 1x25200x7?? In older versions that numbers changes...

Here I paste my model with the latest version of yolo trained and exported:

onnModelNetron

After trying some changes on the script I got 4 output tensors by modifying the export.py according to: https://github.com/ultralytics/yolov5/issues/343#issuecomment-658021043l), however I already have a code in C# which works with 3 output tensors with the standard form (1,3,20,20,7) (1,3,40,40,7) (1,3,80,80,7) which I would also like to know more about.

There's a lot of old information about and is a bit confusing for me, I would like some newer information which allows me to understand the tensor values, that's the most important for me.

glenn-jocher commented 2 years ago

@matiassalriv1998 ONNX inference is very easy, just follow the Usage examples shown after export:

Screenshot 2022-09-19 at 13 59 59
matiassalriv1998 commented 2 years ago

@matiassalriv1998 ONNX inference is very easy, just follow the Usage examples shown after export:

Screenshot 2022-09-19 at 13 59 59

As I mentioned before, inference is not my problem, I already know how to do an inference with that python line, the main goal I folow is to understand about the output tensor of .onnx model and why the numbers of the array by using the official Yolo repo [1,2500,7] or others I have seen at some places.

What I'm needing is to parse that output tensor (in C sharp) so I want to understand its form, there are ways to generate 4 tensors or 3 tensors as I explained before. Even I made a representative document with each visualization at netron.app for different configurations of export.py.

But that's my particular case, I'm just asking for some information about the output tensor form and its values.

glenn-jocher commented 2 years ago

Dimension 2 indices are xywh, conf, class confidences

matiassalriv1998 commented 2 years ago

(1, 25200, 7) Is my output tensor shape:

->1 is the batch size (set when exporting to .onnx)

->25200 is the bounding boxes number. For an input of 640x640 we have to consider stride values 32, 16, 8. So 640/32=20, that means the image is "divided" on a new 20x20 boxes image. Detections are made for that 3 stride values so 640/16=40 and 640/8=80. 3 bounding boxes are in a box with the different anchors layers. Conclusion: (20x20 + 40x40 + 80x80) x3=25200 bounding boxes

->7 according to @glenn-jocher comes from: [x y w h conf class0Conf class1Conf...] in my case I have 2 class detections so I have 7 columns on my tensor output.

Tensor apparence is a float table of 25200x7 in my model. Actually I will try to process this tensor output instead of what I was doing with old code processing 3 tensors (1,80,7), (1,40,7),(1,20,7) which mades me export onnx by changing some parameters actually. But at least now I have some understanding about the tensor values.

I hope this have helped someone :)

glenn-jocher commented 11 months ago

@matiassalriv1998 thanks for sharing your understanding of the output tensor's shape and values. It's great to see you've made progress in decoding the tensor output, and your explanation will certainly be helpful to others. If you have further questions or need additional assistance, feel free to ask!