利用mAP计算yolo精确度

news2024/11/28 19:49:53

当将yolo算法移植部署在嵌入式设备上,为了验证算法的准确率。将模型测试的结果保存为txt文件(每一个txt文件,对应一个图片)。此外,需要将数据集中的标签由[x,y,w,h]转为[x1,y1,x2,y2]。最后,运行验证代码

标签格式转换

yolo格式的txt文件,保存的坐标信息是中心点和框的高宽。如果我们要进行训练和验证的话,那么需要将yolo格式的坐标进行转换成框的左上角的坐标和右下角的坐标。
在这里插入图片描述
转换原理和公式如下:
在这里插入图片描述

下面的代码-将数据集中的标签由[x,y,w,h]转为[x1,y1,x2,y2]

import cv2
import os
import numpy as np
     
def Xmin_Ymin_Xmax_Ymax(img_path,txt_path,save_path):
    """
    :param img_path: 图片文件的路径
    :param txt_path: 坐标文件的路径
    :return:
    """
    img = cv2.imread(img_path)
    # 获取图片的高宽
    h, w, _ = img.shape

    with open(save_path, "w+") as file:
        pass  # 什么都不写入文件,把txt文件的内容清空
    
    # 坐标转换,原始存储的是YOLOv5格式
    # from [x, y, w, h] normalized to [x1, y1, x2, y2]
    with open(txt_path, "r") as file:
        for line in file:
            # 在这里处理每一行的内容
            contline=line.split(' ')   
            #计算框的左上角坐标和右下角坐标,使用strip将首尾空格去掉
            xmin=float((contline[1]).strip())-float(contline[3].strip())/2
            xmax=float(contline[1].strip())+float(contline[3].strip())/2
        
            ymin = float(contline[2].strip()) - float(contline[4].strip()) / 2
            ymax = float(contline[2].strip()) + float(contline[4].strip()) / 2
        
            #将坐标(0-1之间的值)还原回在图片中实际的坐标位置---因此YOLOv5格式保存到x, y, w, h都是归一化后
            xmin,xmax=w*xmin,w*xmax
            ymin,ymax=h*ymin,h*ymax
            datasets=str(contline[0])+' '+str(xmin)+' '+str(ymin)+' '+str(xmax)+' '+str(ymax)+'\n'
            with open(save_path,'a') as fp:
                fp.write(datasets)

    # #打印查看保存后txt的内容
    # with open(save_path, "r") as file:
    #     for line in file:
    #         contline=line.split(' ')   
    #         print(contline)

    return (contline[0],xmin,ymin,xmax,ymax)

#将所有转换之后的实际坐标保存到新的txt文件当中
def writeXYToTxt():
    """
    :return:
    """
    imgsPath='input/images-optional'
    txtsPath='input/ground-truth_zxd'
    save_path='input/ground-truth/'
    imgs=os.listdir(imgsPath)
    txts=os.listdir(txtsPath)
    for img_,txt_ in zip(imgs,txts):
        img_path=os.path.join(imgsPath,img_)
        txt_path=os.path.join(txtsPath,txt_)
        Xmin_Ymin_Xmax_Ymax(img_path=img_path,txt_path=txt_path,save_path = save_path+txt_)

    
if __name__ == '__main__':
    writeXYToTxt()

参考链接:LabelImg标注的YOLO格式txt标签中心坐标和物体边界框长宽的转换

测试结果验证

使用PASCAL VOC 2012比赛中定义的mAP标准进行评判。通过计算真实标签中存在的每个类别的平均精度(AP),并计算mAP(平均精度)值以作为算法精度的性能指标。

TP TN FP FN的概念

  • TP(True Positives)意思就是被分为了正样本,而且分对了。
  • TN(True Negatives)意思就是被分为了负样本,而且分对了,
  • FP(False Positives)意思就是被分为了正样本,但是分错了(事实上这个样本是负样本)。
  • FN(False Negatives)意思就是被分为了负样本,但是分错了(事实上这个样本是正样本)。

mAP,其中代表P(Precision)精确率。AP(Average precision)单类标签平均(各个召回率中最大精确率的平均数)的精确率,mAP(Mean Average Precision)所有类标签的平均精确率。
备注:

  • mAP@0.5: mean Average Precision(IoU=0.5)。即将IoU设为0.5时,计算每一类的所有图片的AP,然后所有类别求平均,即mAP。
  • mAP@.5:.95(mAP@[.5:.95])表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。

准确率=预测正确的样本数/所有样本数,即预测正确的样本比例(包括预测正确的正样本和预测正确的负样本,不过在目标检测领域,没有预测正确的负样本这一说法,所以目标检测里面没有用Accuracy的)。

精确率也称查准率,Precision翻译成中文就是“分类器认为是正类并且确实是正类的部分占所有分类器认为是正类的比例”。

召回率Recall:和Precision一样,脱离类别是没有意义的。说道Recall,一定指的是某个类别的Recall。Recall表示某一类样本,预测正确的与所有Ground Truth的比例。
Recall翻译成中文就是“分类器认为是正类并且确实是正类的部分占所有确实是正类的比例”。
在这里插入图片描述

AP指单个类别平均精确度,而mAP是所有类别的平均精确度
AP事实上指的是,利用不同的Precision和Recall的点的组合,画出来的曲线下面的面积。
在这里插入图片描述
当我们取不同的置信度,可以获得不同的Precision和不同的Recall,当我们取得置信度够密集的时候,就可以获得非常多的Precision和Recall。此时Precision和Recall可以在图片上画出一条线,这条线下部分的面积就是某个类的AP值。
mAP就是所有的类的AP值求平均。

绘制mAP

第一:首先在github上下载绘制mAP所需的代码:https://github.com/Cartucho/mAP
第二:在下载的代码中,将模型预测结果的txt文件放在detection-results文件夹中。其中,预测标签的格式<class_name>
要注意的是:模型预测的置信度阈值要设置低一点,可以设置为0.05。
在这里插入图片描述
第二:在下载的代码中,将真实标签结果的txt文件放在ground-truth文件夹中。其中,真实标签的格式<class_name> []
在这里插入图片描述
第三:在下载的代码中,将原始图片放在image-optional文件夹中。其中,图片用于可视化,但是如果不需要可视化,可以不放在图片。
在这里插入图片描述

参考链接:
1、睿智的目标检测20——利用mAP计算目标检测精确度
2、史上最全AP、mAP详解与代码实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻松整理电脑文件:按大小归类保存,高效管理你的数据

你是否曾经在电脑中迷失在纷繁复杂的文件海洋中&#xff1f;你是否曾经花费大量时间搜索需要的文件&#xff0c;却发现它们并不在你想找的地方&#xff1f;如果你也遇到了这样的问题&#xff0c;那么是时候采取行动&#xff0c;对电脑文件进行整理和归类了。 首先。进入文件批…

问答区混赏金的集合贴

此贴专记录CSDN问答社区里面&#xff0c;一些回答者在临近结题时胡乱回答&#xff0c;只为分取结题赏金的人。 为了截图方便&#xff0c;给回答者点赞和点踩不是对其回答的认可和不认可&#xff0c;只是为了方便截图而已 文章目录 第一位——夜深人静的哝玛 (PS:与本人的头像和…

【CUDA编程概念】一、什么是bank conflict?

前言 搜了不少答案&#xff0c;大多是在避免Bank Conflict&#xff0c;很难找到一个关于Bank Conflict的详细定义&#xff0c;这里找了些资料来尝试解释下&#xff1b; 一、基础概念 先简单复习下相关概念 GPU调度执行流程&#xff1a; SM调度单位为一个warp&#xff08;一…

AI-FGNet降噪算法

上一篇文章介绍AI-CGNet降噪算法和AI-GruNet降噪算法&#xff0c;本篇文章介绍一个新的轻量级降噪做法AI-FGNet。 一、模型结构 AI-FGNet网络相比AI-GruNet&#xff0c;额外添加一层全连接实现特征的维度变换&#xff0c;作为频谱压缩、控制计算量的一种手段。此外&#xff0c…

Win11下无法打开丛林之狐,提示未检测到DirectX 8.1

新装的win11系统&#xff0c;打开丛林之狐提示未检测到DirectX 8.1. 运行dxdiag检查DirectX版本&#xff1a; DX版本已经是12了&#xff1a; 最终参考了这篇文章解决了&#xff1a; 罪恶都市出现XX-directx version 8.1处理方法 - 知乎 控制面板 > 程序 > 启用或关闭Wi…

(三) gitblit管理员手册

(一)gitblit安装教程 (二) gitblit用户使用教程 (三) gitblit管理员手册 目录 权限管理创建仓库时创建用户普通用户 管理员用户访问限制和访问权限仓库创建权限分配 Teams普通组管理员组 参考资料 权限管理 创建仓库时 选择指定的人员查看,克隆,推送 不允许fork 对应Anonymo…

9.30小任务

消息队列实现进程之间通信方式 实现了父子进程之间的通信 #include <myhead.h>//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int arg…

从私服上拉取jar包,就是拉取不下来

明明私服上有jar包&#xff0c;但是就是拉取不下来&#xff0c;原因有很多种&#xff0c;我这里分享一种情况&#xff0c;我是因为idea的maven配置忘记改过来了&#xff0c;如下&#xff1a; 因为setting配置文件是拷贝来的&#xff0c;嫌麻烦&#xff0c;配置文件里的本地仓库…

10链表-单链表构造LinkedList

目录 LeetCode之路——707. 设计链表 分析&#xff1a; Code&#xff1a; LeetCode之路——707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;n…

如何写一份完整的职业规划书?

写职业规划书&#xff0c;确定今后几年的一个发展方向&#xff08;职业规划建议越早越好&#xff09;&#xff0c;帮助自己收获更大的成功。普通的职业规划书书写起来十分简单&#xff0c;没有想象中那样复杂&#xff0c;只需要包括基本的部分&#xff0c;就可以轻轻松松完成。…

Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录 一、Docker-compose快速拉起demo测试环境 二、原生部署流程 安装MySQL&#xff1a;5.7数据库 安装openLDAP 修改域名&#xff0c;新增con.ldif 创建一个组织 安装OpenResty 下载后端 下载前端 部署后端 部署前端 三、管理动态字段 钉钉 企业微信 飞书 四、…

源码编译elfutils

编译环境 阿里云ubuntu20.04 编译步骤&#xff1a; 1 下载elfutils-0.170源码 2 解压 3 按照elfutils-0.170 (linuxfromscratch.org) 的描述&#xff0c;首先 ./configure --prefix/usr --program-prefix"eu-" 4 make 此时发生一个问题&#xff0c;报错&#x…

支付宝电脑网站支付,支付退款

一&#xff1a;支付宝退款 示例代码&#xff1a; AlipayClient alipayClient new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key&qu…

CSS 选择器Day01

CSS 定义&#xff1a;层叠样式表(Cascading Style Sheets&#xff0c;缩写为 CSS)&#xff0c;是一种用于定义网页或文档的外观和样式的标记语言。 CSS是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现 (美化内容)。它用于控制文本的字体、颜色、间距、布局、背景等各…

Java安全之servlet内存马分析

目录 前言 什么是中间键 了解jsp的本质 理解servlet运行机制 servlet的生命周期 Tomcat总体架构 查看Context 的源码 servlet内存马实现 参考 前言 php和jsp一句话马我想大家都知道&#xff0c;早先就听小伙伴说过一句话木马已经过时了&#xff0c;现在是内存马的天下…

力扣:114. 二叉树展开为链表(Python3)

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。…

【WebGIS实例】(11)Cesium自定义区域裁剪(挖除挖出)

前言 本篇博客完全参考cesium-地面裁剪(多个剪切面)_cesium clippingplane-CSDN博客&#xff0c;感谢孙霸天大佬提供的实现方法。在此博客的基础上&#xff0c;本篇博客做了以下工作&#xff1a; 修复点位集合逆时针和顺时针导致不同的结果的问题新增了挖出的实现方案创建裁切面…

算法基础课

第一讲 基础算法 快速排序 归并排序 二分 整数二分模板 关键------画一个仅有整数的一维横轴 bool check(int x) {/* ... */} // 检查x是否满足某种性质 // check()判断mid是否满足性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用&#xff1a; int bsearch_1(in…

数据结构--Trie字符串统计

1、“Trie树” 作用&#xff1a; 高效地存储和查找字符串集合的数据结构。 2、“Trie树” 存储字符串的形式如下&#xff1a; 用 “0” 来表示 “根节点&#xff08;root&#xff09;”。存入一个字符串时&#xff0c;会在字符串最后结尾的那个字符节点打上标记。比如&#x…

No163.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…