opencv dnn推理yolov5-cls转换后的onnx分类模型

我的onnx 模型是yolov5-cls分类模型转换的,只有两个类别。
没转换之前使用yolov5 提供的脚本推理时,这两个类别标签都会输出,只是置信度不同。
使用OpenCV dnn对此onnx模型推理时,推理结果是一个数组,只有两个值,请问输出的这个数组当中的含义是什么呢?
而且推理了一堆样本后,对比以前pt模型文件推理的结果,区别非常大,输出的类别标签几乎是1,置信度也有很多超过1或者2的,这是什么问题呢?

备注一下:yolov5当时训练输入的imgsz为640

附上代码截图以及运行结果图。
希望能得到各位的指点,不胜感激!

img

img

  1. 首先说下你这代码,你这for循环里面读模型,每一一张图片都读一次模型做法有欠考虑。

    img

  2. 第二是输出结果,由于你是二分类,所以最终的结果就是长度为2的数组啊,从你打印的这个结果来看,是没有经过segmoid的结果,而如果你想要获取最终的分类置信度,你还需要对sigmoid的结果进行一次softmax。
  3. 图片预处理不一样,如果你看python源码你会发现,他在分类的时候预处理和检测分割的预处理不一样,他有经过均值和中间抠图步骤,而不是你这样直接的用blobFromimag()直接简单的进行resize。这也会导致你分类结果不太一样。

YOLOv5是一种先进的目标检测算法,而YOLOv5-CLS则是YOLOv5的一个变种,专门用于图像分类任务。为了在实际应用中使用YOLOv5-CLS模型,我们需要将其转换为Open Neural Network Exchange (ONNX) 格式,并使用OpenCV DNN库来进行推理。

步骤1: 安装OpenCV和ONNX
首先,你需要确保已经安装了OpenCV和ONNX。可以通过以下命令来安装:

pip install opencv-python
pip install onnx


步骤2: 转换YOLOv5-CLS为ONNX格式
在这一步,我们将使用YOLOv5的官方代码库将YOLOv5-CLS模型转换为ONNX格式。请按照以下步骤进行操作:

克隆YOLOv5的官方代码库:

git clone https://github.com/ultralytics/yolov5.git


进入yolov5目录,并下载预训练的YOLOv5-CLS模型权重:

cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s6.pt


运行export.py脚本来将模型转换为ONNX格式:

python export.py --weights yolov5s6.pt --include onnx --img 640


此步骤将生成一个名为'yolov5s6.onnx'的文件,这就是我们要使用的YOLOv5-CLS模型的ONNX版本。

步骤3: 使用OpenCV DNN进行推理
现在,我们已经准备好进行推理了。下面是一个简单的示例代码,展示了如何使用OpenCV DNN库加载和运行YOLOv5-CLS模型:

import cv2

# 加载YOLOv5-CLS模型
net = cv2.dnn.readNetFromONNX("yolov5s6.onnx")

# 加载图像
image = cv2.imread("test.jpg")

# 创建blob并设置输入
blob = cv2.dnn.blobFromImage(image, 1/255., (640, 640), swapRB=True)
net.setInput(blob)

# 进行推理
output = net.forward()

# 解析推理结果
classes = open("coco.names").read().strip().split("\n")
for detection in output[0, 0]:
    scores = detection[5:]
    class_id = np.argmax(scores)
    confidence = scores[class_id]
    if confidence > 0.5:
        label = f"{classes[class_id]}: {confidence:.2f}"
        print(label)

# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()


请注意,上述代码中我们假设已经有一个名为'test.jpg'的测试图像和一个包含类别名称的 'coco.names' 文件。

结论:
本文介绍了如何使用OpenCV DNN库来进行YOLOv5-CLS模型的推理。我们首先将YOLOv5-CLS模型转换为ONNX格式,然后使用OpenCV DNN库加载和运行该模型进行图像分类。通过按照本文提供的步骤和示例代码,你可以轻松地在实际应用中使用YOLOv5-CLS模型进行图像分类任务。