计算机视觉目标检测-1

devtools/2024/12/27 3:03:52/

文章目录

  • 摘要
  • Abstract
  • 1.目标检测任务描述
    • 1.1 目标检测分类算法
    • 1.2 目标定位的简单实现思路
      • 1.2.1 回归位置
  • 2.R-CNN
  • 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.ppmy.cn/devtools/145694.html

相关文章

python爬取网站

这个示例将抓取一个假设的商品列表网站&#xff0c;提取商品名称和价格&#xff0c;并将数据保存到CSV文件中。 pip install requests beautifulsoup4 pandas然后&#xff0c;使用以下代码&#xff1a; import requests from bs4 import BeautifulSoup import pandas as pd i…

【提取学习通作业考试题目答案下载到本地或者POST数据库】

这段油猴&#xff08;Tampermonkey&#xff09;脚本是用来提取学习通&#xff08;Chaoxing&#xff09;平台上作业和考试题目的个人答案&#xff0c;并将其转换成Excel格式的题库&#xff0c;方便浏览或分享给他人。让我们逐步分析脚本的功能和结构&#xff1a; 脚本功能概述 …

WEB安全漏洞之路径遍历、跳转等漏洞解析

1. 路径遍历漏洞&#xff08;Path Traversal Vulnerability&#xff09; 路径遍历漏洞&#xff08;又叫目录遍历漏洞&#xff09;是指攻击者通过操控文件路径&#xff0c;使得应用访问服务器上未授权的文件或目录。攻击者通常通过操控文件路径中的 ../ &#xff08;路径上移符…

WPF制作图片闪烁的自定义控件

1.定义自定义控件 BlinkingImage.cs: using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Animation; using System.Windows.Media.Imaging;namespace YourNamespace {public class BlinkingImage : Control{public static rea…

STM32HAL库中RTC闹钟设置时分秒,年月日

在STM32的HAL库中&#xff0c;RTC&#xff08;实时时钟&#xff09;模块提供了多种功能来管理时间和日期&#xff0c;包括设置闹钟。对于RTC闹钟功能&#xff0c;确实主要集中在时、分、秒的配置上&#xff0c;但年、月、日也可以通过RTC日期寄存器进行设置&#xff0c;并且可以…

Flutter persistentFooterButtons控件详解

文章目录 1. persistentFooterButtons 的用途2. persistentFooterButtons 的定义3. persistentFooterButtons 的基本用法示例 1&#xff1a;简单的底部按钮解释&#xff1a; 4. persistentFooterButtons 的常见用法示例 2&#xff1a;使用不同的按钮类型解释&#xff1a;示例 3…

中关村科金海外外呼机器人如何通过大数据分析帮助跨境电商实现精准营销?

精准营销是企业提升市场竞争力、优化客户体验和实现可持续增长的关键策略。与传统的广撒网式营销不同&#xff0c;精准营销通过数据分析、人工智能和机器学习等先进技术&#xff0c;深入了解客户的偏好、行为和需求&#xff0c;从而提供高度个性化的产品和服务推荐。中关村科金…

快速理解24种设计模式

简单工厂模式 建立产品接口类&#xff0c;规定好要实现方法。 建立工厂类&#xff0c;根据传入的参数&#xff0c;实例化所需的类&#xff0c;实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例&#xff0c;并提供一个访问他它的全局…