YoloV5 模型自定义评估-误报、漏报、错报

YOLOv5的Tricks | 【Trick14】YOLOv5的val.py脚本的解析 如有问题,恳请指出。这篇可能是这个系列最后的一篇了,最后把yolov5的验证过程大致的再介绍介绍,基本上把yolov5的全部内容就稍微过了一遍了,也是我自己对这个项目学习的结束。(补充一下,这里我介绍的yolov5-6.0版本的代码)这个脚本主要分为是三个部分:主体代码运行部分 + 指标计算部分 + 绘图部分,这里就主要介绍前两个部分的内容。细节比较多,比上一篇的detect.py脚本复杂很多,这里写得困难逻辑也不会很清晰,简单做个记录,方便日后自己回忆。在训练阶段每个batch训练结束后,都会调用一次va 阅读详情

YoloV5模型训练成功后,可以通过自带的val.py文件进行评估分析,其提供mAp、Iou以及混淆矩阵等,很好,但是……领导不认可……/(ㄒoㄒ)/~~。领导要的是最直观的东西,比如这个模型识别目标的准确率,还有误报率等……。那么,领导的要求就是我们开发的方向:

为了得到准确率以及误报、漏报、错报的情况,需要使用模型检测已经标注过的样本,将检测结果与标注进行比对。

YoloV5的val.py文件已经实现了大部分功能,可以直接拿来改造:

首先,原文件中对预测结果的NMS处理函数调用如下:

out = non_max_suppression(out, conf_thres, iou_thres, labels=lb, multi_label=True, agnostic=single_cls)

val.py本来的一个作用就是与train.py配合,在模型迭代训练过程中提供评估,但是我们这里不需要处理太多可能,只要置信度最高的就好了,修改如下:

out = non_max_suppression(out, conf_thres, iou_thres, multi_label=False, agnostic=single_cls)

然后将检测结果与标注结果做对比,原代码中是在process_batch这个函数中进行处理,计算所有的检测框和标注框的IoU,根据检测类比和标注类别再进行处理。这里做一下改造,代码如下:

def process_batch(batch_i, detections, labels, iouv):
    """
    Return correct predictions matrix. Both sets of boxes are in (x1, y1, x2, y2) format.
    Arguments:
        detections (Array[N, 6]), x1, y1, x2, y2, conf, class
        labels (Array[M, 5]), class, x1, y1, x2, y2
    Returns:
        correct (Array[N, 10]), for 10 IoU levels
    """

    # 正确:0   误报: 1   漏报: 2    错报: 3
    labelNum = labels.shape[0]
    detectNum = detections.shape[0]
    if labelNum == 0 and detectNum == 0:
        return 0
    elif labelNum == 0: #存在误报
        results = torch.zeros(detectNum, 6 , dtype=torch.float, device=iouv.device)
        results[:,0] = batch_i
        results[:,1] = 1
        results[:,2] = detections[:, 5]   #检测类别
        results[:,3] = -1.0                 #标注类别
        #results[:,4] = 0.0                 #检测框和标注框的IoU
        results[:,5] = detections[:, 4]   #检测置信度
        return results
    elif detectNum == 0:  #存在漏报
        results = torch.zeros(labelNum, 6, dtype=torch.float, device=iouv.device)
        results[:,0] = batch_i
        results[:,1] = 2
        results[:,2] = -1.0                #检测类别
        results[:,3] = labels[:, 0]      #标注类别
        #results[:,4] = 0.0                 #检测框和标注框的IoU
        #results[:,5] = 0.0                 #检测置信度
        return results
    else:
        tempresults = torch.zeros(0, 6, dtype=torch.float, device=iouv.device)
        indexes = torch.zeros(1, detectNum, dtype=torch.float, device=iouv.device)
        validNum = 0
        i=0 
        for label in labels:
            j=0
            bMatchLabel = False
            for detect in detections:
                iou = singlebox_iou(label[1:], detect[:4])
                if iou > 0.5:
                    bMatchLabel = True
                    indexes[:,j] = 1.0
                    validNum += 1
                    result = torch.zeros(1, 6 , dtype=torch.float, device=iouv.device)
                    result[:,0] = batch_i
                    result[:,1] = 0 if detect[5] == label[0] else 3
                    result[:,2] = detect[5]     #检测类别
                    result[:,3] = label[0]      #标注类别
                    result[:,4] = iou           #检测框和标注框的IoU
                    result[:,5] = detect[4]     #检测置信度
                    #tempresults.append(result)
                    tempresults = torch.cat((tempresults, result), 0)
                j += 1
            i += 1
            if not bMatchLabel:  #如果有标注狂没有匹配到检测框的为漏报
                validNum += 1
                result = torch.zeros(1, 6 , dtype=torch.float, device=iouv.device)
                result[:,0] = batch_i        
                result[:,1] = 2
                result[:,2] = -1.0          #检测类别
                result[:,3] = label[0]      #标注类别
                #tempresults.append(result)
                tempresults = torch.cat((tempresults, result), 0)

        #如果有检测框没有匹配到标注框的为误报
        noMatchDect = indexes[0][(indexes[0] == 0).nonzero()]
        if noMatchDect.shape[0] > 0:
            for index in noMatchDect:
                result = torch.zeros(1, 6 , dtype=torch.float, device=iouv.device)
                i = int(index[0])
                result[:,0] = batch_i
                result[:,1] = 1
                result[:,2] = detections[i][5]   #检测类别
                result[:,3] = -1.0               #标注类别
                result[:,5] = detections[i][4]   #检测置信度
                #tempresults.append(result)
                tempresults = torch.cat((tempresults, result), 0)

        return tempresults

还得解释一下这里对误报、漏报、错报的定义:

误报:没有标注,但是检测出目标

漏报:有标注,但是没检测出目标

错报:有标注,和检测目标的类别不一样

所有样本处理完后进行统计,统计每个类别的误报、漏报数量,以及错报(其实混淆矩阵就是这个功能,只不过这里用的是数量),代码如下:

def analyse(totalResults, names, save_dir):
    classnames =[]
    for i in range(len(names)):
        classnames.append(str(names[i]))
        
    #误报
    misIndexes = torch.where(totalResults[:,1] == 1.0)
    misItems = totalResults[misIndexes]
    misStats = torch.zeros(1, len(names), dtype=torch.int, device=totalResults.device)
    line = "误报- "
    for i in range(len(names)):
        n = len(torch.where(misItems[:,2] == i)[0])
        misStats[:,i] = n
        line += names[i] + ":" + str(n) +" "

    print(line + "\n")

    #plt.rcParams['font.sans-serif']=['SimHei']
    #plt.style.use('ggplot')
    #plt.title("误报")
    #plt.xlabel("异物类别")
    #plt.ylabel("数量")
    #plt.bar(classnames, misStats[0].tolist(), width=1.2, color='blue')
    #plt.savefig(str(save_dir) + "/evaluates/误报.jpg")

    #漏报
    failIndexes = torch.where(totalResults[:,1] == 2.0)
    failItems = totalResults[failIndexes]
    failStats = torch.zeros(1, len(names), dtype=torch.int, device=totalResults.device)
    line = "漏报- "
    for i in range(len(names)):
        n = len(torch.where(failItems[:,3] == i)[0])
        failStats[:,i] = n
        line += names[i] + ":" + str(n) +" "

    #plt.title("漏报")
    #plt.xlabel("异物类别")
    #plt.ylabel("数量")
    #plt.bar(classnames, failStats[0].tolist(), width=1.2, color='blue')
    #plt.savefig(str(save_dir) + "/evaluates/漏报.jpg")

    print(line + "\n")

    #错报
    errorIndexes  = torch.where(totalResults[:,1] == 3.0)
    errorItems = totalResults[errorIndexes]
    errorStats = torch.zeros(len(names), len(names), dtype=torch.int, device=totalResults.device)
    for item in errorItems:
        errorStats[int(item[2]), int(item[3])] += 1

    print("错报- \n")
    print(errorStats)

YOLOv5源码逐行超详细注释与解读(4)——验证部分val(test).py 全网最详细的YOLO源码解读之验证部分val.py。全文近5万字,代码逐行注释,逐段精讲!小白0基础必看! 阅读详情

相关推荐

YOLOV5代码精读之val.py

这段代码的主要功能是执行不同的任务(训练、验证、测试、速度基准测试和研究)以评估YOLOv5模型。它根据用户的输入选项进行适当的环境检查、任务执行和结果记录。此代码不仅确保模型的运行符合预期,还提供了警告以避免常见的错误配置(如置信度阈值过高等),并支持结果的高效管理与评估。该函数run的主要功能是执行模型的推理,评估和结果记录。它支持来自 YOLOv5 系列模型的各种输入配置,并根据不同的任务(如验证、测试等)灵活处理数据。

浩瀚之水的专栏 2480

yolov5 6.1 关于 val.py 的使用说明

主要用于评估已经训练好的模型的性能和精度。通过在验证集上运行模型,计算模型在检测任务上的指标和评估结果。具体来说分为如下几个步骤:val.py会加载训练好的模型权重文件和用于验证的数据集。它会根据配置文件中的设置,加载模型架构和权重,并准备验证数据。图像预处理:在验证过程中,输入图像会被预处理以适应模型的要求。这包括调整图像大小、归一化像素值等操作,以确保输入图像符合模型的要求。val.py在验证集上运行模型进行推理。它会将预处理后的图像输入模型,得到模型对图像中目标的预测结果。

专注于 IOT 物联网的嵌入式研发 1万+

YOLOv5停车位识别:从数据集解析到模型部署的完整实践指南

目标检测作为计算机视觉的核心任务,通过定位和识别图像中的物体,为智能系统提供感知能力。其原理通常基于深度学习模型,如YOLO系列,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于将视觉信息转化为结构化数据,是实现自动化、智能化决策的基础。在智慧城市、工业质检、自动驾驶等众多领域,目标检测都有着广泛的应用。本文聚焦于一个具体的应用场景——智能停车管理,深入探讨如何利用YOLOv5模型实现停车位状态检测。文中将结合停车位识别yolov5数据集.zip这一具体资源,详细解析专用数据集的构建、评估与使

weixin_34268169的博客 420

Yolov5代码详细注释——val.py

在经过漫长的训练之后,就可以对模型进行测试(验证)啦!验证集的作用不容小觑,我们不仅可以在验证集中监控模型训练是否过拟合,还可以用验证集来调整超参数(迭代次数,学习率等等),从而使模型表现越来越好。现在就来看一下这个脚本文件都执行了哪些操作吧~本文主要借鉴了以下两篇文章:1.2.

qq_50773198的博客 3763

从零构建YOLOv5垃圾桶满溢检测数据集:智慧城市边缘计算实战

目标检测作为计算机视觉的核心技术,通过边界框定位和分类识别图像中的物体,其原理基于深度卷积神经网络提取特征并预测目标位置。这项技术在智慧城市和物联网领域具有重要价值,能实现自动化监控与智能决策。在智能环卫等具体应用场景中,精准的垃圾桶状态检测可优化清运路线,提升管理效率。本文聚焦于构建专用的垃圾桶满溢检测数据集,详细阐述了从数据采集、标注规范制定到转换为YOLOv5格式的全流程,并深入探讨了数据增强策略和模型训练技巧,为边缘计算项目提供了高质量的数据基础和实践指南。

weixin_29053695的博客 248

无人机搜救视觉数据集构建与YOLOv8模型训练实战指南

目标检测是计算机视觉的核心任务之一,旨在从图像或视频中定位并识别出感兴趣的目标。其原理通常基于深度学习模型,通过卷积神经网络提取特征,并利用回归或分类头输出目标的边界框和类别。这项技术的价值在于将海量视觉数据转化为结构化信息,极大地提升了自动化感知能力。在安防监控、自动驾驶、工业质检等众多领域,高效准确的目标检测已成为关键技术支撑。特别是在应急救援与安防巡检场景中,面对复杂环境和微小目标,模型的鲁棒性与精度至关重要。本文聚焦于无人机航拍视角下的**人员搜救识别**任务,深入解析如何构建与利用高质量的专用数据

weixin_34174322的博客 379

基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

目标检测是计算机视觉的核心任务之一,旨在识别图像中特定目标的位置与类别。其原理通常基于深度卷积神经网络,通过回归或分类方式预测边界框。该技术在工业质检、自动驾驶、安防监控等领域具有重要价值。在医疗影像分析这一特定应用场景中,目标检测技术能够辅助医生快速定位病灶或解剖结构,提升诊断效率与一致性。本文聚焦于如何将工业界成熟的YOLOv5目标检测框架,适配应用于手部X光片的骨骼结构自动识别任务。针对医疗图像对比度低、目标尺度差异大、标注数据稀缺等挑战,详细阐述了从数据预处理、模型调优到边缘部署的完整工程实践路径,

weixin_34319817的博客 320

基于YOLOv8的水泥搅拌车目标检测:从数据集解析到模型部署实战

目标检测是计算机视觉的核心任务之一,旨在让计算机识别并定位图像中的物体。其原理通常基于深度学习模型,通过卷积神经网络提取特征并预测物体的边界框和类别。这项技术在工业自动化、智能安防和自动驾驶等领域具有重要价值,能够实现高效、精准的物体识别与监控。在工程车辆管理、智慧工地等具体应用场景中,对特定车辆(如水泥搅拌车)的精准检测需求尤为突出。本文围绕一个高质量、场景化的水泥搅拌车数据集,详细阐述了使用YOLOv8模型进行训练、评估与优化的完整流程,涵盖了数据准备、模型训练、性能调优及常见问题排查等工程实践环节,为

weixin_34054866的博客 315

基于YOLOv8与PySide6的火灾火焰检测识别系统开发实战

目标检测是计算机视觉的核心任务,旨在从图像或视频中定位并分类物体。YOLO系列模型凭借实时性与高精度,成为工业检测的主流选择;PySide6作为Qt官方Python绑定,能快速构建跨平台桌面应用。将两者结合,可开发出一套完整的火灾火焰检测识别系统,覆盖数据准备、模型训练、界面交互与部署优化。从实际工程角度出发,讲解如何利用YOLOv8/YOLOv5训练火焰检测模型,并通过PySide6实现图片、视频、摄像头的实时检测,以及阈值调节、模型切换等功能。同时讨论数据闭环、负样本处理、线程模型和性能调优等关键问题,

weixin_30558697的博客 318

YOLOv5抽烟识别检测数据集实战:从训练到部署全流程解析

目标检测是计算机视觉中的核心任务之一,其原理是通过卷积神经网络在图像中定位并分类多个目标,而YOLOv5作为目前工业界广泛使用的轻量级检测算法,凭借高精度与快速推理的平衡,成为安防、工地监控等场景的常见选择。在真实业务落地中,数据质量往往比模型结构更决定最终效果——标签格式是否规范、类别分布是否均衡、小目标是否密集,都会直接影响训练收敛与检测性能。本文从数据集的目录结构检查、YOLO/VOC标签转换等基础工作出发,系统梳理YOLOv5训练抽烟识别模型的关键环节:环境配置、yaml数据文件编写、超参数调整、样

weixin_29047919的博客 289

从YOLO格式到模型部署:花粉过敏原植物检测数据集实战指南

目标检测是计算机视觉的核心任务之一,旨在让计算机识别并定位图像中的特定物体。其原理通常基于深度学习模型,通过卷积神经网络提取图像特征,并预测目标的位置和类别。这项技术的核心价值在于将视觉信息转化为结构化数据,广泛应用于自动驾驶、工业质检、安防监控等领域。在医疗健康与环境保护的交叉场景中,目标检测技术展现出巨大潜力,例如通过识别特定植物来预警过敏风险。本文以花粉过敏原植物检测为具体案例,深入解析了数据集的YOLO标注格式、模型训练中的超参数调优技巧,以及如何将训练好的模型通过ONNX或TensorRT格式部署

weixin_34238633的博客 369

YOLOv8火箭识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置+目标检测)

随着航天技术的飞速发展,火箭发射过程中的自动化监测与智能分析需求日益迫切。传统的人工目视检测方式存在效率低、主观性强、难以实时处理大量图像数据等局限性,无法满足现代航天发射任务中对火箭关键部件状态快速、精准感知的要求。本文设计并实现了一套基于YOLOv8目标检测算法的火箭多部件识别检测系统,旨在为火箭发射过程中的视觉监测提供智能化辅助工具。

斌擎科技 246

构建黑夜港口船只检测数据集:从VOC标注到YOLO模型训练全流程

目标检测是计算机视觉的核心任务,其原理是通过算法在图像中定位并识别出特定物体。这项技术在安防监控、自动驾驶和工业质检等领域具有重要价值。在智慧港口和夜间航运监控等具体应用场景中,通用数据集往往难以应对低光照、复杂背景等挑战。因此,构建高质量、场景专用的数据集成为项目成功的关键。本文聚焦于黑夜港口船只检测,详细阐述了采用PASCAL VOC格式进行数据标注的实践,并提供了将其转换为YOLO训练格式的完整方案,涵盖了数据采集、标注规范、预处理增强和模型训练调优的全链路,为相关领域的工程落地提供了切实可行的参考。

weixin_30824479的博客 402

基于Mask R-CNN的人偶娃娃识别:从数据构建到模型部署全流程实战

目标检测是计算机视觉的核心任务之一,旨在从图像中定位并识别出感兴趣的物体。其原理通常基于深度学习模型,通过卷积神经网络提取特征,并利用区域建议和分类回归网络完成定位与识别。这项技术在安防监控、工业质检、自动驾驶等领域具有极高的技术价值。针对特定、细分的物体识别需求,如区分高度仿真的类人物体,通用模型往往表现不佳,需要针对性的解决方案。本文聚焦于人偶娃娃识别这一独特应用场景,深入探讨了如何利用Mask R-CNN框架,通过精心设计的数据增强策略(如色彩抖动以提升对硅胶、陶瓷等材质的鲁棒性)和模型微调技巧,构建

weixin_30819085的博客 398

电力设备红外热像图数据集解析与YOLOv8目标检测实战指南

目标检测是计算机视觉的核心任务之一,旨在识别图像中的物体并定位其位置。其原理通常基于深度学习模型,通过卷积神经网络提取特征,并利用回归和分类头输出边界框与类别。这项技术在工业自动化、安防监控等领域具有重要价值,尤其在设备状态监测与故障预警场景中作用显著。红外热像图通过捕捉物体表面的温度分布,为基于温度异常的故障检测提供了独特的数据视角。本文聚焦于一个专为电力巡检设计的红外热像图数据集,该数据集包含绝缘子、线夹等7类关键部件,并提供了VOC和YOLO两种标注格式。我们将结合YOLOv8框架,详细探讨针对此类红

weixin_34408624的博客 355

草莓目标检测数据集构建与YOLO/VOC格式实战指南

目标检测是计算机视觉的核心任务,其原理是通过算法定位并识别图像中的特定对象。这项技术的价值在于为自动化系统提供“视觉”感知能力,是实现智能化应用的基础。在实际工程中,高质量的数据集是模型性能的基石,其标注格式的标准化与多样性直接影响训练效率和模型泛化能力。YOLO格式以其归一化坐标和轻量级文件结构,成为当前工业部署的首选,尤其适合追求实时性的边缘计算场景;而VOC格式则因其丰富的元信息(如困难样本标志)和良好的可读性,在学术研究和与经典算法对比中仍有重要价值。本文聚焦于农业自动化场景,详细解析了专为草莓识别

weixin_34220179的博客 489

目标检测发展

浅谈目标检测算法发展历史

weixin_70221721的博客 274

如何制作微信小程序的在线购物商城应用

首先,你需要规划好商城的整体框架,确定好你的目标用户群体,思考他们的需求是什么。接下来,使用微信开发者工具创建一个新的小程序项目,输入你的AppID,选择好保存路径,点击“创建”,一个新的商城雏形就诞生了。你可以把这里当作自己的家,无论是工作之余的小憩,还是寻找灵感的驿站,我都希望你能在这里找到属于你的那份快乐和满足。数据是现代商业的灵魂,通过数据分析,你可以更准确地把握用户的行为模式,从而做出更明智的决策。

master_chenchen的博客 2427

YOLOv5-6.x源码分析(二)---- val.py

今天又看到了一位博主的分类专栏,更加坚定了我要养成坚持写博客的习惯。昨天把detect.py的源码解读了,今天来解读一下val.py。这个脚本文件主要是在每一轮训练结束后,验证当前模型的mAP、混淆矩阵等指标,并修改train.py的参数。这个脚本主要运用在train.py中的run函数里面,直接调用,当然也可以在模型训练完毕后,运行该脚本,进行模型的评估。预计我会自顶向下,来解读每一个脚本文件。这部分代码主要是对train.py训练后的ing进行评估和验证。难点在于。

JehanRio's Private Blog 4978

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3898

飞牛NAS+Docker打造私人IPTV直播源:手把手教你部署iptv-api

本文详细介绍了如何在飞牛NAS上通过Docker部署iptv-api,打造私人IPTV直播源。从SSH配置到Docker容器部署,手把手教你实现自动更新直播源、多终端支持的解决方案,适用于Kodi、PotPlayer等播放器,提升家庭娱乐体验。

earth的博客 5563
上一篇: 移动端视觉SLAM学习笔记 (五) 参数设置
下一篇: 大疆OSDK-ROS 根据航点信息启动和关闭指定功能
业余码农
博客等级 码龄17年 2056粉丝 22原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值