计算机视觉目标检测-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…

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

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

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;最后是拒绝服务事件 恶意程序…

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

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

《解锁 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…

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

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

Docker下TestHubo安装配置指南

TestHubo是一款开源免费的测试管理工具&#xff0c; 下面介绍Docker 私有部署的安装与配置。TestHubo 私有部署版本更适合有严格数据安全要求的企业&#xff0c;支持在本地或专属服务器上运行&#xff0c;以实现对数据和系统的完全控制。 1、Docker 服务端安装 Docker安装包下…

Redis实战篇(四、高级数据结构的使用)

目录 五、达人探店 1.发布探店笔记 2.查看探店笔记 3.点赞功能 4.点赞排行榜 六、好友关注 1.关注和取消关注 2.共同关注 3.关注推送 &#xff08;1&#xff09;Feed流实现方案分析 &#xff08;2&#xff09;推送到粉丝收件箱 &#xff08;3&#xff09;实现分页查询…

基本操作:iframe、alert

背景 如果你的目标元素出现在一个iframe标签下&#xff0c;则不能直接定位&#xff0c;必须先完成切换才能进行定位操作&#xff0c;如下图 整个理解为一个大的房间&#xff0c;里面是客厅&#xff0c;driver进到客厅后&#xff0c;如果想操作iframe A里的数据&#xff0c;需…

【C++11】类型分类、引用折叠、完美转发

目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后&#xff0c;进一步对类型进行了划分&#xff0c;右值被划分纯右值(pure value&#xff0c;简称prvalue)和将亡值 (expiring value&#xff0c;简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…

IntelliJ Idea常用快捷键详解

文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中&#xff…

kafka的备份策略:从备份到恢复

文章目录 一、全量备份二、增量备份三、全量恢复四、增量恢复 前言&#xff1a;Kafka的备份的单元是partition&#xff0c;也就是每个partition都都会有leader partiton和follow partiton。其中leader partition是用来进行和producer进行写交互&#xff0c;follow从leader副本进…

怎么模仿磁盘 IO 慢的情况?并用于MySQL进行测试

今天给大家分享一篇在测试环境或者是自己想检验自己MySQL性能的文章 实验环境&#xff1a; Rocky Linux 8 镜像&#xff1a;Rocky-8.6-x86_64-dvd.iso 1. 创建一个大文件作为虚拟磁盘 [rootlocalhost ~] dd if/dev/zero of/tmp/slowdisk.img bs1M count100 记录了1000 的读入…

1.微服务灰度发布(方案设计)

前言 微服务架构中的灰度发布&#xff08;也称为金丝雀发布或渐进式发布&#xff09;是一种在不影响现有用户的情况下&#xff0c;逐步将新版本的服务部署到生产环境的策略。通过灰度发布&#xff0c;你可以先将新版本的服务暴露给一小部分用户或特定的流量&#xff0c;观察其…

【开源免费】基于SpringBoot+Vue.JS安康旅游网站(JAVA毕业设计)

本文项目编号 T 098 &#xff0c;文末自助获取源码 \color{red}{T098&#xff0c;文末自助获取源码} T098&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…