利用mAP计算yolo精确度

当将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 npdef 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.shapewith 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())/2xmax=float(contline[1].strip())+float(contline[3].strip())/2ymin = float(contline[2].strip()) - float(contline[4].strip()) / 2ymax = float(contline[2].strip()) + float(contline[4].strip()) / 2#将坐标(0-1之间的值)还原回在图片中实际的坐标位置---因此YOLOv5格式保存到x, y, w, h都是归一化后xmin,xmax=w*xmin,w*xmaxymin,ymax=h*ymin,h*ymaxdatasets=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.rhkb.cn/news/145253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极简非凡react hooks+arcoDesign+vite后台管理模板

最近捣鼓了一个vite4搭建react18后台模板&#xff0c;搭载了字节团队react组件库Arco Design&#xff0c;整体编译运行顺滑衔接。支持多种模板布局、暗黑/亮色模式、国际化、权限验证、多级路由菜单、tabview标签栏快捷菜单、全屏控制等功能。 使用技术 "arco-design/web…

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

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

【面试经典150 | 数组】除自身以外数组的乘积

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;记录左右乘积空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到…

从 低信噪比陆上地震记录 解决办法收集 到 走时层析反演中的折射层析调研

目录 (前言1) 关于背景的回答:(前言2) 现有的降低噪声, 提高信噪比的一些特有方法的论文资料 (传统策略):1. 关于波形反演与走时层析反演2. 折射层析3. 用一个合成数据来解释折射层析反演的思路4. 其他层析反演方法:5. 关于层析反演的一些TIPS (可补充)参考文献: 降噪有关资料参…

Android 视频通话分析总结

1、WireShark 解析视频流 1.1 安装插件 下载rtp_h264_extractor.lua文件&#xff0c;放入Wireshark安装目录 下载地址&#xff1a;https://download.csdn.net/download/tjpuzm/88381821 在init.lua中添加如下代码 dofile(DATA_DIR.."rtp_h264_extractor.lua") 重新…

【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(其它指令)?

除了基础的 LDx 指令,还有 LDP、LDR 这些指令,我们也需要关注。 1 LDNP (SIMD&FP) 加载 SIMD&FP 寄存器对,带有非临时提示。该指令从内存加载一对 SIMD&FP 寄存器,向内存系统发出访问是非临时的提示。用于加载的地址是根据基址寄存器值和可选的立即偏移量计算…

【数据结构】逻辑结构与物理结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f333;逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构或网状结构 &#x1f333;物理结构 1.顺序存储结构 2.链式存储结构 结语 根据视点的不同,我…

华为ensp单臂路由及OSPF实验

单臂路由及OSPF实验 1.1实验背景 在这个实验中&#xff0c;我们模拟了一个复杂的网络环境&#xff0c;该网络环境包括多个子网和交换机。这个实验旨在帮助网络工程师和管理员了解如何配置单臂路由和使用开放最短路径优先&#xff08;OSPF&#xff09;协议来实现不同子网之间的…

【Java 进阶篇】MySQL 事务详解

在数据库管理中&#xff0c;事务是一组SQL语句的执行单元&#xff0c;它们被视为一个整体。事务的主要目标是保持数据库的一致性和完整性&#xff0c;即要么所有SQL语句都成功执行&#xff0c;要么所有SQL语句都不执行。在MySQL中&#xff0c;事务起到了非常重要的作用&#xf…

数据结构--栈的实现

数据结构–栈的实现 1.栈的概念和结构&#xff1a; 栈的概念&#xff1a;栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Las…

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群&#xff0c;开始。 前提条件&#xff0c;docker安装了docker-compose。如果没安装的话&#xff0c;参考这里 docker-compose文件参考bitnami官网&#xff1a;https://github.com/bitnami/contai…

GD32F10x的输出模式

1. 单片机型号的识别。 2. GPIO的输出模式。 1. 开漏模式 2.推挽模式 3.复用开漏模式 4.复用推挽模式。 开漏模式&#xff1a;&#xff08;写入位设置&#xff0c;输出数据寄存器来控制MOS&#xff09; 只有N-MOS管导通。PMOS不导通。 当N-MOS的栅极为0&#xff0c;N-MOS管…

Stm32_标准库_4_TIM中断_PWM波形_呼吸灯

基本原理 PWM相关物理量的求法 呼吸灯代码 #include "stm32f10x.h" // Device header #include "Delay.h"TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructuer;//结构体 GPIO_InitTypeDef GPIO_InitStructur…

uniapp iOS离线打包——上传到App Store

uniapp iOS离线打包&#xff0c;如何打包上传到App Store&#xff1f; 文章目录 uniapp iOS离线打包&#xff0c;如何打包上传到App Store&#xff1f;打包上传 App Store App iOS 离线打包 上一篇分享部分工程配置 打包上传 App Store 选中项目工程&#xff1a;点击 工具栏 P…

GitHub 基本操作

最近要发展一下自己的 github 账号了&#xff0c;把以前的项目代码规整规整上传上去&#xff0c;这里总结了一些经验&#xff0c;经过数次实践之后&#xff0c;已解决几乎所有基本操作中的bug&#xff0c;根据下面的操作步骤来&#xff0c;绝对没错了。&#xff08;若有其他问题…

排序算法之【快速排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

数据结构_链表

查询慢&#xff1a;链表中地址不是连续的&#xff0c;每次查询元素都必须从 头 开始查询增删快&#xff1a;链表结构&#xff0c;增加/删除一个元素&#xff0c;对链表的整体结构没有影响&#xff0c;所以增删快链表中的每一个元素也称为一个 节点一个节点包含了一个数据源&…

如何搭建团队知识库?试试新的工具和方法吧!

知识本身没有价值&#xff0c;只有被利用的知识才能发挥作用。我们经常见到有许多“宏伟”的团队知识库&#xff0c;但是从来没有人去用…… 搭建团队知识库 没有人用的团队知识库存在的问题是“我们知道所有问题的答案&#xff0c;就是不知道问题是什么”。如何建立团队知识库…

【Linux】——基操指令(二)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 man指令 cp 指令 mv指令 echo指令 cat指令 more指令 less指令 head和tail指令 head指令 tail指令 前言 上篇文章给大家讲解了Linux环境下的一点基操指令&#xf…

基于JAVA+SpringBoot的新闻发布平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着科技的飞速发展和…