yolov5和yolov8 目标检测模型 输出张量的说明

1.下图为yolov5输出张量说明

float[1,25200,85]

1为batch

25200可以理解为 25200=(80∗80+40∗40+20∗20)∗3

输入图像的尺寸是 640x640 像素,那么根据不同尺度的输出(通常 YOLOv5 有三个不同尺度的输出),这些网格的尺寸会按 8、16、32 的步长划分,分别对应 80x80、40x40 和 20x20 的网格。因此,对于每个尺度:

  • 80x80 的网格有 6400 个单元格(80 * 80)
  • 40x40 的网格有 1600 个单元格(40 * 40)
  • 20x20 的网格有 400 个单元格(20 * 20)

如果模型为每个网格预测 3 个边界框,那么总的单元格数为:

6400(80x80网格)+ 1600(40x40网格)+ 400(20x20网格)= 8400 个单元格

然后乘以每个网格预测的边界框数量 3,得到 25200(8400 * 3)。

85代表为边界框的x位置,y位置,宽,高,每个类别置信度,

2.yolov8输出张量说明

float[1,84,8400]

1为batach

84为x位置,y位置,

首先,需要将YOLOv5输出张量转换为可读的坐标类别信息。这个过程可以使用以下步骤来完成: 1. 从YOLOv5输出张量中提取坐标类别信息。这需要根据YOLOv5输出格式进行解析。通常情况下,YOLOv5输出张量是一个4维张量,其中第1维表示批次大小,第2维表示的数量,第3维表示的属性(如中心坐标、宽度、高度等),第4维表示类别预测概率。 2. 将坐标信息转换为实际图像中的坐标。这需要根据图像的大小YOLOv5模型的输入大小进行缩放。例如,如果模型输入大小为416x416,而图像大小为800x600,则需要将坐标信息缩放为800/416倍。 3. 将类别预测概率转换为实际类别。这需要根据YOLOv5模型训练时使用的类别标签进行转换。 4. 将解析后的坐标信息类别信息绘制在原始图像上。这可以使用OpenCV的绘图函数来完成。例如,可以使用cv::rectangle函数绘制矩形,使用cv::putText函数绘制类别标签。 下面是一个示例代码,用于解析YOLOv5输出张量并绘制检测结果: ```C++ // 假设YOLOv5输出张量为output,图像大小为img_size,类别标签为class_labels // 假设每个的属性为(x, y, w, h),其中(x, y)表示矩形中心坐标,(w, h)表示矩形的宽度高度 const float* output_data = output.ptr<float>(0); // 获取输出数据指针 const int num_boxes = output.size[1]; // 获取的数量 // 遍历所有 for (int i = 0; i < num_boxes; ++i) { int offset = i * (5 + class_labels.size()); // 计算当前的偏移量 // 获取的属性 float x = output_data[offset + 0]; float y = output_data[offset + 1]; float w = output_data[offset + 2]; float h = output_data[offset + 3]; // 将属性转换为实际坐标 x *= img_size.width; y *= img_size.height; w *= img_size.width; h *= img_size.height; // 计算矩形的左上角右下角坐标 cv::Point pt1(x - w / 2, y - h / 2); cv::Point pt2(x + w / 2, y + h / 2); // 获取类别预测概率 std::vector<float> class_probs(class_labels.size()); for (int j = 0; j < class_labels.size(); ++j) { class_probs[j] = output_data[offset + 5 + j]; } // 获取最大概率的类别 int max_class_idx = std::distance(class_probs.begin(), std::max_element(class_probs.begin(), class_probs.end())); std::string class_label = class_labels[max_class_idx]; // 绘制矩形类别标签 cv::rectangle(img, pt1, pt2, cv::Scalar(0, 255, 0), 2); cv::putText(img, class_label, pt1, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值