R-CNN 家族是一个 two-stage 的目标检测算法.
目标检测算法
三大分类:
- 传统的目标检测算法:
- Cascade + HOG/DPM + Haar/SVM
- 候选窗 + 深度学习分类:
- R-CNN (Selective Search + CNN + SVM)
- Fast R-CNN (Selective Search + CNN + ROI)
- Faster R-CNN (RPN + CNN + ROI)
- 深度学习回归方法:
- Yolo
- SSD
- DenseBox
- RRC detection
- Deformable CNN
重点
SPP 池化 (2014)
SPP(Spatial Pyramid Pooling) 即金字塔池化, 可以帮助我们将图像切分成各种粗细级别, 然后整合特征. SPP 解决了 R-CNN 把图片统一缩放到一定的大小, 从而失去了多尺寸的信息的问题.
如图, 特征图通道数为 256, 通过金字塔池化我们可以得到 1 × 1, 2 × 2, 和 4 × 4 的特征图:
- 对整个图片池化每层得到一个点, 共 256 个点, 构成一个 1 × 256 的向量
- 将图片划分成 2 × 2 的格子, 共 256 个点, 构成一个 4 × 256 的向量
- 将图片划分成 4 × 4 的格子, 共 256 个点, 构成一个 16 × 256 的向量
- 对得到的结果进行拼接, 得到 (1 + 4 + 16) × 256 = 21 × 256 个向量
代码实现:
import math
import torch
import torch.nn.functional as F
# 构建SPP层(空间金字塔池化层)
class SPPLayer(torch.nn.Module):
def __init__(self, num_levels, pool_type='max_pool'):
super(SPPLayer, self).__init__()
self.num_levels = num_levels
self.pool_type = pool_type
def forward(self, x):
num, c, h, w = x.size() # num:样本数量 batch_size c:通道数 h:高 w:宽
for i in range(self.num_levels):
level = i+1
kernel_size = (math.ceil(h / level), math.ceil(w / level))
stride = (math.ceil(h / level), math.ceil(w / level))
pooling = (math.floor((kernel_size[0]*level-h+1)/2), math.floor((kernel_size[1]*level-w+1)/2))
# 选择池化方式
if self.pool_type == 'max_pool':
tensor = F.max_pool2d(x, kernel_size=kernel_size, stride=stride, padding=pooling).view(num, -1)
else:
tensor = F.avg_pool2d(x, kernel_size=kernel_size, stride=stride, padding=pooling).view(num, -1)
# 展开、拼接
if (i == 0):
x_flatten = tensor.view(num, -1)
else:
x_flatten = torch.cat((x_flatten, tensor.view(num, -1)), 1)
return x_flatten
金字塔池化通过最大池化解决了固定图像尺寸的限制, 并提高了提取特征的效率.
RPN 网络
RPN (Region Proposal Network) 是一种快速筛选候选框的算法. RPN 是基于滑动窗口的目标检测器, 输入是任意尺度的图像, 输出是一系列矩形候选区域.
RPN 网络 由一个 3 × 3 的卷积层, 分成两个 1 × 1的卷积层. 如图:
RPN 分为两个部分:
- 判断物体还是背景 (2 × 9): 通过 IOU 阈值, 把 IOU > 0.7 的作为物体, IOU < 0.3 的作为背景
- 修正坐标 (4 × 9): 找到锚框 (Anchor Box) 和真实框的映射关系. 可以通过平移和缩放实现.
RPN 的优势在于可以帮助我们判断物体和背景, 并使得锚框更接近真实框.
ROI 池化 (2015)
ROI (Region of Interest Pooling) 是 SPP 池化的简化版.
从大小不同的框中提取特征使得输出结果是等大的:
从上图我们可以看到一个 8 × 8 的特征图.
我们希望从这个 7 × 5 的预选框中得到 2 × 2 的特征.
比起 R-CNN 的一刀切, ROI 会从分割的四块区域进行最大池化 (Max Pooling)
ROI 池化 SPP 池化:
- 两者都是用来把不同尺寸特征输入转化为相同尺寸特征输出
- ROI 池化相当于单尺度的 SPP, 对一个输入只进行一次池化操作
R-CNN (2013)
R-CNN (Region Based Convolutional Neural Networks) 是第一个成功将深度学习应用到目标检测上的算法.
R-CNN 流程:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
你选择,真正体系化!**
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-THc38Z9w-1712549852410)]