计算机视觉目标检测-1

文章目录

  • 摘要
  • Abstract
  • 1.目标检测任务描述
    • 1.1 目标检测分类算法
    • 1.2 目标定位的简单实现思路
      • 1.2.1 回归位置
  • 2.R-CNN
    • 2.1 目标检测-Overfeat模型
      • 2.1.1 滑动窗口
    • 2.2 目标检测-RCNN模型
      • 2.2.1 非极大抑制(NMS)
    • 2.3 目标检测评价指标
  • 3.SPPNet
    • 3.1 spatial pyramid pooling
  • 4.总结
  • 5.参考文献

摘要

目标检测是计算机视觉领域的重要任务,旨在精确识别图像中的物体及其位置。传统方法如滑动窗口和Overfeat通过暴力穷举实现目标检测,但计算资源需求较高且准确率有限。RCNN创新性地引入候选区域方法,通过Selective Search生成候选区域,并结合CNN特征提取、SVM分类和边界框回归,实现更高的检测精度。然而,RCNN存在多阶段训练复杂、计算效率低等问题。SPPNet对RCNN进行了改进,提出空间金字塔池化(SPP)层,减少了特征冗余并共享CNN计算结果,大幅提升了训练速度。尽管SPPNet提高了效率,但其分阶段训练的缺陷仍限制了实用性。本周学习了目标检测算法的发展过程,包括目标定位、候选区域生成、分类及评价指标,分析了RCNN和SPPNet的核心技术及其优势与不足。

Abstract

Object detection is an important task in the field of computer vision, which aims to accurately identify objects and their positions in images. Traditional methods such as sliding window and Overfeat achieve object detection through brute force exhaustion, but the computational resources are high and the accuracy is limited. RCNN innovatively introduces candidate region method, generates candidate region by Selective Search, and combines CNN feature extraction, SVM classification and boundary box regression to achieve higher detection accuracy. However, RCNN has the problems of complex multi-stage training and low computational efficiency. SPPNet improves RCNN by proposing a space pyramid pool (SPP) layer, which reduces feature redundancy and shares CNN calculation results, greatly improving the training speed. Although SPPNet improves efficiency, its phased training limitations limit its usefulness. This week, we learned the development process of target detection algorithm, including target location, candidate region generation, classification and evaluation index, and analyzed the core technologies of RCNN and SPPNet and their advantages and disadvantages.

1.目标检测任务描述

1.1 目标检测分类算法

两步走的目标检测
1. 先找出一些候选区域
2. 对区域进行调整、分类
端到端的目标检测
1. 采用一个网络一步到位
2. 输入图片,输出又哪些物体,物体在什么位置
物体位置:
1. x,y,w,h[bounding box]:(x,y)为物体的中心位置,以及中心点距离物体两边的长宽;
2. xmin、ymin、xmax、ymax :物体位置的左上角、右下角坐标

1.2 目标定位的简单实现思路

在分类直接输出各个类别的概率,如果在加上定位,可以考虑在网络的最后输出加上位置信息。

1.2.1 回归位置

增加一个全连接层,FC1、FC2
FC1:作为类别的输出
FC2:作为这个物体位置数值的输出
在这里插入图片描述
右上角的全连接层是对物体进行分类(衡量整个网路的损失可以使用交叉熵损失函数进行训练);右下角为位置输出(与真实标签进行对比,衡量网络可以使用均方误差损失)

2.R-CNN

对于多个目标的情况,不能使用固定个数输出物体的位置。

2.1 目标检测-Overfeat模型

2.1.1 滑动窗口

首先定义k个大小窗口,每个窗口滑动提取m个,总共提取k*m张图片,通常会直接将图片变形转换为固定大小的图片,变形图像块被输入cnn分类器中,提取特征后,使用一些分类器识别类别和该边界框的另一个线性回归器。
在这里插入图片描述
Overfeat总结:这种方法类似一种暴力穷举的方式,会消耗大量的计算资源,窗口大小的设置可能会造成不准确。但是提供了一种解决目标检测问题的思路。

2.2 目标检测-RCNN模型

不使用暴力方法,使用候选区域方法,创建目标检测的区域,为图像领域实现物体检测模型提供了思路。
RCNN在物体检测中的步骤:

  1. 使用SelectiveSearch在一张图片上提取2000个候选区域(长宽不固定)
  2. 对2000个候选区域做候选区变换,输入cnn网络中,得到特征向量[2000,4096]
  3. 经过20个类被的SVM分类器,对2000个候选区域做判断,得到[2000,20]得分矩阵
  4. 对2000个候选区域做非极大值抑制,剩下一些得分高,结果好的框
  5. 修正候选框,对bbox做回归微调

下面是R-CNN选用SVM进行二分类。假设检测20个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样就能的出2000*20的得分矩阵
在这里插入图片描述
ss方法代码实现:

def selective_search(im_orig, scale=1.0, sigma=0.8, min_size=50):"""选择性搜索生成候选区域:param im_orig: 输入3通道图像:param scale: 分割参数, 数值越小, 分割越精细:param sigma: 分割图像前对图像进行高斯平滑的参数:param min_size: 分割的最小单元, 一般设置10-100间:return: img-带有区域标签的图像(r, g, b, region), regions-字典{”rect“:(left, top, width, height), "labels":[...]}"""assert im_orig.shape[2] == 3, "3ch image is expected"# 加载图像获取最小分割区域# 区域标签存储在每个像素的第四个通道 [r, g, b, region]img = _generate_segments(im_orig, scale, sigma, min_size)if img is None:return None, {}imsize = img.shape[0] * img.shape[1]R = _extract_regions(img)# 获取相邻区域对neighbours = _extract_neighbours(R)# 计算初始相似度S = {}for (ai, ar), (bi, br) in neighbours:S[(ai, bi)] = _calc_sim(ar, br, imsize)# 进行层次搜索, 直到没有新的相似度可以计算while S != {}:# 获取两最大相似度区域的下标(i, j)i, j = sorted(list(S.items()), key=lambda a: a[1])[-1][0]# 将最大相似度区域合并为一个新的区域rtt = max(R.keys()) + 1.0R[t] = _merge_regions(R[i], R[j])# 标记相似度集合中与(i, j)相关的区域, 并将其移除key_to_delete = []for k, v in S.items():if (i in k) or (j in k):key_to_delete.append(k)# 移除相关区域for k in key_to_delete:del S[k]# 计算与新区域rt与相邻区域的相似度并添加到集合S中for k in filter(lambda a: a != (i, j), key_to_delete):n = k[1] if k[0] in (i, j) else k[0]S[(t, n)] = _calc_sim(R[t], R[n], imsize)regions = []for k, r in R.items():regions.append({'rect': (r['min_x'], r['min_y'], r['max_x'] - r['min_x'], r['max_y'] - r['min_y']),'size': r['size'],'labels': r['labels']})return img, regions

ss方法生成的推荐区域示例:
在这里插入图片描述

2.2.1 非极大抑制(NMS)

对于2000个候选框,对于上面提到的20个物体值保留一个最优的框,同时抑制哪些冗余的候选框。RCNN预测2000个候选框,得到k个(假设有k个ground truth)比较准确的候选框。
迭代过程:
对于2000个候选区域得分进行概率筛选,小于0.5的全部丢弃。
对于剩余的框,假设图片真实物体个数为2(n),筛选之后候选框为5(p),计算n中每个物体位置与所有p的交并比IoU,得到p中每个候选框对应IoU最高的一个。如下图,A,C候选框对应左边车辆,B,D,E对应右边车辆。
在这里插入图片描述
NMS实现:

import numpy as np
import torchdef nms_cpu(dets, thresh):#dets(detections)就是矩形目标框(候选),大概有一两万个,thresh=0.7阈值dets = dets.numpy()x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]#取出矩形左上角和右下角的坐标scores = dets[:, 4]#第五个维度存放每个矩形的分值areas = (x2 - x1 + 1) * (y2 - y1 + 1)#每个矩形的面积order = scores.argsort()[::-1]#降序排列,分值高的在前面。#argsort,排序得到的是下标,并没有把原数据排序keep = []#保存需要留下来的目标框的下标while order.size > 0:i = order.item(0)#取x第一个下标keep.append(i)#第一个下标总归会保留下来xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (areas[i] + areas[order[1:]] - inter)#计算第一个候选框与后面所有候选框的IOUinds = np.where(ovr <= thresh)[0]#小于阈值的order的下标-1;两个注意点:第一,order的下标,不是dets的下标,第二,比order的下标少1#把大于阈值的候选框过滤出去,小于或等于阈值的留下来#inds 是下标order的下标,即order存的是dets的下标#np.where返回的是一个tuple,因此需要加[0]取出第一个元素,该元素就是一个下标数组#比如order=[0,10,12,33,965,7000,900],len(order)=7#比如inds=[1,2,5],因为len(order[1:])=6,所以inds的值最多是5,order的下标最多是6order = order[inds + 1]#把下标少1加回来,并取出下一轮的order值#inds+1=[2,3,6]#因为计算IOU时,x1[order[1:]],即不计算自己与自己的IOU,#所以下标与order对应的下标刚好少1,即len(inds)<=len(order)-1,因此需要inds+1才刚好从order中取出下标#此时order=[12,33,900],进入下一个循环return torch.IntTensor(keep)

为了使候选框更加准确,需要去修正原来的位置,R-CNN提供了一个方法,建立bbox regressor,回归用于修正筛选后的候选区域,使其回归ground-truth,默认认为这两个框之间为线性关系,因为在最后筛选出来的候选区域和ground-truth很接近了。
在这里插入图片描述
上述也就是去训练学习参数的过程。

2.3 目标检测评价指标

  1. IoU(交并比):两个区域的重叠程度overlap,候选区域和标定区域的IoU值
    通常类别正确且IoU>0.5,IoU越接近1则表示候选框越精确。
    在这里插入图片描述
  2. 平均精确率
    对于IoU只是知道重叠程度并不知道分类的性能情况。引入平均精确率,多个分类任务的AP的平均值
    对于每个类别计算AP(AUC)的值
    1.对于猫类别:候选框预测是猫类别的概率做一个排序(大于0.7表示为正样本否则表示为负样本),得到候选框排序列表
    2.对于猫当中候选框排序列表进行计算AUC值
    3.最终得到k(20)个类别,20个AP相加

总结:表现在VOC2007数据集上的平均精度map达到66%。
缺点:
1.训练阶段多:步骤繁琐(微调网络+训练SVM+训练边框回归器)
2.训练耗时:占用磁盘空间大(VOC数据集的检测结果,由于SVM的存在)
3.处理速度慢:使用GPU,VGG模型处理一张图片需要47s
4.图片形状变化:候选区域经过crop/warp进行固定大小,无法保证图片不变形

3.SPPNet

相对于RCNN主要存在两点改进的地方,提出了SPP层。

  1. 图片输入到网络先得到一个feature map
  2. 原图中通过选择搜索得到的候选区域直接映射feature map中对应位置
  3. 映射过来额候选区域的特征经过SPP层,输出固定大小的特征向量。

3.1 spatial pyramid pooling

通过spp层将特征图转换成固定大小的特征向量
示例:
假设原图输入时224*224,对于conv出来后的输出为13 * 13 * 256,其中某个映射的候选区域假设为:12 * 10 * 256

  1. spp层将每一个候选区域分为1 * 1,2 * 2 ,4 * 4 三张子图,对每个子图的每个区域做max pooling,得出特征在连接到一起(16+4+1) * 256=5376,接着给全连接层做进一步处理
  2. Spatial bins(空间盒个数):21

在这里插入图片描述
总结

  1. 优点:SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间,后面的Fast R-CNN受SPPNet的启发
  2. 缺点:训练仍然很慢,效率低,特征需要写入磁盘(SVM的存在)
    分阶段训练网络:选取候选区域,训练CNN,训练SVM,训练bbox回归器,SPPNet反向传播效率低

4.总结

目标检测算法从早期的暴力穷举逐步发展到基于深度学习的高效框架,如RCNN和SPPNet。RCNN通过候选区域和CNN结合,大幅提高了检测精度,但其多阶段训练过程复杂,耗时且占用大量磁盘空间。SPPNet的出现利用SPP层实现CNN层共享,显著提升了训练效率,启发了后续的Fast R-CNN等方法。然而,SPPNet仍需多阶段训练,效率提升有限。

5.参考文献

[1] R. Girshick, J. Donahue, T. Darrell, and J. Malik, “Rich feature hierarchies for accurate object detection and semantic segmentation,” 2014 IEEE Conference on Computer Vision and Pattern Recognition, Columbus, OH, USA, 2014, pp. 580-587, doi: 10.1109/CVPR.2014.81
[2] K. He, X. Zhang, S. Ren, and J. Sun, “Spatial pyramid pooling in deep convolutional networks for visual recognition,” IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 37, no. 9, pp. 1904-1916, Sep. 2015, doi: 10.1109/TPAMI.2015.2389824

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

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

相关文章

减速机润滑油的选用原则

减速机在投入运行前必须加入适当粘度的润滑油&#xff0c;须使齿轮间摩擦减小&#xff0c;遇高负荷及冲击负荷时&#xff0c;减速机才能充分发挥其机能。那么&#xff0c;应该如何选择减速机的润滑油呢&#xff1f; 1、粘度选择&#xff1a;粘度是齿轮油的一个重要理化指标&…

解线性方程组

直接三角分解&#xff08;LU分解&#xff0c;Doolittle分解&#xff09; ATM分解&#xff08;追赶法&#xff0c;Crout分解&#xff0c;克劳特分解&#xff09; 平方根法&#xff08;Cholesky分解&#xff0c;乔列斯基分解&#xff09; 矩阵的范数

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…

如何高效学习PHP框架源码

为什么学习php框架源码 学习PHP框架源码是软件开发领域中的一个重要环节&#xff0c;它带来了诸多益处&#xff0c;无论是对于个人技能的提升&#xff0c;还是对于实际项目开发的优化&#xff0c;都有着不可忽视的作用。以下是一些具体的原因&#xff0c;解释了为什么学习PHP框…

HAL库STM32硬件IIC驱动数字电位器MCP4017

目录 一、芯片特性 二、硬件电路 三、工程搭建 四、IIC硬件地址 五、驱动程序 项目需要&#xff0c;最近用到了一个IIC接口的数字电位器&#xff0c;型号&#xff1a;MCP4017T-502E。对应阻值5K&#xff0c;使用STM32G030F6的硬件IIC驱动&#xff0c;发现简单的不得了&…

git设置项目远程仓库指向github的一个仓库

要将你的Git项目设置为指向GitHub上的远程仓库&#xff0c;你需要执行以下步骤&#xff1a; 创建GitHub仓库&#xff1a; 登录到你的GitHub账户。点击右上角的 “” 号&#xff0c;选择 “New repository” 创建一个新的仓库。填写仓库的名称&#xff0c;可以添加描述&#xff…

Vim 编辑器详细教程

Vim 编辑器详细教程 Vim 是一个强大的文本编辑器&#xff0c;以其高效的编辑能力和强大的功能著称&#xff0c;特别适合程序员和文字处理工作者。以下是一个详细的 Vim 教程&#xff0c;从基础操作到高级用法。 1. Vim 基础操作 1.1 Vim 的三种模式 正常模式&#xff08;Nor…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

&#x1f380;&#x1f380;&#x1f380;uni-app 跨端开发系列 &#x1f380;&#x1f380;&#x1f380; 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

17.2、应急事件场景与处理流程

目录 常见网络安全应急事件场景网络安全应急处理流程应急演练类型 常见网络安全应急事件场景 应急事件的处理场景&#xff0c;分成四类场景&#xff0c;恶意程序事件&#xff0c;网络攻击事件&#xff0c;还有网站相关的一些安全事件&#xff0c;最后是拒绝服务事件 恶意程序…

PostgreSQL表达式的类型

PostgreSQL表达式是数据库查询和操作中非常重要的组成部分。它们由一个或多个值、运算符和PostgreSQL函数组合而成,用于求值或执行特定的操作。PostgreSQL表达式类似于公式,是用查询语言编写的。它们可以用于查询数据库中的特定数据集,或者在进行数据操作时执行计算和逻辑判…

.NET能做什么?全面解析.NET的应用领域

.NET 是由微软开发的一个开源、跨平台的开发框架。它不仅支持构建各种应用程序&#xff0c;还能运行在不同的操作系统上&#xff0c;包括 Windows、Linux 和 macOS。自从 .NET Core 的推出&#xff0c;.NET 成为了一个现代化的开发平台&#xff0c;能够满足企业和开发者日益多样…

19_HTML5 Web Workers --[HTML5 API 学习之旅]

HTML5 Web Workers 是一种允许 JavaScript 在后台线程中运行的技术&#xff0c;从而不会阻塞用户界面或其他脚本的执行。通过使用 Web Workers&#xff0c;你可以执行复杂的计算任务而不影响页面的响应速度&#xff0c;提升用户体验。 Web Workers 的特点 Web Workers 是 HTM…

十二、SQL 进阶:高级技巧提升查询效率实战指南

SQL 进阶&#xff1a;高级技巧提升查询效率实战指南 一、索引优化&#xff1a;数据库的“高速公路” 索引犹如图书馆里的书籍索引卡&#xff0c;可使数据库迅速定位所需数据&#xff0c;避免全表扫描。例如&#xff0c;在存储员工信息的表employees&#xff08;包含字段emplo…

Java 23和JDK 23详细安装方法,常用命令使用等

Java JDK 23 是 Oracle 提供的最新版本的 Java 开发工具包&#xff0c;它包含了 Java 编程语言的最新特性和改进。本教程将介绍如何安装 JDK 23&#xff0c;并详细讲解一些常用的命令和用法。 一、安装 JDK 23 下载 JDK 23&#xff1a; 提供了 Windows、macOS 和 Linux 的安装…

红黑树 Red-Black Tree介绍

1. 红黑树的定义 红黑树是一种具有如下性质的二叉搜索树&#xff1a; 每个节点是红色或黑色。根节点是黑色。所有叶子节点都是黑色的空节点&#xff08;NIL节点&#xff09;&#xff0c;即哨兵节点。如果一个节点是红色&#xff0c;那么它的子节点一定是黑色。&#xff08;不存…

《解锁 Python 数据挖掘的奥秘》

《解锁 Python 数据挖掘的奥秘》 一、Python 数据挖掘基础&#xff08;一&#xff09;Python 基础与数据挖掘环境搭建&#xff08;二&#xff09;数据挖掘基本流程概述 二、Python 数据挖掘核心技术&#xff08;一&#xff09;数据收集与预处理技术&#xff08;二&#xff09;常…

爆改RagFlow

Rag理论概述 由近期 RAGFlow 的火爆看 RAG 的现状与未来 Ragflow解析参数说明 ♥ RagFlow源码解析 实际的文件解析通过接口 /v1/document/run 进行触发的&#xff0c;实际的处理是在 api/db/services/task_service.py 中的 queue_tasks() 中完成的&#xff0c;此方法会根据文件…

【GeekBand】C++设计模式笔记15_Proxy_代理模式

1. “接口隔离” 模式 在组件构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题&#xff0c;甚至根本无法实现。采用添加一层间接&#xff08;稳定&#xff09;接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式 FacadeProxyAdapte…

OpenTK 中帧缓存的深度解析与应用实践

摘要: 本文深入探讨了 OpenTK 中帧缓存的使用。首先介绍了帧缓存的基本概念与在图形渲染管线中的关键地位,包括其与颜色缓存、深度缓存、模板缓存等各类缓存的关联。接着详细阐述了帧缓存对象(FBO)的创建、绑定与解绑等操作,深入分析了纹理附件、渲染缓冲区附件在 FBO 中的…

springboot测试类里注入不成功且运行报错

目录 出错信息 原因 出错信息 写测试类的时候&#xff0c;一直说我注入不成功 而且我运行的时候报错了 java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or SpringBootTest(classes...) with your te…