YOLOv5~目标检测模型精确度

news2024/10/7 14:28:46

还是yolo5的基础啊~~ 一些关于目标检测模型的评估指标:IOU、TP&FP&FN&TN、mAP等,并列举了目标检测中的mAP计算。

指标评估(重要的一些定义)

IOU

 也称重叠度表示计算预测回归框和真实回归框的交并比,计算公式如下: 

TP&FP&FN&TN

 

指标的一些基本概念:

  • TP(True Postives):分类器把正例正确的分类-预测为正例。(IOU >=  阈值)

  • FN(False Negatives):分类器把正例错误的分类-预测为负例。(IOU <  阈值)

  • FP(False Postives):分类器把负例错误的分类-预测为正例

  • TN(True Negatives):分类器把负例正确的分类-预测为负例(_yolov5中没有应用到_)

yolov5中没有应用TN的原因: TN代表的是所有可能的未正确检测到的边界框。然而在yolo在目标检测任务中,每个网格会生成很多的预测边界框,有许多的预测边界框是没有相应的真实标签框,导致未正确检测到的边界框数量远远大于正确检测到的边界框,这就是为什么不使用TN的原因。

threshold:  depending on the metric, it is usually set to 50%, 75% or 95%.

Precision

Precision 定义:模型识别相关目标的能力。分类正确的样本在所有样本中的数量比例,公式如下:

 

Recall

Recall 定义:是模型找到真实回归框(即标签标注的框)的能力。计算公式如下:

mAP

多标签图像分类任务中图片的标签不止一个,因此评价不能用普通单标签图像分类的标准,即mean accuracy,该任务采用的是和信息检索中类似的方法—mAP,虽然其字面意思和mean average precision看起来差不多,但是计算方法要繁琐得多,mAP 会统计所有 Confidence 值下的 PR值,而实际使用时,会设定一个 Confidence 阈值,低于该阈值的目标会被丢弃,这部分目标在统计 mAP 时也会有一定的贡献

Confidence(置信度):在统计学中,一个概率样本的置信区间(Confidence interval)是对这个样本的某个总体参数的区间估计。置信区间展现的是这个参数的真实值有一定概率落在测量结果的周围的程度。置信区间给出的是被测量参数测量值的可信程度范围,即前面所要求的“一定概率”。这个概率也被称为置信水平。

(红色曲线代表,人为的方式将PR曲线变成单调递减,使得计算面积更容易。) 

  • AP(Average Percision):AP为平均精度,指的是所有图片内的具体某一类的PR曲线下的面积(横轴为Recall,纵轴为Precision)。

  • AP衡量的是对一个类检测好坏,mAP就是对多个类的检测好坏。在多类多目标检测中,计算出每个类别的AP后,再除于类别总数,即所有类别AP的平均值,比如有两类,类A的AP值是0.5,类B的AP值是0.2,那么 =(0.5+0.2)/2=0.35。

  • MAP: 是指所有图片内的所有类别的AP的平均值,map越高代表模型预测精度值越高。

  • 目标检测中的mAP计算

    yolov5计算IOU源码解析

    源代码地址:https://github.com/Oneflow-Inc/one-yolov5/blob/main/utils/metrics.py#L224-L261

    # 计算两框的特定iou (DIou, DIou, CIou)   
    def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-7):  
        # Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)  
    
        # Get the coordinates of bounding boxes 下面条件语句作用是:进行坐标转换从而获取yolo格式边界框的坐标  
        if xywh:  # transform from xywh to xyxy  
            (x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, 1), box2.chunk(4, 1)  
            w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2  
            b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_  
            b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_  
        else:  # x1, y1, x2, y2 = box1  
            b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, 1)  
            b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, 1)  
            w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1  
            w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1  
          
        # Intersection area 获取两个框相交的面积。  
        """  
        left_line = max(b1_x1, b2_x1)  
        reft_line = min(b1_x2, b2_x2)  
        top_line = max(b1_y1, b2_y1)  
        bottom_line = min(b1_y2, b2_y2)  
        intersect = (reight_line - left_line) * (bottom_line - top_line)  
        """  
        inter = (flow.min(b1_x2, b2_x2) - flow.max(b1_x1, b2_x1)).clamp(0) * \  
                (flow.min(b1_y2, b2_y2) - flow.max(b1_y1, b2_y1)).clamp(0)  
          
        # Union Area  两个框并到面积  
        union = w1 * h1 + w2 * h2 - inter + eps  
          
        # IoU   
        iou = inter / union  
        if CIoU or DIoU or GIoU:  
            cw = flow.max(b1_x2, b2_x2) - flow.min(b1_x1, b2_x1)  # convex (smallest enclosing box) width  
            ch = flow.max(b1_y2, b2_y2) - flow.min(b1_y1, b2_y1)  # convex height  
            if CIoU or DIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1  
                c2 = cw ** 2 + ch ** 2 + eps  # convex diagonal squared  
                rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center dist ** 2  
                if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pyflow.blob/master/utils/box/box_utils.py#L47  
                    v = (4 / math.pi ** 2) * flow.pow(flow.atan(w2 / (h2 + eps)) - flow.atan(w1 / (h1 + eps)), 2)  
                    with flow.no_grad():  
                        alpha = v / (v - iou + (1 + eps))  
                    return iou - (rho2 / c2 + v * alpha)  # CIoU  
                return iou - rho2 / c2  # DIoU  
            c_area = cw * ch + eps  # convex area  
            return iou - (c_area - union) / c_area  # GIoU https://arxiv.org/pdf/1902.09630.pdf  
        return iou  # IoU  
    
    

    yolov5计算AP源码逐行解析

    源代码地址:

    https://github.com/Oneflow-Inc/one-yolov5/blob/main/utils/metrics.py#L96-L121

    # 根据PR曲线计算AP   
    def compute_ap(recall, precision):  
        """ Compute the average precision, given the recall and precision curves  
        # Arguments  
            recall:    The recall curve (list)  
            precision: The precision curve (list)  
        # Returns  
            Average precision, precision curve, recall curve  
        """  
    
        # Append sentinel values to beginning and end 将开区间给补上,补成闭合的区间。  
        mrec = np.concatenate(([0.0], recall, [1.0]))   
        mpre = np.concatenate(([1.0], precision, [0.0]))  
          
        # Compute the precision envelope   
        """  
        人为的把PR曲线变成单调递减的,例如:  
        np.maximum(accumulate(np.array([21, 23, 18, 19, 20, 13, 12, 11]) ) => np.array([23, 23, 20, 20, 20, 13, 12, 11])  
        """  
        mpre = np.flip(np.maximum.accumulate(np.flip(mpre)))  
          
        # Integrate area under curve  
        method = 'interp'  # methods: 'continuous', 'interp'  
        if method == 'interp': # 默认采用 interpolated-precision 曲线,  
            x = np.linspace(0, 1, 101)  # 101-point interp (COCO)  
            ap = np.trapz(np.interp(x, mrec, mpre), x)  # integrate  
        else:  # 'continuous'  
            i = np.where(mrec[1:] != mrec[:-1])[0]  # points where x axis (recall) changes  
            ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])  # area under curve  
          
        return ap, mpre, mrec  
    

whaosoft aiot  http://143ai.com 

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

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

相关文章

2022CTF培训(二)Hook进阶反调试

附件下载链接 Hook进阶 更精准的 Inline Hook 要求 实现防止任务管理器对某进程自身的结束要求不影响任务管理器结束其它进程的功能 Dll 注入程序编写 提权 主要过程如下&#xff1a; 首先,程序需要调用OpenProcessToken函数打开指定的进程令牌&#xff0c;并获取TOKEN…

【架构设计】作为架构师你应该掌握的画图技术

1.前言 大家知道&#xff0c;架构的过程其实就是建模的过程&#xff0c;那自然离不开架构图。那么&#xff0c;我们先来看几个问题。 &#xff08;1&#xff09;什么是架构图&#xff1f; 架构图 架构 图&#xff0c;用图的形式把系统架构展示出来&#xff0c;配上简单的文…

Rust学习笔记——安装、创建、编译、输入输出

目录 一.安装 二.创建 三.编译 四.输入输出 &#xff08;一&#xff09;.输出hello world &#xff08;二&#xff09;.输入 一.安装 Rust Programming Language (rust-lang.org)&#xff0c;这是Rust官网。 直接下载自己对应系统版本即可&#xff0c;小编是linux版。 下…

ARP协议map4(3层网络层的协议)

数据来源 一、广播与广播域概述 1、广播域广播域 广播&#xff1a;将广播地址做为目标地址的数据帧 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合&#xff08;广播域越小越好&#xff0c;这样通信效率更高&#xff09; 下图每个圈都是一个广播域&#xff0c;说…

通关算法题之 ⌈数组⌋ 上

滑动窗口 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 输入: s "abcabcbb" 输出: 3 这就是变简单了&#xff0c;连 need 和 valid 都不需要&#xff0c;而且更新窗口内数据也只需要简单的更新计数器 …

(续)SSM整合之SSM整合笔记(ContextLoaderListener)(P179-188)

一 准备工作 1 新建模块ssm com.atguigu.ssm 2 导入依赖 <packaging>war</packaging><properties><spring.version>5.3.1</spring.version> </properties><dependencies><dependency><groupId>org.springframew…

Day10--初步实现自定义tabBar的效果

承接上文配置信息之后。 1.添加tabBar代码文件 我的操作&#xff1a; 1》在文件区新建一个custom-tab-bar文件夹 2》并在其中新建一个index组件 3》文件区展示图 4》最终的效果图&#xff1a; **************************************************************************…

界面组件DevExpress Reporting v22.1亮点 - 报表设计器功能全面升级

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting v22.1版本已正式发布&am…

数据结构之二叉树(前提知识)

文章目录前言**一、树****二、树的相关概念****节点的度****叶节点****分支节点****子节点****父节点****兄弟节点****树的度****节点的层****树的高度****祖先****子孙****森林****三、树的表示****孩子表示法****左孩子右兄弟法****双亲表示法****四、树在实际中的应用****总…

iPhone/iPad屏幕投屏镜像到PC或Mac上面教程分享

AirServer是一款Mac应用程序&#xff0c;可将AirPlay / AirTunes的音频&#xff0c;视频&#xff0c;照片&#xff0c;幻灯片和镜像接收功能添加到Mac电脑。它可以实现将iPhone手机或Mac电脑上的媒体文件以及其他操作投射到Mac电脑上。使用AirServer&#xff0c;可以从Mac&…

如何利用DGL官方库中的rgcn链接预测代码跑自己的数据集(如何在DGL库的链接预测数据集模块定义自己的数据集类)

最近在忙我的省创&#xff0c;是有关于知识图谱的&#xff0c;其中有一个内容是使用rgcn的链接预测方法跑自己的数据集&#xff0c;我是用的dgl库中给出的在pytorch环境下实现rgcn的链接预测的代码&#xff0c;相关链接贴在这里&#xff1a; dgl库中关于rgcn的介绍文档 dgl库…

联盟快应用-如何进行测试?

官方文档&#xff1a;快应用-无需安装&#xff0c;即点即用-厂商联盟官方网站 什么是快应用&#xff1f; 可以简单理解为是另一种小程序。 快应用是一种新的应用形态&#xff0c;以往的手机端应用主要有两种方式&#xff1a;网页、原生应用&#xff1b;网页无需安装&#xff…

阻塞车间调度

阻塞车间调度 当前机器上的作业处理必须保留在该机器上&#xff0c;直到下一台机器可用于处理为止。也就是说如果该作业要执行的下一个工序的机器被使用&#xff0c;则该机器必须被占用。 n个作业必须在m个机器f个工厂上进行处理&#xff0c;在每一个工厂中连续机器之间没有缓…

Android11 framework Handler

Android11 framework Handler引言Handler工作流程MessageQueue主要函数Looper主要函数思考1.一个线程有几个handler&#xff0c;有几个looper2.为什么handler会有内存泄漏3.如果想要在子线程new Handler怎么做&#xff1f;4.子线程中的loop如果消息队列中没有消息处理的时候怎么…

深入底层学git:目录中包含的秘密

1.Git简介 Git具有最优的存储能力&#xff0c;在没有远端git服务器的情况下&#xff0c;git本地就可以独立作为版本管控系统&#xff0c;这其中.git裸仓库中起了关键作用&#xff0c;那么我们一起来看看.git下都放了哪些文件。 打开Git Bash&#xff0c;切换到项目目录&#x…

王道考研——操作系统(第二章 进程管理)(进程;线程)

一、进程的概念、组成、特征 进程的概念 进程的组成——PCB 进程的组成——程序段、数据段 知识滚雪球&#xff1a;程序是如何运行的&#xff1f; 进程的组成 进程的特征 知识回顾与重要考点 二、进程的状态与转换 进程的状态——创建态、就绪态 进程的状态——运行态 进程的…

刷题日记【第十二篇】-笔试必刷题【洗牌+MP3光标位置+年终奖+迷宫问题】

洗牌【编程题】 import java.util.*;public class Main {// 左: i --> 2*i;// 右: in --> 2*i 1;private static void playCard(int[] cards, int n, int k ) {for (int i 0; i < k; i) {//一次洗牌的顺序int[] newCards new int[cards.length];//遍历编号为0-n-1…

【Servlet】2:认识一下Web服务器——Tomcat

目录 第三章 | Tomcat 认识与配置 | 章节概述 | HTTP服务器概述 | Tomcat 安装与配置 | Tomcat 的目录结构、端口号 第四章 | Tomcat 基本使用 | 章节概述 | 本地Tomcat 静态资源网站访问 | IDEATomcat 静态资源网站访问 | IDEA中最基础web项目的目录结构 本文章属于后…

从零开始操作系统-07:APIC

这一节主要主要是APIC。 所需要的文件在Github&#xff1a;https://github.com/yongkangluo/Ubuntu20.04OS/tree/main/Files/Lec7-ExternalInterrupt 历史方法&#xff1a;PIC&#xff08;Programmable Interrupt Controller&#xff09; Intel 8259&#xff1a; APIC&#…

小侃设计模式(十三)-策略模式

1.概述 策略模式&#xff08;Strategy Pattern&#xff09;是一种比较简单的模式&#xff0c;它定义了算法家族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;此模式让算法的变化&#xff0c;不会影响到使用算法的客户。策略模式具有较强的实用性&a…