Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

detect.py after converting in onnx with half precision doesn't work #5659

Closed
1 task done
skprot opened this issue Nov 15, 2021 · 8 comments · Fixed by #6268
Closed
1 task done

detect.py after converting in onnx with half precision doesn't work #5659

skprot opened this issue Nov 15, 2021 · 8 comments · Fixed by #6268
Labels
question Further information is requested

Comments

@skprot
Copy link

skprot commented Nov 15, 2021

Search before asking

Question

After converting .pt weights in .onnx format with half precision and running it with detect.py an error appears related to the fact that not all layers have been transferred to float16.
onnxruntime.capi.onnxruntime_pybind11_state.Fail: [ONNXRuntimeError] : 1 : FAIL : Load model from yolov5l.onnx failed:Type Error: Type parameter (T) of Optype (Concat) bound to different types (tensor(float) and tensor(float16) in node (Concat_505).

I executed export.py code with parameters: python export.py --weights yolov5l.pt --half --device 0
And after sucsessful convertation I ran the following command: python detect.py --weights yolov5l.onnx --half --device 0 and it gave me an error above.

Additional

There is no such error if I translate without the --half flag

@skprot skprot added the question Further information is requested label Nov 15, 2021
@github-actions
Copy link
Contributor

github-actions bot commented Nov 15, 2021

👋 Hello @skprot, thank you for your interest in YOLOv5 🚀! 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://ultralytics.com or email Glenn Jocher at glenn.jocher@ultralytics.com.

Requirements

Python>=3.6.0 with all requirements.txt installed including PyTorch>=1.7. To get started:

$ git clone https://github.com/ultralytics/yolov5
$ cd yolov5
$ pip install -r requirements.txt

Environments

YOLOv5 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 YOLOv5 GitHub Actions Continuous Integration (CI) tests are currently passing. CI tests verify correct operation of YOLOv5 training (train.py), validation (val.py), inference (detect.py) and export (export.py) on MacOS, Windows, and Ubuntu every 24 hours and on every commit.

@skprot
Copy link
Author

skprot commented Nov 15, 2021

Forgot about --inplace flag

@skprot skprot closed this as completed Nov 15, 2021
@glenn-jocher
Copy link
Member

@skprot note that --half and --device detect.py arguments only apply to pytorch inference. ONNX inference will run on whatever onnxruntime installation was chosen here (if not already installed) and at whatever precision you exported at:

yolov5/models/common.py

Lines 315 to 318 in c2523be

elif onnx: # ONNX Runtime
LOGGER.info(f'Loading {w} for ONNX Runtime inference...')
check_requirements(('onnx', 'onnxruntime-gpu' if torch.has_cuda else 'onnxruntime'))
import onnxruntime

@matbun
Copy link

matbun commented Jan 11, 2022

@skprot could you provide an example for your solution? I am still stuck. I am doing:
python export.py --weights best.pt --include onnx --simplify --half --device 0 --inplace
and
python detect.py --weights best.onnx

But I still get the error:

onnxruntime.capi.onnxruntime_pybind11_state.InvalidArgument: [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Unexpected input data type. Actual: (tensor(float)) , expected: (tensor(float16))

Also adding --half argument to detect.py

@glenn-jocher
Copy link
Member

@matbun detect.py --half handling only applies to pt, jit, engine backends:

yolov5/detect.py

Lines 96 to 100 in b3eaf50

# Half
half &= (pt or jit or engine) and device.type != 'cpu' # half precision only supported by PyTorch on CUDA
if pt or jit:
model.model.half() if half else model.model.float()

@glenn-jocher
Copy link
Member

@matbun @skprot good news 😃! Your original issue may now be fixed ✅ in PR #6268.

Usage example:

# Export
python export.py --weights yolov5s.pt --include onnx --simplify --inplace --device 0 --half

# Inference
python detect.py --weights yolov5s.onnx --device 0 --half
python val.py --weights yolov5s.onnx --data data.yaml --device 0 --half

To receive this update:

  • Gitgit pull from within your yolov5/ directory or git clone https://github.com/ultralytics/yolov5 again
  • PyTorch Hub – Force-reload model = torch.hub.load('ultralytics/yolov5', 'yolov5s', force_reload=True)
  • Notebooks – View updated notebooks Open In Colab Open In Kaggle
  • Dockersudo docker pull ultralytics/yolov5:latest to update your image Docker Pulls

Thank you for spotting this issue and informing us of the problem. Please let us know if this update resolves the issue for you, and feel free to inform us of any other issues you discover or feature requests that come to mind. Happy trainings with YOLOv5 🚀!

@matbun
Copy link

matbun commented Jan 11, 2022

@glenn-jocher Thank you! I confirm it works for me :)

@glenn-jocher
Copy link
Member

@matbun great!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants