目标检测任务中根据真实坐标和预测坐标计算IOU

embedded/2024/12/21 20:05:03/

本文记录了在目标检测任务中根据目标的真实坐标和预测坐标计算 iou 交并比指标的代码。


文章目录

      • 一、代码


一、代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimgdef calculate_iou(real_label, predicted_label, img_width, img_height):"""计算交并比(IoU)。:param real_label: list, 真实标签 [class, x_center, y_center, width, height]:param predicted_label: list, 预测标签 [class, x_center, y_center, width, height]:param img_width: int, 图像的宽度:param img_height: int, 图像的高度:return: float, IoU值"""# 解码标签 (x_center, y_center, width, height -> x_min, y_min, x_max, y_max)def decode_bbox(label, img_width, img_height):_, x_center, y_center, width, height = label# 将归一化坐标转换为像素值x_center = x_center * img_widthy_center = y_center * img_heightwidth = width * img_widthheight = height * img_heightx_min = x_center - width / 2y_min = y_center - height / 2x_max = x_center + width / 2y_max = y_center + height / 2return [x_min, y_min, x_max, y_max]real_bbox = decode_bbox(real_label, img_width, img_height)predicted_bbox = decode_bbox(predicted_label, img_width, img_height)# 计算交集inter_x_min = max(real_bbox[0], predicted_bbox[0])inter_y_min = max(real_bbox[1], predicted_bbox[1])inter_x_max = min(real_bbox[2], predicted_bbox[2])inter_y_max = min(real_bbox[3], predicted_bbox[3])inter_area = max(0, inter_x_max - inter_x_min) * max(0, inter_y_max - inter_y_min)# 计算并集real_area = (real_bbox[2] - real_bbox[0]) * (real_bbox[3] - real_bbox[1])predicted_area = (predicted_bbox[2] - predicted_bbox[0]) * (predicted_bbox[3] - predicted_bbox[1])union_area = real_area + predicted_area - inter_area# 避免除零错误if union_area == 0:return 0# 计算IoUiou = inter_area / union_areareturn ioudef plot_bboxes(image_path, real_label, predicted_label, real_color='green', pred_color='red', linewidth=2):"""绘制真实标签和预测标签的边界框,并显示图片。:param image_path: str, 图片文件的路径:param real_label: list, 真实标签 [class, x_center, y_center, width, height]:param predicted_label: list, 预测标签 [class, x_center, y_center, width, height]:param real_color: str, 真实标签框的颜色:param pred_color: str, 预测标签框的颜色:param linewidth: int, 线宽"""# 读取图像img = mpimg.imread(image_path)img_height, img_width = img.shape[:2]  # 获取图像的宽高# 解码真实和预测框def decode_bbox(label, img_width, img_height):_, x_center, y_center, width, height = label# 将归一化坐标转换为像素值x_center = x_center * img_widthy_center = y_center * img_heightwidth = width * img_widthheight = height * img_heightx_min = x_center - width / 2y_min = y_center - height / 2x_max = x_center + width / 2y_max = y_center + height / 2return [x_min, y_min, x_max, y_max]real_bbox = decode_bbox(real_label, img_width, img_height)predicted_bbox = decode_bbox(predicted_label, img_width, img_height)# 创建图像和坐标轴fig, ax = plt.subplots(figsize=(8, 8))ax.imshow(img)# 绘制真实标签框real_rect = plt.Rectangle((real_bbox[0], real_bbox[1]),real_bbox[2] - real_bbox[0],real_bbox[3] - real_bbox[1],edgecolor=real_color, facecolor='none', linewidth=linewidth)ax.add_patch(real_rect)# 绘制预测标签框predicted_rect = plt.Rectangle((predicted_bbox[0], predicted_bbox[1]),predicted_bbox[2] - predicted_bbox[0],predicted_bbox[3] - predicted_bbox[1],edgecolor=pred_color, facecolor='none', linewidth=linewidth)ax.add_patch(predicted_rect)# 设置图像边界ax.set_xlim(0, img_width)ax.set_ylim(0, img_height)ax.invert_yaxis()  # 坐标系与图像坐标一致(左上角为原点)# 隐藏坐标轴和数字ax.axis('off')# 不显示标题plt.title('')# 不显示图例# plt.legend()  # 移除这行以不显示图例# 调整图像大小以填充整个画布plt.subplots_adjust(left=0, right=1, top=1, bottom=0)# 显示图像plt.show()# 示例用法
if __name__ == "__main__":image_path = 'D:\\images_origin\\0003501.jpg'  # 替换为实际图像路径real_label = [0, 0.653302, 0.643799, 0.693396, 0.712402]  # [class, x_center, y_center, width, height]predicted_label = [0, 0.658956, 0.658806, 0.682088, 0.673066]  # 示例预测标签# 计算IoUimg = mpimg.imread(image_path)img_height, img_width = img.shape[:2]iou = calculate_iou(real_label, predicted_label, img_width, img_height)print(f"IoU: {iou:.4f}")# 绘制边界框plot_bboxes(image_path, real_label, predicted_label, real_color='green', pred_color='yellow', linewidth=2)

http://www.ppmy.cn/embedded/147615.html

相关文章

Docker dockerfile镜像编码 centos7

一、 大多数docker基础镜像使用locale查看编码,发现默认编码都是POSIX,这会导致中文乱码。 解决方法如下: 二、首先使用locale -a查看容器所有语言环境 三、dockerfile中加入以下参数重新生成镜像   ENV LANGen_US.UTF-8   ENV TZAsia/Shanghai  …

react 项目打包二级目 使用BrowserRouter 解决页面刷新404 找不到路由

使用BrowserRouter package 配置 &#xff08;这部分代码可以不做配置也能实现&#xff09; {"homepage": "/admin",}vite.config 配置 export default defineConfig({base: /admin])BrowserRouter 添加配置项 <BrowserRouter basename/admin>&l…

24秋:数据采集-期末复习题:选择填空判断

数据采集技术 - 复习题 题型&#xff1a;单项选择题10道&#xff0c;30分&#xff0c;多项选择题5道&#xff0c;20分&#xff0c;判断题10道&#xff0c;20分&#xff0c;填空题5道&#xff0c;20分&#xff0c;程序题2道&#xff0c;10分。 一&#xff0e;单项选择题 1、传统…

lua dofile 传参数

cat 1.lua arg[1] 111 arg[2] 222 dofile(./2.lua) cat 2.lua print("First argument is: " .. arg[1]) print("Second argument is: " .. arg[2]) 执行 lua 1.lua&#xff0c;结果为&#xff1a; First argument is: 111 Second argument is: 222 l…

14篇--模板匹配

原理 模板匹配就是用模板图&#xff08;通常是一个小图&#xff09;在目标图像&#xff08;通常是一个比模板图大的图片&#xff09;中不断的滑动比较&#xff0c;通过某种比较方法来判断是否匹配成功。 匹配方法 1. 平方差匹配TM_SQDIFF 以模板图与目标图所对应的像素值使用…

android、flutter离线推送插件,支持oppo、vivo、小米、华为

项目说明 项目地址&#xff1a;https://github.com/haomiao33/ym_flutter_push 起因 目前github上面搜索发现没有合适的flutter和android 推送原生插件&#xff0c;所以自己参考和借鉴了(https://github.com/taoweiji/MixPush)项目&#xff0c;这个mixpush太老了&#xff0c…

JVM(Java虚拟机)分区详情

JVM(Java虚拟机)运行时数据区是Java虚拟机的内存管理模型,它包括了多个关键的内存区域,这些区域各自承担着不同的职责,共同支持着Java程序的运行。以下是JVM运行时数据区的详细介绍: 一、整体概述 JVM运行时数据区按照线程占用的情况可以分为两类:线程共享和线程独享。…

Day41 动态规划part08

股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。 121. 买卖股票的最佳时机 视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 代码随想录 方法1:贪心算法 class Solution {public int maxProfit(int[] prices) {int low = Intege…