当前位置: 首页 > article >正文

YOLOv5 目标检测优化:降低误检与漏检

1. 引言

在目标检测任务中,误检(False Positive, FP)和漏检(False Negative, FN)是影响检测性能的两个主要问题。误检意味着模型检测到了不存在的目标,而漏检则指模型未能检测到真实存在的目标。本文将介绍如何优化 YOLOv5 以减少误检和漏检,提高检测精度。

2. 误检与漏检的常见原因

2.1 误检的常见原因

  • 训练数据质量问题:数据集存在噪声,如误标注或错误样本。
  • 背景复杂度过高:目标与背景相似度高,导致模型误判。
  • IoU(交并比)阈值过低:如果 NMS(非极大值抑制)中的 IoU 阈值过低,可能会保留过多低质量的框。
  • 过拟合:模型在训练数据上表现良好,但在测试数据上泛化能力差。
  • 类别不均衡:某些类别样本过多,导致模型倾向于过度检测。

2.2 漏检的常见原因

  • 置信度阈值过高:如果模型置信度设定过高,可能会导致部分低置信度目标被忽略。
  • 目标尺寸太小:YOLOv5 在小目标检测上相对较弱,可能难以检测微小目标。
  • 数据增强过度:过强的数据增强可能会改变目标形态,使模型难以识别。
  • 网络结构限制:默认 YOLOv5 的网络结构可能不适用于所有任务,可能需要调整。
  • 数据集不完整:如果数据集中缺少某些类别或场景,模型可能无法学习到足够的特征。

3. 降低误检的方法

3.1 提高训练数据质量

  1. 清理数据集:去除错误标注、重复数据或模糊目标。
  2. 平衡类别分布:尽可能使数据集中的不同类别样本数量均衡。
  3. 增加硬例(Hard Examples):针对易混淆类别增加相应样本,提升模型区分能力。

3.2 调整NMS(非极大值抑制)

data/hyp.scratch.yaml 中调整 IoU 阈值,例如:

nms_iou: 0.45  # 降低 IoU 阈值可以减少重复框

如果误检较多,可适当 降低 IoU 阈值,如 0.3-0.4,但不能太低,否则可能导致漏检。

3.3 调整置信度阈值

检测时的置信度阈值影响最终输出的检测结果。在 detect.py 中修改 conf-thres 参数,例如:

python detect.py --conf-thres 0.3

如果误检多,可 提高 置信度阈值,如 --conf-thres 0.4,但不能过高,否则可能导致漏检。

3.4 调整损失函数

如果误检较多,可以尝试修改 loss 计算方式,如增加 类别损失(class loss) 的权重:

cls_pw: 1.5  # 默认 1.0,可适当增加

3.5 增强数据增强策略

如果背景复杂导致误检,可以减少强烈的数据增强,避免模型学到无关信息。例如,减少 hsv_h, hsv_s, hsv_v 的变化范围:

hsv_h: 0.015  # 色调变化减少
hsv_s: 0.5    # 饱和度调整
hsv_v: 0.4    # 亮度调整

3.6 采用更强的模型

如果误检仍然较多,可以使用更大的 YOLOv5 变体,如 yolov5lyolov5x,提高检测能力。

python train.py --weights yolov5l.pt --epochs 300

4. 降低漏检的方法

4.1 降低置信度阈值

如果模型漏检较多,可以适当 降低 置信度阈值,例如 --conf-thres 0.2,但不能过低,否则会引入过多误检。

4.2 适当提高 NMS IoU 阈值

如果检测框被误过滤,可以适当 提高 IoU 阈值:

nms_iou: 0.5  # 提高 IoU 过滤

4.3 增强小目标检测能力

YOLOv5 对小目标检测较弱,可采用以下方法:

  1. 使用更高分辨率的输入
python train.py --img-size 1280
  1. 修改网络结构:调整 yolov5s.yaml 中的 depth_multiple 适当增加检测层。
  2. 数据增强:增加 MosaicCopy-Paste 以增强小目标样本。

4.4 采用多尺度训练

python train.py --multi-scale

开启多尺度训练,使模型能更好适应不同大小的目标。

4.5 采用更优的 Anchor Box

如果目标形状特殊,可以重新计算 Anchor:

python utils/autoanchor.py --dataset mydataset

4.6 采用数据增广策略

如果漏检主要集中在某些特定角度或场景,可以增加相应的数据增强,例如 旋转、仿射变换

5. 训练时的优化建议

5.1 选择合适的预训练模型

预训练模型的选择影响模型性能。例如,检测小目标时,使用 yolov5myolov5l 可能比 yolov5s 更好。

5.2 调整学习率策略

适当调整 lr0lrf,避免训练初期过快收敛。

lr0: 0.01  # 初始学习率
lrf: 0.2   # 最终学习率

5.3 训练更多 epochs

对于复杂任务,可以适当增加训练 epochs,例如:

python train.py --epochs 500

6. 结论

降低误检和漏检需要从 数据、超参数、网络结构、训练策略 等多个方面优化。关键点包括:

  • 数据集质量 是核心,应清理数据、平衡类别。
  • 调整置信度阈值 适应不同任务需求。
  • 优化 NMS 策略,适当调整 IoU 阈值。
  • 使用更大的模型改进 Anchor 设计 提升检测能力。
  • 数据增强策略 需适度,避免过强影响模型泛化。

通过合理的优化,可以大幅降低误检和漏检,提高 YOLOv5 在目标检测任务中的表现。

相关文章:

YOLOv5 目标检测优化:降低误检与漏检

1. 引言 在目标检测任务中,误检(False Positive, FP)和漏检(False Negative, FN)是影响检测性能的两个主要问题。误检意味着模型检测到了不存在的目标,而漏检则指模型未能检测到真实存在的目标。本文将介绍…...

在nodejs中使用RabbitMQ(七)实现生产者确认

生产者:批量发送消息(每批10条),每条消息附带唯一 correlationId,并监听确认队列(ackQueue)。 消费者:处理消息后,通过 ackQueue 返回确认消息(携带原 corre…...

vue中Img图片资源require导入时数据没有过来的时候报错了-解决方案

src_views_followOrder_myFollow_index_vue.js:903 Uncaught (in promise) Error: Cannot find module ./undefined-icon.svg 该错误表示在Vue组件或JavaScript文件中找不到名为“undefined-icon.svg”的模块。可能原因是: 1. 路径错误:检查文件路径是否正确,确保文件实际上…...

Java:204 基于springboot零食销售商城的设计与实现

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统主要分为管理员和用户、商家。 用户可以使用网站首页的登录注册界面进行在线登录注册,并且注册登录后方可使用系统的各种功能以及购物…...

harmonyOS的文件的增、删、读、写相关操作(fs/content)

注意: 操作harmonyOS的文件只能对app沙箱内的文件进行操作 牵扯到两个支持点: fs和content这两个API; 具体的操作方法看下图: 创建文件 //js 引入 import fs from "ohos.files.fs" import featureAbility from "ohos.ability.featureAbility"; // 上下…...

【golang】量化开发学习(一)

均值回归策略简介 均值回归(Mean Reversion)假设价格会围绕均值波动,当价格偏离均值一定程度后,会回归到均值。 基本逻辑: 计算一段时间内的移动均值(如 20 天均线)。当当前价格高于均值一定比…...

4090单卡挑战DeepSeek r1 671b:尝试量化后的心得的分享

引言: 最近,DeepSeek-R1在完全开源的背景下,与OpenAI的O1推理模型展开了激烈竞争,引发了广泛关注。为了让更多本地用户能够运行DeepSeek,我们成功将R1 671B参数模型从720GB压缩至131GB,减少了80%&#xff…...

MySQL数据库(八)☞ 我是不是锁神

目录 1 全局锁的应用 2 索引对行锁的影响 3 表锁(显式)--表级锁 4 元数据锁 MDL(隐式)--表级锁 5 意向锁(Intention)--IS锁 IX锁--表级锁(隐式) 6 记录锁-(Record)-S锁 X锁 -- 行级锁 7 如何理解select ... lock in share …...

AI法理学与责任归属:技术演进下的法律重构与伦理挑战

文章目录 引言:智能时代的新型法律困境一、AI技术特性对传统法理的冲击1.1 算法黑箱与可解释性悖论1.2 动态学习系统的责任漂移1.3 多智能体协作的责任稀释二、AI法理学的核心争议点2.1 法律主体资格认定2.2 因果关系的技术解构2.3 过错标准的重新定义三、责任归属的实践案例分…...

华象新闻 | 2月20日前谨慎升级 PostgreSQL 版本

各位 PostgreSQL 用户,建议近期进行升级 PostgreSQL 版本。 2月20日计划进行非周期性版本发布 PostgreSQL全球开发团队计划于2025年2月20日进行一次非周期性发布,以解决2025年2月13日更新版本中引入的一个回归问题。 2月13日的更新版本包括了17.3、16.7、…...

【NLP】循环神经网络RNN

目录 一、认识RNN 二、RNN模型分类 三、传统RNN模型 3.1 结构分析 3.2 Pytorch构建RNN模型 3.3 优缺点 一、认识RNN RNN(Recurrent Neural Network),中文称作循环神经网络,一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之…...

pnpm, eslint, vue-router4, element-plus, pinia

利用 pnpm 创建 vue3 项目 pnpm 包管理器 - 创建项目 Eslint 配置代码风格(Eslint用于规范纠错,prettier用于美观) 在 设置 中配置保存时自动修复 提交前做代码检查 husky是一个 git hooks工具(git的钩子工具,可以在特定实际执行特…...

Vue的简单入门 一

声明:本版块根据B站学习,创建的是vue3项目,用的是vue2语法风格,仅供初学者学习。 目录 一、Vue项目的创建 1.已安装15.0或更高版本的Node.js 2.创建项目 二、 简单认识目录结构 三、模块语法中的指令 1.v-html 1.文本插值…...

VMware Workstate 的 Ubuntu18 安装 vmware tools(不安装没法共享)

在共享主机路径后,可以在: /mnt/hgfs/下方找到共享的文件。但没有安装vmware tool时是没法共享的。 如何安装vmware tool,网上版本很多。这里记录一下: VMware Workstation 17 Pro,版本:17.6.0 虚拟机系统…...

深入Flask:如何优雅地处理HTTP请求与响应

哈喽,大家好,我是木头左! 本文将带你深入了解如何在Flask中优雅地处理HTTP请求和响应,让你的应用更加高效、安全和用户友好。 创建一个简单的Flask应用 让从创建一个最简单的Flask应用开始: from flask import Flaskapp = Flask(__name__)@app.route(/) def...

Typescript 【详解】配置文件 tsconfig.json

用于控制 TypeScript 编译器如何将 .ts 文件编译为 .js 文件 可以使用命令生成 npx tsc --init{"compilerOptions": {"target": "ES6","module": "commonjs","strict": true},"include": ["src/…...

GC 基础入门

什么是GC(Garbage Collection)? 内存管理方式通常分为两种: 手动内存管理(Manual Memory Management)自动内存管理(Garbage Collection, GC) 手动内存管理 手动内存管理是指开发…...

坑多多之AC8257 i2c1 rtc-pcf8563

pcf85163 ordering information Ordering information Package Description Version Marking code PCF85163T/1 SO8 ① SOT96-1 PF85163 PCF85163TS/1 TSSOP8 ② SOT505-1 85163 ①plastic small outline package; 8 leads;body width 3.9 mm ②plastic thin…...

UE求职Demo开发日志#32 优化#1 交互逻辑实现接口、提取Bag和Warehouse的父类

1 定义并实现交互接口 接口定义: // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "UObject/Interface.h" #include "MyInterActInterface.generated.h…...

自动化测试题

1.什么项目适合做自动化测试? 答:一般来说,适合做自动化测试的项目应该满足以下几个条件: 项目需求稳定,变更不频繁。 项目周期较长,需要反复进行回归测试。 项目功能较复杂,涉及多个模块和…...

vite配置proxy和nginx同步配置反向代理,vite的base含义

vite配置代理是为了在开发环境下联调服务器接口,如果不配置代理,开发时会出现跨域, 会在请求的url的前缀添加标识如/api,代理请求时在rewrite为"",或者rewrite为其他字符串, 项目打包部署后,需要…...

如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题

在安装Qt时,遇到了一些问题,尤其是在Mac上安装Qt后,发现Qt Creator没有出现在应用程序中。通过一些搜索和操作,最终解决了问题。以下是详细的记录和解决方法。 1. 安装Qt后未显示Qt Creator 安装完成Qt后,启动应用程…...

FFmpeg+SDL实现简易视频播放器

参考链接 https://blog.csdn.net/qq_26611129/article/details/98732561 https://www.cnblogs.com/Azion/p/17756274.html https://avmedia.0voice.com/?id49050 https://blog.csdn.net/qq_44825209/article/details/133760652 https://www.cnblogs.com/Azion/p/17525955.htm…...

set_intersection set_union set_difference set_symmetric_difference

std::set_intersection 用于计算两个已排序范围的交集。它将交集的结果写入到指定的输出迭代器中。 std::set_union 用于计算两个已排序范围的并集。它将并集的结果写入到指定的输出迭代器中。 std::set_difference 用于计算两个已排序范围的差集。它将差集的结果写入到指…...

webpack打包优化策略

1. 减少打包体积 减少打包文件的大小是为了提高加载速度,降低网络带宽消耗,提升用户体验。常见的减少打包体积的优化策略包括: 代码分割(Code Splitting):将代码拆分成多个小文件,让浏览器按需…...

多线程基础面试题剖析

一、线程的创建方式有几种 创建线程的方式有两种,一种是继承Thread,一种是实现Runable 在这里推荐使用实现Runable接口,因为java是单继承的,一个类继承了Thread将无法继承其他的类,而java可以实现多个接口&#xff0…...

WEB安全--SQL注入--floor报错注入

一、原理: floor()报错注入需要组合count()、rand()、group by()等函数使用,通过一些手段使数据库在处理语句时产生主键重复的报错,从而达到爆出信息的目的 二、内容: ?id-1 or (select 1 from (select count(*),concat(databa…...

resultMap 标签

resultMap 是 MyBatis 框架中用于定义数据库结果集与 Java 对象之间映射关系的核心标签。它的主要作用是解决数据库字段名与 Java 对象属性名不一致的问题,或处理复杂查询(如关联查询、嵌套对象、集合映射等)时的映射需求。 主要用途&#x…...

17.推荐系统的在线学习与实时更新

接下来就讲解推荐系统的在线学习与实时更新。推荐系统的在线学习和实时更新是为了使推荐系统能够动态地适应用户行为的变化,保持推荐结果的实时性和相关性。以下是详细的介绍和实现方法。 推荐系统的在线学习与实时更新 在线学习的概念 在线学习(Onli…...

Android设备 网络安全检测

八、网络与安全机制 6.1 网络框架对比 volley: 功能 基于HttpUrlConnection;封装了UIL图片加载框架,支持图片加载;网络请求的排序、优先级处理缓存;多级别取消请求;Activity和生命周期的联动(Activity结束生命周期同时取消所有网络请求 …...