计算机视觉目标检测-1

embedded/2024/12/29 20:53:15/

文章目录

  • 摘要
  • 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/embedded/149095.html

相关文章

35. TCP网络编程

一、TCP协议简介 1.1、什么是TCP协议 TCP 协议则是建立在 IP 协议之上的。TCP 协议负责在两台计算机之间建立可靠连接&#xff0c;保证数据包按顺序达到。TCP 协议会通过 3 次握手建立可靠连接。然后需要对每个 IP 包进行编号&#xff0c;确保对方按顺序收到&#xff0c;如果包…

【西安电子科技大学考研】25官方复试专业课参考书目汇总

初试已经顺利考完啦、成绩已经公布&#xff0c;现在已经有很多同学来问学长学姐&#xff0c;复试参考书有哪些&#xff0c;复试应该做好哪些准备。故此学长学姐给大家整理好了西安电子科技大学各个学院的复试参考书目录&#xff0c;有需要的同学可以参考一下哈。大家可以结合本…

node.js web框架koa的使用

koa框架使用的步骤&#xff1a; 输入网址后出现两层打印&#xff0c;第一个打印是针对我们输入网址按下回车发送的请求&#xff0c;第二个打印是针于浏览器自己会发起的关于网站图标获取的请求 第二成中间件调用next()之后的结果&#xff08;这个next相当于写的下一个中间件&am…

HTTP—02

方法&#xff08;method&#xff09; 方法说明支持的HTTP协议版本GET获取资源1.0 1.1POST传输实体主体1.0 1.1PUT传输文件1.0 1.1HEAD获得报文首部1.0 1.1DELETE删除文件1.0 1.1OPTION询问支持的方法1.0TRACE追踪路径1.0CONNECT要求用隧道协议连接代理1.0LINK建立和资源之…

python脚本实现csv中百度经纬度转84经纬度

数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84

在 Ubuntu 下通过 Docker 部署 PSQL 服务器

嗨&#xff0c;各位技术爱好者&#xff01;今天我们要聊的是如何在 Ubuntu 系统中通过 Docker 部署 PostgreSQL&#xff08;简称 PSQL&#xff09;服务器。对于那些还不熟悉 Docker 和 PSQL 的小伙伴&#xff0c;Docker 是一个开源的容器化平台&#xff0c;可以让你轻松构建、部…

Excel粘贴复制不完整的原因以及解决方法

在数据处理和分析的过程中&#xff0c;Excel无疑是不可或缺的工具。然而&#xff0c;在使用Excel进行复制粘贴操作时&#xff0c;有时会遇到粘贴不完整的情况&#xff0c;这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案&#xff0c;并给出…

C:\Windows 文件夹

在Windows操作系统中&#xff0c;C:\Windows 文件夹是一个非常重要的系统文件夹&#xff0c;它包含了Windows操作系统的核心文件和组件。主要子文件夹&#xff1a; System32: 包含了大多数Windows系统的可执行文件和动态链接库&#xff08;DLL&#xff09;文件。 SysWOW64: 在6…