Python目标检测模型IoU准确度计算实战

不晚
不晚
发布时间:2026-10-13 | 6人浏览过
原创

本文详解基于交并比(IoU)的目标检测模型性能评估方法。通过构建二值掩膜计算预测框与真实框的交集与并集,结合0、0.3、0.5、0.7等阈值统计正确检测与漏检数量,从而量化模型在不同严格度下的预测准确度。

IoU评估原理与几何定义

完成目标检测模型的训练后,必须对其性能进行量化评估,重点考察在不同阈值设定下的预测准确度以及是否存在漏检现象。本文采用交并比(Intersection over Union, IoU)作为核心指标来进行计算与分析。

本文旨在提供一套可行的评估思路,若内容对您有帮助,欢迎点赞支持。

IoU数值直观反映了系统预测边界框与原始图片中标注的真实边界框之间的重合程度。其中,系统预测框是通过对测试数据集运行目标检测模型所获得的识别结果。

IoU的计算逻辑为检测结果(DetectionResult)与真实标注(GroundTruth)的交集面积除以两者的并集面积,具体几何关系如下图所示:

图中蓝色框代表GroundTruth(真实标注框)。

图中黄色框代表DetectionResult(模型预测框)。

图中绿色框代表DetectionResult与GroundTruth的交集部分(DetectionResult ⋂ GroundTruth)。

图中红色框代表DetectionResult与GroundTruth的并集部分(DetectionResult ⋃ GroundTruth)。

基于阈值的准确度统计流程

基本处理流程如下:首先读取原始图像中标注的框信息,针对每一张测试图片,提取指定类别的标注框,并与测试集上模型识别出的预测框进行比对。计算每对框的IoU值,选取最大值作为当前标注框的IoU得分。随后,依据预设的阈值(包括0、0.3、0.5、0.7)进行统计,得出每个阈值下被判定为正确检测(即IoU值大于该阈值)的框数量,最后结合原始标注框总数计算各阈值下的准确度。

在计算IoU的具体实现中,通过构建背景全为0、框区域为1的二值图像来辅助计算。分别利用原始标注框和测试识别框生成两张这样的二值图,将两者相加后,重叠区域的像素值变为2。通过统计值为2的区域大小即可得到交集面积,进而结合并集面积计算出IoU值。

相关构建与计算代码如下:

Python实现代码解析


#读取txt-标准txt为基准-分类别求阈值-阈值为0. 0.3 0.5 0.7的统计
import glob
import os
import numpy as np
 
#设定的阈值
threshold1=0.3
threshold2=0.5
threshold3=0.7
 
#阈值计数器
counter0=0
counter1=0
counter2=0
counter3=0
 
stdtxt=''#标注txt路径
testtxt=''#测试txt路径
 
txtlist=glob.glob(r'%s\*.txt' %stdtxt)#获取所有txt文件
for path in txtlist:#对每个txt操作
  
  txtname=os.path.basename(path)[:-4]#获取txt文件名
  label=1
  eachtxt=np.loadtxt(path) #读取文件
  for line in eachtxt:
    if line[0]==label:
      #构建背景为0框为1的图
      map1=np.zeros((960,1280))
      map1[line[2]:(line[2]+line[4]),line[1]:(line[1]+line[3])]=1
      
      testfile=np.loadtxt(testtxt + txtname + '.txt')
      c=0
      iou_list=[]#用来存储所有iou的集合
      for tline in testfile:#对测试txt的每行进行操作
        if tline[0]==label:
          c=c+1
          map2=np.zeros((960,1280))
          map2[tline[2]:(tline[2]+tline[4]),tline[1]:(tline[1]+tline[3])]=1
          map3=map1+map2
          a=0
          for i in map3:
            if i==2:
              a=a+1
          iou=a/(line[3]*line[4]+tline[3]*tline[4]-a)#计算iou
          iou_list.append(iou)#添加到集合尾部
          
      threshold=max(iou_list)#阈值取最大的
      #阈值统计
      if threshold>=threshold3:
        counter3=counter3+1
      elif threshold>=threshold2:
        counter2=counter2+1
      elif threshold>=threshold1:
        counter1=counter1+1
      elif threshold<threshold1:#漏检
        counter0=counter0+1

以上关于Python目标检测模型预测准确度计算方式(基于IoU)的内容即为完整分享,希望能为您提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表