我转换YOLOv8检测(特别是best.pt检查点)模型到onnx formate,但我不知道如何获得边界框和信心。我也不知道模型是否正确转换。
我期待的形状是这样的|1、25200、7|最后一个数字是x,y,w,h,confidence,class0,class1。|1、5、5040|我不知道它是否正确,只是转置和7而不是5,因为我只有一个类,或者如果它是完全错误的,我搞砸了,而转换我尝试了2种类型的转换
import torch
import torchvision
import torch.onnx
from ultralytics import YOLO
from torchsummary import summary
m = YOLO("best.pt")
m.model.eval()
dummy_input = torch.randn(1, 3, 384, 640)
#first way of convertion
m.export(format="onnx",imgsz=[384,640], opset=12)
#second way of coversion
torch.onnx.export(m.model, dummy_input, "yolo5.onnx", verbose=True, opset_version=12)
字符串
这两种情况下我都得到了输出形状:|1、5、5040|这是型号modelsummary的netron图像这是正确的吗,只是移调它感觉不对什么是错的?
1条答案
按热度按时间nvbavucw1#
您的描述遗漏了问题。我假设您想了解Yolov 8 ONNX转换模型的输出格式以及如何在代码中使用它。我将选择C++实现作为答案,因为您也没有提到您正在使用的编程语言。
有两种替代方案:
1.让我们看一下https://github.com/mallumoSK/yolov8/blob/master/yolo/YoloDet.cpp。
detect
函数实现了将原始Yolov 8输出Tensor转换为检测对象的逻辑:字符串
它在引擎盖下使用
cv::dnn::NMSBoxes
。请注意,OpenCV DNN模块在默认情况下并不总是可用的。1.作为上述自定义脚本的替代方案,ONNXRuntime团队已经准备了一个使用NMS的优化Yolov 8检测模型(非最大抑制)* 直接内置于模型中 *(通过ONNXRuntime-Extensions包)。您可以找到模型here和对应的Android example。使用这种方法,您甚至不需要深入到兔子洞里去尝试理解Yolov 8的输出格式,因为该模型输出具有来自输入图像的分数的边界框。
我还没有测试哪一个更快,但我认为ONNXRuntime +内置的NMS应该会产生更好的性能。如果有人做基准测试,请告诉我。
请注意,与前几代产品相比,Yolov 8已经更改了输出格式(请参见以下行):
型