目标检测问题总结

目标检测问题总结

  • 目标检测二阶段和一阶段的核心区别
  • 目标检测二阶段比一阶段的算法精度高的原因
    • 1. 正负样本不平衡
    • 2.样本的不一致性
  • 如何解决目标检测中遮挡问题
  • 如何解决动态目标检测
  • FPN的作用
  • 如何解决训练数据样本过少的问题
  • IOU代码实现
  • NMS代码实现
  • NMS的改进思路

目标检测二阶段和一阶段的核心区别

目标检测技术从阶段上分为两种,一阶段和二阶段。
二阶段的核心思想是:首先提出proposal框,通过第一阶段的网络回归出目标框的大致位置大小以及是前景的概率,第二阶段是通过另一个网络回归出目标框的位置、大小及类别。
一阶段网络的核心:对于输入图像,通过网络直接回归出目标大小、位置和类别

目标检测二阶段比一阶段的算法精度高的原因

1. 正负样本不平衡

当某个类别的样本数特别多的时候,训练出来的网络对该类的检测精度往往会比较高,而当某一类的训练样本数较少的时候,模型对该类目标的检测精度就会有所下降。
对于一阶段目标检测来说,它既要做定位又要做分类,最后几层中1X1的卷积层的loss都是混合在一起,没有明确的分工。
对于二阶段目标检测来说,在RPN网络结构中进行了前景和背景的分类和检测,这个过程与一阶段的目标检测直接一上来就进行分类和检测要简单的多,有了前景和背景的区分,就可以选择性的挑选样本,这样正负样本就更加的均衡,然后重点对一些参数进行分类训练,训练的分类难度会比一阶段目标检测直接做混合分类和预测框回归要来的简单很多。
但是一阶段检测算法要比二阶段检测算法快。

2.样本的不一致性

RPN获得多个anchors的时候,会使用一个NMS,在进行回归 操作的时候,预测框和标签的IOU同回归后预测框和标签的IOU相比,一般会有较大的变化,但是NMS使用的时候用的是回归前的置信度,这样就会导致一些回归后高IOU的预测框被删除。这就使得回归前的置信度并不能完全表征回归后的IOU大小。这样就会导致算法精度的下降,在第一次使用NMS时候这种情况会比较明显,第二次使用的时候就会好很多。因此,一阶段只使用一次NMS是会对精度有影响的,而二阶段目标检测中会在RPN之后进行一个更为精细的回归,在该处也会用到NMS,此时检测的精度就会好很多。

如何解决目标检测中遮挡问题

遮挡本身也可以分为两种类型,一种是由于非目标造成的遮挡,一种是由于也是需要检测的目标造成的遮挡。这两种遮挡分别被叫做occlusion和crowded。
对于前一种类型遮挡,很难有针对性的办法去解决,最好的办法也就是使用更多的数据和更强的feature。可以从训练数据入手。加掩膜,加扰动,提高算法对遮挡的应对能力。
对于第二种遮挡,提出了Repulsion Loss

如何解决动态目标检测

在这里插入图片描述

FPN的作用

FPN是在卷积神经网络中图像金字塔的应用。图像金字塔在多尺度识别中有重要的作用,尤其是小目标检测。顶层特征上采样后和底层特征融合,每层独立预测。
FPN的设计动机:

  1. 高层特征向低层特征融合,增加低层特征表达能力,提升性能
  2. 不同尺度的目标可以分配到不同层预测,达到分而治之。
  3. FPN每层做特征融合的特征图有两个,首先是前向传播,然后取了每个特征图做上采样(最近邻插值),对应前向传播的特征图做融合。融合的方式是:通过1x1卷积调整通道数,然后直接add。之后进行3x3卷积操作,目的是消除上采样的混叠效应。
  4. 其实,fpn真正起作用的是分而治之的策略,特征融合的作用其实很有限,此外fpn存在消耗大量显存,降低推理速度
    在这里插入图片描述

如何解决训练数据样本过少的问题

利用预训练模型进行迁移微调(fine-tuning),预训练模型通常在特征上拥有很好的语义表达。此时,只需将模型在小数据集上进行微调就能取得不错的效果。这也是目前大部分小数据集常用的训练方式。视觉领域内,通常会ImageNet上训练完成的模型。自然语言处理领域,也有BERT模型等预训练模型可以使用。

单样本或者少样本学习(one-shot,few-shot learning),这种方式适用于样本类别远远大于样本数量的情况等极端数据集。例如有1000个类别,每个类别只提供1-5个样本。少样本学习同样也需要借助预训练模型,但有别于微调的在于,微调通常仍然在学习不同类别的语义,而少样本学习通常需要学习样本之间的距离度量。例如孪生网络(Siamese Neural Networks)就是通过训练两个同种结构的网络来判别输入的两张图片是否属于同一类。3. 以上两种是常用训练小样本数据集的方式。此外,也有些常用的方式:数据集增强、正则或者半监督学习等方式来解决小样本数据集的训练问题。

IOU代码实现

import numpy as np
def ComputeIOU(boxA,boxB):# 计算相交框的坐标# bbox[0][1] 左上角坐标 # bbox[2][3] 右下角坐标x1 = np.max([boxA[0],boxB[0]])y1 = np.max([boxA[1], boxB[1]])x2 = np.min([boxA[2], boxB[2]])y2 = np.min([boxA[3], boxB[3]])# 计算交区域 并区域 及IOUS_A = (boxA[2]-boxA[0]+1)*(boxA[3]-boxA[1]+1)S_B = (boxB[2]-boxB[0]+1)*(boxB[3]-boxB[1]+1)interArea = np.max([x2-x1+1, 0])*np.max([y2-y1+1,0])	##一定要和0比较大小,如果是负数就说明压根不相交unionArea = S_A + S_B - interAreaiou = interArea/unionAreareturn iou
boxA = [1,1,3,3]
boxB = [2,2,4,4]
IOU = ComputeIOU(boxA, boxB)

NMS代码实现

import numpy as np
def nms(dets,iou_thred,cfd_thred):if len(dets) == 0:return []bboxes = np.array(dets)# 对整个bboxes排序bboxes = bboxes[np.argsort(bboxes[:,4])]pick_bboxes = []while bboxes.shape[0] and bboxes[-1,-1] >= cfd_thred:bbox = bboxes[-1]x1 = np.maximum(bbox[0],bboxes[:-1,0])y1 = np.maximum(bbox[1], bboxes[:-1,1])x2 = np.minimum(bbox[2], bboxes[:-1,2])y2 = np.minimum(bbox[3], bboxes[:-1,3])inters = np.maximum(x2-x1+1, 0) * np.maximum(y2-y1+1, 0)unions = (bbox[2]-bbox[0]+1)*(bbox[3]-bbox[1]+1) + (bboxes[:-1,2]-bboxes[:-1,0]+1)*(bboxes[:-1,3]-bboxes[:-1,1]+1) - intersious = inters/unionskeep_indices = np.where(ious<iou_thred)bboxes = bboxes[keep_indices]	## indices一定不包括自己pick_bboxes.append(bbox)return np.asarray(pick_bboxes)  
dets = [[187, 82, 337, 317, 0.9], [150, 67, 305, 282, 0.75], [246, 121, 368, 304, 0.8]]
dets_nms =  nms(dets, 0.5, 0.3)
print(dets_nms)

NMS的改进思路

  1. 根据手动设置阈值的缺陷,通过自适应的方法在目标系数时使用小阈值,目标稠密时使用大阈值。例如Adaptive NMS
  2. 将低于阈值的直接置为0的做法太hard,通过将其根据IoU大小来进行惩罚衰减,则变得更加soft。例如Soft NMS,Softer NMS。
  3. 只能在CPU上运行,速度太慢的改进思路有三个,一个是设计在GPU上的NMS,如CUDA NMS,一个是设计更快的NMS,如Fast NMS,最后一个是掀桌子,设计一个神经网络来实现NMS,如 ConvNMS。
  4. IoU的做法存在一定缺陷,改进思路是将目标尺度、距离引进IoU的考虑中。如DIoU

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

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

相关文章

C //例 7.13 有一个3*4的矩阵,求所有元素中的最大值。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 例 7.13 例 7.13 有一个3*4的矩阵&#xff0c;求所有元素中的最大值。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&#xff1a;使用指针、动态分配内存 #include <stdio.h> …

设计模式-观察者模式(Observer)

设计模式-观察者模式&#xff08;Observer&#xff09; 一、观察者模式概述1.1 什么是观察者模式1.2 简单实现观察者模式1.3 使用观察者模式的注意事项 二、观察者模式的用途三、观察者模式实现方式3.1 使用接口实现观察者模式3.2 使用抽象类和具体子类实现观察者模式3.3 使用 …

Rust语言基础:从Hello World开始

大家好&#xff0c;我是[lincyang]。 我们将一起探索Rust语言的基础&#xff0c;从最经典的程序入手——“Hello, World!”。 Rust简介 Rust是一种系统编程语言&#xff0c;由Mozilla赞助开发&#xff0c;旨在提供内存安全、并发性和实用性。它的设计思想强调安全性和性能&…

CSS怎么选择除了第一个子元素外的其余同级子元素

使用 CSS 的:not()伪类选择器和:nth-child()伪类选择器 要通过CSS的代码选择某一个元素的除了第一个子元素外的其余的跟第一个子元素同级的子元素&#xff0c;可以结合使用CSS的:not()伪类选择器和:nth-child()伪类选择器进行选择。大致的语法如下&#xff1a; .parent > …

【EI会议征稿】第七届结构工程与工业建筑国际学术会议(ICSEIA 2024)

第七届结构工程与工业建筑国际学术会议&#xff08;ICSEIA 2024&#xff09; 2024 7th International Conference on Structural Engineering and Industrial Architecture 随着城市化进程的不断深入&#xff0c;建筑领域的需求也在优化、调整。结构工程的发展依旧受到重视&am…

c语言-数据结构-链表分割

链表分割实际上是给定一个值&#xff0c;遍历链表把链表中小于该值的节点与大于该值的节点分开&#xff0c;一般是将小于该值的节点放到链表的前面部分&#xff0c;大于该值的节点放在链表的后面部分。 链表分割示意图如下&#xff1a; 思路&#xff1a; 首先创建两条带哨兵位节…

CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)

版本说明 当前版本号[20231112]。 版本修改说明20231112初版 目录 文章目录 版本说明目录字符串相乘题目解题思路代码思路补充说明参考代码 子集题目解题思路代码思路参考代码 删除链表的倒数第 N 个结点题目解题思路代码思路参考代码 字符串相乘 题目 给定两个以字符串形…

【Linux】第十六站:进程地址空间

文章目录 一、程序地址空间1.内存的分布2.static修饰后为什么不会被释放3.一个奇怪的现象 二、进程地址空间1.前面现象的原因2.地址空间究竟是什么&#xff1f;3.为什么要有进程地址空间4.页表5.什么叫进程&#xff1f;6.进程具有独立性。为什么&#xff1f;怎么做到呢&#xf…

问题复盘|MySQL 数据记录中明明有值,使用 concat() 后得到的却一直是 null

背景 MySQL 的数据数据记录中明明有值&#xff0c;在使用 concat() 查询时却一直得到 null SELECT CONCAT(first_name, , last_name) FROM users;排查后发现 MySQL 的 concat 函数拼接规则是 当多个拼接的字段的字段值中存在 null 时&#xff0c;返回的一定是 null 解决方…

【算法】算法题-20231114

这里写目录标题 一、LCR 181. 字符串中的单词反转二、557. 反转字符串中的单词 III三、344. 反转字符串四、给定一个已按照升序排列的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。五、力扣第49题&#xff1a;字母异位词分组 一、LCR 181. 字符串中的单词反转 …

解决 Django 开发中的环境配置问题:Windows 系统下的实战指南20231113

简介&#xff1a; 在本文中&#xff0c;我想分享一下我最近在 Windows 环境下进行 Django 开发时遇到的一系列环境配置问题&#xff0c;以及我是如何一步步解决这些问题的。我的目标是为那些可能遇到类似困难的 Django 开发者提供一些指导和帮助。 问题描述&#xff1a; 最近…

2023.11.14-hive之表操作练习和文件导入练习

目录 需求1.数据库基本操作 需求2. 默认分隔符案例 需求1.数据库基本操作 -- 1.创建数据库test_sql,cs1,cs2,cs3 create database test_sql; create database cs1; create database cs2; create database cs3; -- 2.1删除数据库cs2 drop database cs2; -- 2.2在cs3库中创建…

optee4.0.0 qemu_v8环境搭建(支持Hafnium)

安全之安全(security)博客目录导读 目录 一、前提条件 二、拉取代码 三、下载工具链 四、编译 五、运行

了解防抖和节流:提升前端交互体验的实用策略

了解防抖和节流&#xff1a;提升前端交互体验的实用策略 前言什么是防抖&#xff1f;什么是节流&#xff1f;应用实例防抖实例节流实例 前言 本文将重点介绍前端性能优化方法之一的防抖和节流。首先解释了它们的概念和原理&#xff0c;然后探讨了它们在前端开发中的应用场景&a…

Spark数据倾斜优化

1 数据倾斜现象 1、现象 绝大多数task任务运行速度很快&#xff0c;但是就是有那么几个task任务运行极其缓慢&#xff0c;慢慢的可能就接着报内存溢出的问题。 2、原因 数据倾斜一般是发生在shuffle类的算子&#xff0c;比如distinct、groupByKey、reduceByKey、aggregateByKey…

链表相关部分OJ题

&#x1f493;作者简介&#x1f44f;&#xff1a;在校大二迷茫大学生 &#x1f496;个人主页&#x1f389;&#xff1a;小李很执着 &#x1f497;系列专栏&#xff1a;Leetcode经典题 每日分享&#xff1a;人总是在离开一个地方后开始原谅它❣️❣️❣️———————————…

pgsql_全文检索_使用空间换时间的方法支持中文搜索

pgsql_全文检索_使用空间换时间的方法支持中文搜索 一、环境 PostgreSQL 14.2, compiled by Visual C build 1914, 64-bit 二、引言 提到全文检索首先想到的就是ES(ElasticSearch)和Lucene&#xff0c;专业且强大。对于一些小众场景对于搜索要求不高&#xff0c;数据量也不…

10 Go的映射

概述 在上一节的内容中&#xff0c;我们介绍了Go的结构体&#xff0c;包括&#xff1a;定义结构体、声明结构体变量、使用结构体、结构体关联函数、new、组合等。在本节中&#xff0c;我们将介绍Go的映射。Go语言中的映射&#xff08;Map&#xff09;是一种无序的键值对集合&am…

【Hadoop】MapReduce详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f…

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…