无痛涨点:目标检测优化的实用Trick

2023-11-11

本文作者分享了自己在图像预处理调参、模型训练调参等方面中的技巧,并提醒读者要多注意数据的分布和呈现的状态。

对卷积网络来说,所学习的就是数据集的数据分布,你的卷积核参数最后形成的也是对数据集中特征分布的认知

写这篇文章就是因为up主的邀请,然后分享一下自己工作时候总结的一些经验和技巧,不一定适用别的网络,有的还可能会有反作用,所以也就是给大家提供一个思路,欢迎拍砖吧,因为都是公司数据,分享试验结果也比较麻烦,所以大家看个思路就好。

1、预处理技巧分享

图像预处理部分调参的主要目的是对输入数据进行增强,使得网络模型在训练的过程中能更专注于目标特征部分的学习。常用的方式是图像的随机旋转、裁剪以及翻转等方式,这些方式的预处理其本质其实是为了让你的数据集更丰富,让网络能够学习到更多的分布情况,这个网上已经有很多博客了,笔者就不赘述了;另一种调整的trick是在图像上叠加信息,例如在输入数据上增加高斯噪声,椒盐噪声,从而提升网络对有干扰和成像较差情况下的目标检测能力。本文将对图像上叠加信息的调参技巧进行一定的扩展讲解。

1、为什么在原始图像上叠加信息会管用,不会破坏原有的图像信息么?

在图像上叠加信息分成两类,一类是叠加噪声,这种操作的目的是为了让网络能够适应图像质量不佳情况下的图像检测任务,在板端实测的结果,这种叠加噪声的方式也可以一定程度提高网络对输入图像中待检测目标的仿射变换的适应能力。笔者通过在输入图像上叠加一定量的高斯噪声,在Hi3516CV500上完成基于yolov3-tiny的车牌检测任务时,提高了0.5%的精度。

另一类信息的叠加是对尝试对图像上某一特定特征进行增强,该增强的目的是突出该方面的图像特征,使得网络能够首先注意到该种特征并更专注于此类特征的学习,因为这种方式只是对图像中的指定特征或位置有变动,并不会整体上对图像的结构有巨大的改变,所以并不会破坏图像的信息可读性。例如:利用canny算子对图像中的边缘特征进行增强。

2、上面说的两种调参技巧是怎么想出来的?

我们都知道,网络学习的是数据中的参数分布,何凯明大神也在retinanet的论文里提到过,数据的不平衡是影响检测网络性能的主要因素,而focal loss的提出就是让网络在学习时更专注于漏检和误分的样本。那么我们接着这个思路想,如何使得网络更专注于目标区,从而获得尽量多的价值更高的误捡和漏检样本呢?花朵吸引蜜蜂靠的是自己的香味和更鲜艳的外表,所以我们也要让目标区域更“显眼”,而平时在训练检测网络时,发现对数据集进行标注时,anchor base类算法,目标标注框比实际的物体紧缩框大大概几个像素时得到的检测结果统计精度和定位框的稳定性都会好,那么我们是不是可以认为,对anchor base的检测网络来说,目标物体的边缘也是很重要的,所以就想到了通过canny算子增强边缘的方式来增强训练数据。

3、如何在实际的网络训练中应用以上的技巧?

实际使用过程如下:

1)通过对输入数据的手动查验或自动化统计,确定较好的canny阈值

2)利用阈值对训练样本中10-20个batch的数据进行canny边缘增强。

3)增强方式为:原图转灰度提取到的canny边缘所对应的原图像素位置进行对比度增强或直接涂黑。加深程度可以由自定义的超参数alpha来指定。

4)用这10-20个batch的数据进行几个epoch的训练后再换成普通数据进行训练。

2、模型训练参数调整

讲了预训练时候的数据增强,接下来是模型训练参数部分。其实这部分网上讲的trick很多了,大家平时注意搜集一下或者github上找一找,就有很多人的练手的仓库可以跟着学。我也就不多讲了,因为我也不敢说学全了。我讲讲我自己实际跑模型时候的一些想法。

1、BFEnet特征擦除网络

这个网络是reid方向的,先讲这个是因为,这个特征擦除和上面讲到的噪声本质上有相似的地方,都是通过在训练时遮蔽一部分特征值,来让网络习惯一定量的噪声干扰,从而增强性能。这个技巧可以用在应对有遮挡的场景下的模型。

2、anchor的调整

在yolo的代码里大家肯定都看了,作者是根据你给的数据集里面,标定的目标的长和宽进行k-means的聚类,然后确定在当前这个数据集上的anchor的。我这里的经验就是,我发现有人问过我为啥我只训练一类的检测,然后重新计算的anchor6个或者9个anchor尺寸差的都不大,但是在实际检测的时候,却检测不到东西。我的结论是:对anchor的设计应该是基于模型作者默认的anchor进行微调而不是完全的重新计算。

原因:大家都知道,yolov3来说,输出是三个特征图,分别对应小目标,中目标和大目标。比如我们要检测的目标在图像中占比我们人眼感觉应该是比较大的,然后我们统计的框也都是比较大的尺寸,但是在实际训练的时候,并不是说大目标就一定由yolov3的最初设计的大目标输出层输出的。很可能就是由中间目标层输出的,而因为anchor的设计过大,导致训练的网络不收敛的有之,明明收敛了,却检测不到目标的情况也有之。

解决办法:在设计anchor的时候,首先统计目标框的分布,然后进行聚类,聚类后替换或修改原有的9个anchor中和你计算的anchor相近的几个原有的anchor值。然后再训练,如果框还是不够紧缩,再对某几个框进行精调就可以了,核心思路就是:anchor的分布也要满足对全集的稀疏覆盖而不仅仅是你的当前数据集。

3、后处理的优化

后处理的优化部分严格来说不算是网络训练的trick了,应该是部署的trick,比如海思的NPU部署的时候,会限制比较大的pool核,所以最好训练的时候就把大的pooling切换为几个小的连续pooling,实测虽然理念上两者应该是差不多的,但是实际上还是差了0.3%的精度。(指的是直接多层的pooling转换到板子和训练时是一个大的pooling,到转换时候再改结构成几个小的pooling)

还有一个就是nms部分,这部分也有同学问过我说因为我的数据集有遮挡,可能两个离的比较近的,nms就把有遮挡的那个小目标去掉了。这部分分享一个小技巧就是,你在算nms的时候,也关注一下两个框的中心点距离,可以设置中心点距离超过多少的两个框,不做nms。这样就能避免nms的一部分武断删除检测结果bbox。

4、大模型训练时的一个训练技巧

有一位同学问过我,就是为啥同样的模型,用比较少的数据训练的时候很快到了97%的MAP,但是换300w的大数据集的训练以后,卡在93%上不去了。这里面有一个技巧叫warm up,也就是说在大数据下训练模型的时候,可以先从大数据集上取一部分数据训练模型,然后以这个训练的模型为预训练模型,在大数据集上,增大batch_size再进行训练,至少没卡在93%这个问题上了。

5、学习率手动修正策略

我们训练的时候,一般都会设置学习率的衰减,有很多的方式,按已迭代步长的,按当前损失值的,按训练集当前损失值和测试集计算的损失值的gap差值做修正项的。我这里提到的技巧就是比如以步长调整学习率为例,什么时候可以靠自动化的修正学习率,什么时候要手动调整一下。

我们在训练模型的时候,一般都会关注损失函数变化曲线图,在曲线图中,数据集的稀疏程度能通过损失曲线的震荡情况有一定的反映,如果有个别的跳点,多为数据集中的坏数据(标记错误数据),当我们的损失图呈现为震荡–阶跃–在另一个损失值附近震荡时,就要注意了,此时多半是因为你的数据集在做打乱的时候数据并没有打的很散,可以在这个位置先停止训练并记录当前状态,再降低学习率,继续训练,等训练数据再次开始恢复之前的震荡位置时,再恢复学习率训练。

这样操作的原因是为了避免在参数中引入过大的噪声,噪声分两种,一种就是错误的数据,比如背景啊,像目标但是不是目标的东西,还有就是多类别训练的时候,对每个类别来说,其余类别也算是噪声的一种。所以采用要么把数据集弄好(这个很难,我也没看过谁的文章里真的能说清把训练集弄好是啥样的),要么加大batch,要么就训练时候注意。

3、总结

模型的调参训练技巧其实说白了就是怎么让模型得到的是数据全集的稀疏分布,且和别的类别有比较好的区分,也就是类内差小类间差则尽量大。以这个为核心,告诉模型应该关注什么,少关注什么,既然是数据的科学,多关注数据的分布和呈现的状态,祝大家在训练的时候都得到自己满意的结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无痛涨点:目标检测优化的实用Trick 的相关文章

  • STM32循迹避障小车制作代码详解(简单实现版)

    感谢几年来大家的支持 看到大家对工程的呼声很高 所以来把工程上传了 大家自行下载即可哈 谢谢大家支持 这个代码是进阶版的 就是可以跑的很快的 和上面博客的主要区别就是这个代码的避障机制并不是做在主main函数里的 是通过外部流程来传参给CP
  • 线程、多线程学习总结

    线程 多线程 1 基本概念 程序 线程 进程 1 1 程序 线程 进程 程序 一段静态代码 静态对象 进程 正在运行中的一个程序 线程 进程细化分为线程 作为调度和执行的单位 每个线程拥有独立的运行栈和程序计数器 并行 多个CPU同时执行多
  • javaweb后台程序如何查找bug

    方法 1 通过请求分析问题出在前端还是后台 分析请求的url以及参数是否正确 2 如果发生在后台 查看请求的接口 3 调试 可以查看日志记录 异常信息 4 确定错误具体发生的问题 并修改
  • Counterfactual Zero-Shot and Open-Set Visual Recognition

    Counterfactual Zero Shot and Open Set Visual Recognition 1 Introduction 文献提出一个反事实框架 是由对不可见类的泛化来支撑的 作者基于反事实的一致性规则 反事实确实是基
  • msi文件安装MySQL

    文章目录 步骤如下 1 官网下载msi安装文件 2 运行MySQL installer 3 通过MySQL installer配置服务 4 验证 5 安装目录介绍 6 修改指定的数据文件 步骤如下 1 官网下载msi安装文件 官网地址 上述
  • 初识kafka --安装启动

    初识kafka kafka的安装及启动 kafka 1 官网下载 2 解压 3 安装jdk 4 配置kafka 4 1 配置server properties 4 2 配置zookeeper properties 5 启动kafka Kaf
  • 使用Aardvark(Total Phase)监测I2C链路

    使用Aardvark监测I2C链路 项目调试实例 1 Aardvark是Total phase公司推出的一款I2C SPI总线的调试工具 其功能包括 作为主 从设备调试I2C或SPI的相关功能 监测I2C总线上的数据 调试GPIO端口等 2
  • 组合数学之递推关系(一)定义及几个经典例子

    说明 本文参考了组合数学课件 精简整理了一下内容并谈谈自己的理解 定义 设 an a n a n 为一序列 把该序列中 an a n a n和它前面几个 ai a i a i
  • 嵩天老师-Python语言程序设计-Python123配套练习测验题目汇总整理

    测验1 Python基本语法元素 知识点概要 普遍认为Python语言诞生于1991年 Python语言中的缩进在程序中长度统一且强制使用 只要统一即可 不一定是4个空格 尽管这是惯例 IPO模型指 Input Process Output
  • 工具使用 [ idea远程服务断点调试 ]

    目录 1 概述 1 1 远程代码调试 1 1 1 idea配置 1 1 2 准备HTTP接口 1 1 3 启动远程服务 1 概述 在开发的过程当中 断点调试是我们比较常用的操作 不管是用来解析代码流程 还是用来排查程序错误 都会去使用到断点
  • idea 配置详解 (二) 之editor 详解

    3 File Settings Editor 3 1 File Settings Editor General 3 1 1 File Settings Editor General Auto Import 3 1 2 File Settin
  • 集合学习总结

    集合 1 java集合框架概述 1 集合 數組都是多個數據存儲操作的結構 簡稱java容器 說明 主要指的存儲是內存層面的存儲 不涉及到持久化的存儲 可以分為Collection和Map兩種 Collection接口 單列數據 定義了存取一
  • java进制转换工具类

    本文主要写进制转换的工具类 具体的各个方法讲解见上一篇 进制转换 进制转换工具类及算法 1 工具类 2 二进制相加 主页传送门 传送 1 工具类 进制转换是人们利用符号来计数的方法 进制转换由一组数码符号和两个基本因素 基数 与 位权 构成
  • 无痛涨点:目标检测优化的实用Trick

    本文作者分享了自己在图像预处理调参 模型训练调参等方面中的技巧 并提醒读者要多注意数据的分布和呈现的状态 对卷积网络来说 所学习的就是数据集的数据分布 你的卷积核参数最后形成的也是对数据集中特征分布的认知 写这篇文章就是因为up主的邀请 然
  • 基于STM32c8t6的5路pwm占空比测量实验总结

    测量方式 1 正点原子例程里使用的方式 定时器通道的相关引脚输入捕获上升沿触发中断 在中断函数里 检测到上升沿之后TIM SetCounter TIMX 0 将计数器的值置零重新开始计数 同时将定时器中断触发方式切换为下降沿触发 待到下降沿
  • vector的find用法

    一 find函数存在于算法中 其头文件为 include
  • 每日学习:Idea和Eclipse中的一些常用快捷键

    1 删除光标所在行代码 idea快捷键 Ctrl X eclipse快捷键 Ctrl D 2 复制光标所在行代码 或者鼠标选中的代码 idea快捷键 Ctrl D eclipse快捷键 Ctrl Alt 上下键 3 切换代码大小写 idea
  • 数字IC设计知识点及综合题详解(提前批、秋招必刷基础题)——(二)时序分析基础(Slack、Setup、Hold、Jitter、Skew、亚稳态)异步复位,同步释放

    目录 一 常见名词 1 1 时钟偏移Skew 1 1 1 Skew出现的原因 1 1 2 Skew解决方法 1 2 抖动Jitter 1 2 1 Jitter出现的原因 1 2 2 时钟抖动永远存在 1 3 扇入扇出Fan in Fan o
  • the import org.junit.Assert.* cannot be revolved的解决方法

    the import org junit Assert cannot be revolved的解决方法 具体解决方法 右键单击项目名 选择buildpath gt add library 弹出配置对话框 选择junit next下一步 系统
  • 学习总结——按下按键灯亮,再次按下按键,灯灭

    按键控制灯的亮灭 1 主要实现按键控制灯的亮灭 按键按下 灯亮 再次按下 灯灭 主要对实现的逻辑进行控制 逻辑清晰 很简单 实现的方法有两种 方法1 将按键按下的值赋值给一个变量 变量除以2的值的是基数或者偶数来确定灯亮还是灯灭 程序中设置

随机推荐

  • 不得不会的代码注释工具——doxygen

    不得不会的代码注释工具 doxygen 下载 官网下载二进制或者直接用yum或apt工具下载 使用流程 进入项目目录生成doxygen配置文件 doxygen g 修改doxygen配置文件 程序文档输出目录 OUTPUT DIRECTOR
  • 获取List中的数据的实现方法

    大家都知道List是很好的存储数据的集合类 但是获取读取list中数据的方法你知道几种呢 一下是我知道的方法分享给大家 List
  • 黑客帝国全集故事情节解析

    黑客帝国全集故事情节解析 转载自 http www cnitblog com CreatorChen archive 2007 09 27 34083 html 一 前言 从 Matrix I 到 Matrix III 整整四年 一对名叫沃
  • 使用JMeter模拟多IP发送请求(IP欺骗)

    文章目录 一 IP欺骗的使用场景 二 JMeter如何设置IP欺骗 1 获取可用IP 2 配置IP 3 JMeter中配置IP欺骗 三 注意 前言 如果精通LoadRunner 可以直接使用LoadRunner进行IP欺骗 这里介绍如何使用
  • CTF练题(6)棋盘密码解密

    借一道题引出棋盘解密 题目详情如下 题目来自 青少年CTF训练平台 原中学生CTF平台 青少年CTF qsnctf com 题目给予的密文如下 解题 1 使用棋盘密码解码网站进行解密 网站如下 棋盘密码在线加密解密 千千秀字 qqxiuzi
  • 图像分类:Pytorch图像分类之--LetNet模型

    文章目录 前言 LetNet简介 程序的实现 model py的实现 LetNet模型操作流程 经过Conv卷积后输出尺寸的计算公式如下 Conv2d 函数介绍 MaxPool2d 函数介绍 Tensor的展平 view train py
  • oracle 关联加索引,给left join关联关系字段加索引

    给left join关联关系字段加索引 2018 07 04 left join是相当耗资源的操作 如果关联的字段没有索引的话 速度是很慢的 所以如果有left join的话 最好用索引字段取关联 创建索引会消耗大量资源 会导致数据库死锁
  • MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化

    1 业务逻辑及表介绍 数据库表介绍 table a 主表 小表 表数据不可重复 table b 流水表 大表 记录审核流水数据 注 两表表结构大致一致 流水表增加一个审核状态的字段 业务逻辑 主表保存唯一数据 流水表记录审核流水数据 用于后
  • CSDN高校俱乐部“名师高校行”——贵州遵义站

    高校俱乐部简介 CSDN高校俱乐部是由CSDN发起 大学生自发加入的IT技术学习型组织 俱乐部至今已收到数百所高校成立技术社团的申请 已在全国100多所高校建立技术社团 俱乐部由此搭建起行业与校园之间的桥梁 为各高校社团提供大咖直播 线下巡
  • java之歌_【码歌】老薛带你编写第一个Java HelloWorld

    码歌 老薛带你编写第一个Java HelloWorld 书接上文 这次主要分享如何编写第一个Java的Hello World程序 以及在编写过程当中会出现哪些问题和如何解决 以及最重要的错误整理 需要转载请注明出处 https www ji
  • eclipse中导入外部的web项目后,Java类的第一行package处出现红线或者jsp页面第一行处出现红线错误的解决方案

    问题 你是否有过这样的经历 eclipse中导入一个web项目后 然后什么都没做出现了Java类的第一行 package处出现红线 或者jsp页面第一行 处出现红线错误 话不多说 请看图片 1 Java类的第一行 package处出现红线
  • Python 爬取微信公众号文章和评论 (有源码)

    关注我 一个仍存梦想的屌丝程序员 每天为你分享高质量编程博客 follow us for dream 关注我回复 微信爬虫 获取源代码 背景说明 感觉微信公众号算得是比较难爬的平台之一 不过一番折腾之后还是小有收获的 没有用Scrapy 估
  • 如何去掉cmake编译Opencv时的Cmake Warning:“OpenCVGenSetupVars.cmake:54”

    在利用cmake编译Opencv源码时 编译最后出现一个警告提示 CMake Warning at cmake OpenCVGenSetupVars cmake 54 message CONFIGURATION IS NOT SUPPORT
  • MySQL建表出现1064 - You have an error in your SQL syntax; check the manual that corresponds to you MySQL

    SQL语句 CREATE TABLE t user id BIGINT 20 NOT NULL COMMENT 用户ID 手机号码 nickname VARCHAR 255 NOT NULL password VARCHAR 32 DEFA
  • 启动 NFS 守护进程:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)

    启动 NFS 守护进程 rpc nfsd writing fd to kernel failed errno 111 Connection refused rpc nfsd unable to set any sockets for nfs
  • MQTT协议详解(完整版)

    1 MQTT协议概念 1 1 MQTT特点 基于Publish Subscribe 发布订阅 模式的物联网通信协议 简单易实现 支持Qos 服务质量 报文精简 基于TCP IP 发布订阅模式 客户端只需要订阅这个主题 当有其他客户端向这个服
  • Kafka 简易教程 C++ 实例

    转自 https www cnblogs com kaishan1990 p 7228683 html 但是其中实例有细微修改 Kafka 简易教程 1 初识概念 Apache Kafka是一个分布式消息发布订阅系统 Topic Kafka
  • STL案例一:评委打分

    STL案例一 评委打分 案例描述 选手ABCDE 10名评委分别为每一名选手打分 去除最高分 去除最低分 取平均分 1 实现步骤 创建五名选手 放到vector中 遍历容器 取每一位选手 执行for循环 可以把 10个评分存放到deque容
  • 本地安全策略

    本地安全策略的概述 1 概念 通过设置一系列的规则 影响当前计算机的安全设置 用户登录后会受安全策略的控制 从而保证本地计算机的安全 2 打开本地安全策略管理控制台 1 图形界面 开始 控制面板 系统和安全 管理工具 本地安全策略 2 命令
  • 无痛涨点:目标检测优化的实用Trick

    本文作者分享了自己在图像预处理调参 模型训练调参等方面中的技巧 并提醒读者要多注意数据的分布和呈现的状态 对卷积网络来说 所学习的就是数据集的数据分布 你的卷积核参数最后形成的也是对数据集中特征分布的认知 写这篇文章就是因为up主的邀请 然