Region Proposal:候选框、候选区域
目录
代码解读参考
Pytorch | yolov3原理及代码详解(一)_yolov3代码详解pytorch_NotFound1911的博客-CSDN博客
Pytorch | yolov3原理及代码详解(二)_for batch_i, (_, imgs, targets) in enumerate(datal_NotFound1911的博客-CSDN博客
Pytorch | yolov3原理及代码详解(三)_"enumerate(tqdm.tqdm(dataloader, desc=\"detecting _NotFound1911的博客-CSDN博客
Pytorch | yolov3原理及代码详解(四)_NotFound1911的博客-CSDN博客
AlexNet
AlexNet网络详解_alnex网络_红鲤鱼与绿驴的博客-CSDN博客
AlexNet一共包含8层,前5层由卷积层(其中卷积层1、2、5后含有下采样层)组成,而剩下的3层为全连接层。最后一层全连接层的输出作为softmax的输入,得到1000个图像分类标签对应的概率值。除了GPU并行结构的设计,AlexNet网络结构与LeNet十分相似,其网络的参数配置如下表所示。
RCNN
R-CNN全称region with CNN features,其实它的名字就是一个很好的解释。用CNN提取出Region Proposals
中的featues
,然后进行SVM分类与bbox的回归。
选择性搜索(SelectiveSearch,SS)中,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。
下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。
SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。
步骤(以AlexNet网络为基准)
1.找出图片中可能存在目标的侯选区域region proposal
2.将候选区域调整为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成网络AlexNet最终输出:2000×4096维矩阵
3.将2000×4096维特征经过SVM分类器(20种分类,SVM是二分类器,则有20个SVM),获得2000×20种类别矩阵
4.分别对2000×20维矩阵中进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到与目标物体最高的一些建议框
5.修正bbox,对bbox做回归微调
存在问题
- 尺寸归一化导致物体变形,纵横比特征丢失
- 重复使用网络计算特征,低实时性(单图像GPU处理时间14s)
SVM
概念
支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面,可以将问题化为一个求解凸二次规划的问题。与逻辑回归和神经网络相比,支持向量机,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。
具体来说就是在线性可分时,在原空间寻找两类样本的最优分类超平面。在线性不可分时,加入松弛变量并通过使用非线性映射将低维度输入空间的样本映射到高维度空间使其变为线性可分,这样就可以在该特征空间中寻找最优分类超平面。
SVM使用准则: 为特征数, 为训练样本数。
如果相较于而言,要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
如果较小,而且大小中等,例如在 1-1000 之间,而在10-10000之间,使用高斯核函数的支持向量机。
如果较小,而较大,例如在1-1000之间,而𝑚大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
SVM的优缺点
优点:
支持向量机算法可以解决小样本情况下的机器学习问题,简化了通常的分类和回归等问题。
由于采用核函数方法克服了维数灾难和非线性可分的问题,所以向高维空间映射时没有增加计算的复杂性。换句话说,由于支持向量计算法的最终决策函数只由少数的支持向量所确定,所以计算的复杂性取决于支持向量的数目,而不是样本空间的维数。
支持向量机算法利用松弛变量可以允许一些点到分类平面的距离不满足原先要求,从而避免这些点对模型学习的影响。
缺点:
支持向量机算法对大规模训练样本难以实施。这是因为支持向量机算法借助二次规划求解支持向量,这其中会涉及m阶矩阵的计算,所以矩阵阶数很大时将耗费大量的机器内存和运算时间。
经典的支持向量机算法只给出了二分类的算法,而在数据挖掘的实际应用中,一般要解决多分类问题,但支持向量机对于多分类问题解决效果并不理想。
SVM算法效果与核函数的选择关系很大,往往需要尝试多种核函数,即使选择了效果比较好的高斯核函数,也要调参选择恰当的参数。另一方面就是现在常用的SVM理论都是使用固定惩罚系数C,但正负样本的两种错误造成的损失是不一样的。
空间金字塔池化网络SPP-Net
空间金字塔池化网络SPP-Net_空间金字塔池哈希网络_AndSonder的博客-CSDN博客
特征
1、提出金字塔池化操作,可以适应任何大小的输入图像。
2、计算整幅图像的特征图,根据相应位置进行截取。
3、使用了多级别的空间箱(bin),而滑窗池化则只用了一个窗口尺寸。多级池化对于物体的变形十分鲁棒。
4、由于其对输入的灵活性,SPP可以池化从各种尺度抽取出来的特征。
5、将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。
概要介绍
现有的深卷积神经网络(CNNs)需要一个固定大小(如224×224)的输入图像。这种要求是“人为的”,可能会降低对任意大小/比例的图像或子图像的识别精度。在这项工作中,我们为网络配备了另一种池策略“空间金字塔池”,以消除上述要求。这种新的网络结构称为SPP网,它可以生成一个固定长度的表示,而不考虑图像的大小/比例。金字塔池对对象变形也很健壮。有了这些优势,SPP网应该在总体上改进所有基于CNN的图像分类方法。
SPP-net使用单一的完整图像表示而不是精细的方法实现了最先进的分类结果-调音SPP网络的强大功能在目标检测中也很重要。利用SPP网络,我们只需计算一次来自整个图像的特征映射,然后将任意区域(子图像)的特征集合起来生成固定长度的表示,以训练检测器。该方法避免了重复计算卷积特征。在处理测试图像时,我们的方法比R-CNN方法快24-102倍
引入原因
引出SPP-Net的原因:
在cnn的训练和测试中存在一个技术问题:目前流行的CNNs要求输入图像大小固定(如224×224),这既限制了输入的纵横比,也限制了输入的规模图像。什么时候对于任意大小的图像,当前的方法大多是将输入图像调整为固定大小,通过裁剪或通过翘曲,如图所示。但是裁剪区域可能不包含整个对象,而扭曲的内容可能会导致不需要的几何图形扭曲。识别由于内容丢失或失真,精度可能会受到影响。
cnn主要由两部分组成:卷积层和随后的完全连接层。卷积层以滑动窗口方式操作,并输出表示激活的空间排列的特征图(图2)。事实上,旋转层不需要固定的图像大小,可以生成任何尺寸的特征图。另一方面,完全连接的层需要有固定大小/长度的定义输入。因此,固定大小约束仅来自完全连接层。
优点
SPP对于深层CNN有几个显著的特性:1)SPP能够生成固定长度的输出,而不考虑输入大小,而以前的deepnetworks中使用的滑动窗口池[3]不能;2)SPP使用多级而滑动窗口池只使用单个窗口大小。多层池对物体变形具有很强的鲁棒性[15];3)由于输入尺度的灵活性,在可变尺度下提取的SPPcan池特征。实验表明,这些因素都提高了深层网络的识别精度。
网络结构
卷积层和特征图
特征提取这一步就是和R-CNN最大的区别了,同样是用卷积神经网络进行特征提取,但是SPP-Net用的是金字塔池化。这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度是大大地快啊。江湖传说可一个提高100倍的速度,因为R-CNN就相当于遍历一个CNN两千次,而SPP-Net只需要遍历1次
空间金字塔池层
可以不考虑图像的大小就能生成固定长度的特征表示(fixed-length representation)
special pyramid pooling layer :特殊金字塔池层
如上图所示,当我们输入一张图片的时候,我们利用不同大小的刻度,对一张图片进行了划分。上面示意图中,利用了三种不同大小的刻度(4*4,2*2,1*1),对一张输入的图片进行了划分,最后总共可以得到16+4+1=21个块,我们即将从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。
第一张图片,我们把一张完整的图片,分成了16个块,也就是每个块的大小就是(w/4,h/4);
第二张图片,划分了4个块,每个块的大小就是(w/2,h/2);
第三张图片,把一整张图片作为了一个块,也就是块的大小为(w,h)。
空间金字塔最大池化的过程,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出神经元。最后把一张任意大小的图片转换成了一个固定大小的21维特征(当然你可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小)。上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:windows size了。如果你希望,金字塔的某一层输出n*n个特征,那么你就要用windows size大小为:(w/n,h/n)进行池化了。
训练网络
Spp-Net的训练过程分为两部
单一尺度训练——single-size
所谓单一尺寸训练指的是先只对一种固定输入图像进行训练,比如224 x 224,在conv5之后的特征图为:13x13这就是我们的(a x a)而我要得到的输出为4 x 4,2 x 2,1 x 1,怎么办呢?这里金字塔层bins即为 n x n,也就是4 x 4,2 x 2,1 x 1,我们要做的就是如何根据a和n设计一个池化层,使得a x a的输入能够得到n x n的输出。实际上这个池化层很好设计,我们称这个大小和步幅会变化的池化层为sliding window pooling。
它的大小为:windows_size=[a/n] 向上取整 , stride_size=[a/n]向下取整。数据实验如下:
当a x a为13 x 13时,要得到4 x 4的输出,池化层的大小为4,移动步幅为3;
当a x a为13 x 13时,要得到2 x 2的输出,池化层的大小为7,移动步幅为6;
当a x a为13 x 13时,要得到1 x 1的输出,池化层的大小为13,移动步幅为13;
有的小伙伴一定发现,那如果我的输入a x a变化为10 x 10呢,此时再用上面的三个池化核好像得不到固定的理想输出啊,事实上的确如此,这是训练的第二个过程要讲的,因为此过程称之为“单一尺度训练”,针对的就是某一个固定的输入尺度而言的。
多尺寸训练——multi-size(以两种尺度为例)
虽然带有SPP(空间金字塔)的网络可以应用于任意尺寸,为了解决不同图像尺寸的训练问题,我们往往还是会考虑一些预设好的尺寸,而不是一些尺寸种类太多,毫无章法的输入尺寸。现在考虑这两个尺寸:180×180,224×224,此处只考虑这两个。
我们使用缩放而不是裁剪,将前述的224的区域图像变成180大小。这样,不同尺度的区域仅仅是分辨率上的不同,而不是内容和布局上的不同。
那么对于接受180输入的网络,我们实现另一个固定尺寸的网络。在论文中,conv5输出的特征图尺寸是axa=10×10。我们仍然使用windows_size=[a/n] 向上取整 , stride_size=[a/n]向下取整,实现每个金字塔池化层。这个180网络的空间金字塔层的输出的大小就和224网络的一样了。
当a x a为10 x 10时,要得到4 x 4的输出,池化层的大小为3,移动步幅为2(注意:此处根据这样的一个池化层,10 x 10的输入好像并得不到4 x 4的输出,9 x 9或者是11 x 11的倒可以得到4 x 4的)这个地方我也还不是特别清楚这个点,后面我会说出我的个人理解。
当a x a为10 x 10时,要得到2 x 2的输出,池化层的大小为5,移动步幅为5;
当a x a为10 x 10时,要得到1 x 1的输出,池化层的大小为10,移动步幅为10;
这样,这个180网络就和224网络拥有一样的参数了。换句话说,训练过程中,我们通过使用共享参数的两个固定尺寸的网络实现了不同输入尺寸的SPP-net。
为了降低从一个网络(比如224)向另一个网络(比如180)切换的开销,我们在每个网络上训练一个完整的epoch,然后在下一个完成的epoch再切换到另一个网络(权重保留)。依此往复。实验中我们发现多尺寸训练的收敛速度和单尺寸差不多。
多尺寸训练的主要目的是在保证已经充分利用现在被较好优化的固定尺寸网络实现的同时,模拟不同的输入尺寸。除了上述两个尺度的实现,我们也在每个epoch中测试了不同的s x s输入,s是从180到224之间均匀选取的。后面将在实验部分报告这些测试的结果。
注意,上面的单尺寸或多尺寸解析度只用于训练。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。
为什么全连接层要固定输入
卷积层:通过前向和后向传播修正w的值
全连接层:参数维度固定,所以输入需要固定
for example:输入500*800,全连接800*1,输出500*1,500个分类,全连接里面的800这个维度固定。vgg最后是4096*1,所以前一层输出必定是4096个参数维度,否则会出错
为何含有全连接层的网络,需要固定输入图片大小?_为什么全连接层固定输入_ukuu的博客-CSDN博客
代码(ResNet+SPPnet)
import torch
from torch import nn
from torchvision import models
import torch.nn.functional as F
import os, math
from torch.nn.modules.pooling import AdaptiveAvgPool2d, AdaptiveMaxPool2d
class ResNet(nn.Module):
def __init__(self, layers=18, num_class=2, pretrained=True):
super(ResNet, self).__init__()
if layers == 18:
self.resnet = models.resnet18(pretrained=pretrained)
elif layers == 34:
self.resnet = models.resnet34(pretrained=pretrained)
elif layers == 50:
self.resnet = models.resnet50(pretrained=pretrained)
elif layers == 101:
self.resnet = models.resnet101(pretrained=pretrained)
elif layers == 152:
self.resnet = models.resnet152(pretrained=pretrained)
else:
raise ValueError('layers should be 18, 34, 50, 101.')
self.num_class = num_class
if layers in [18, 34]:
self.fc = nn.Linear(512, num_class)
if layers in [50, 101, 152]:
self.fc = nn.Linear(512 * 4, num_class)
def conv_base(self, x):
x = self.resnet.conv1(x)
x = self.resnet.bn1(x)
x = self.resnet.relu(x)
x = self.resnet.maxpool(x)
layer1 = self.resnet.layer1(x)
layer2 = self.resnet.layer2(layer1)
layer3 = self.resnet.layer3(layer2)
layer4 = self.resnet.layer4(layer3)
return layer1, layer2, layer3, layer4
def forward(self, x):
layer1, layer2, layer3, layer4 = self.conv_base(x)
x = self.resnet.avgpool(layer4)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
class SPPNet(nn.Module):
def __init__(self, backbone=101, num_class=2, pool_size=(1, 2, 6), pretrained=True):
# Only resnet is supported in this version
super(SPPNet, self).__init__()
if backbone in [18, 34, 50, 101, 152]:
self.resnet = ResNet(backbone, num_class, pretrained)
else:
raise ValueError('Resnet{} is not supported yet.'.format(backbone))
if backbone in [18, 34]:
self.c = 512
if backbone in [50, 101, 152]:
self.c = 2048
self.spp = SpatialPyramidPool2D(out_side=pool_size)
num_features = self.c * (pool_size[0] ** 2 + pool_size[1] ** 2 + pool_size[2] ** 2)
self.classifier = nn.Linear(num_features, num_class)
def forward(self, x):
_, _, _, x = self.resnet.conv_base(x)
x = self.spp(x)
x = self.classifier(x)
return x
class SpatialPyramidPool2D(nn.Module):
"""
Args:
out_side (tuple): Length of side in the pooling results of each pyramid layer.
Inputs:
- `input`: the input Tensor to invert ([batch, channel, width, height])
"""
def __init__(self, out_side):
super(SpatialPyramidPool2D, self).__init__()
self.out_side = out_side
def forward(self, x):
# batch_size, c, h, w = x.size()
out = None
for n in self.out_side:
# w_r, h_r = map(lambda s: math.ceil(s / n), x.size()[2:]) # Receptive Field Size
# s_w, s_h = map(lambda s: math.floor(s / n), x.size()[2:]) # Stride
# max_pool = nn.MaxPool2d(kernel_size=(w_r, h_r), stride=(s_w, s_h))
max_pool = AdaptiveMaxPool2d(output_size=(n, n))
y = max_pool(x)
if out is None:
out = y.view(y.size()[0], -1)
else:
out = torch.cat((out, y.view(y.size()[0], -1)), 1)
return out
RPN
深度学习之 RPN(RegionProposal Network)- 区域候选网络_奔跑的大西吉的博客-CSDN博客
RPN的本质是 “ 基于滑窗的无类别obejct检测器 ”。
对于提取候选框最常用的 SelectiveSearch 方法,提取一副图像大概需要2s的时间,改进的 EdgeBoxes 算法将效率提高到了0.2s,但是这还不够。候选框提取不一定要在原图上做,特征图上同样可以,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network, 区域候选网络),完美解决了这个问题,它的主要功能是生成区域候选(Region Proposal)(可以看做是许多潜在的边界框,也叫 anchor,它是包含4个坐标的矩形框),如上所示。
RPN简单来说就是:假设输入一张图片,经过前面骨干网络的一系列的卷积或者池化之后之后,得到一个尺寸 m ∗ n m*nm∗n 的特征图(暂且不说通道),对应将原图划分为 m ∗ n m*nm∗n 个区域,原图的每个区域的中心由这个特征图上的一个像素点坐标表示。通过anchor机制,可以在每个像素点对应原图的区域生成k个可能存在目标的候选框(称为anchor box),如上图所示(k=9)。RPN就是用来判断每个像素点对应的k个区域是不是包含目标,如果包含(那么先根据输出的坐标偏置修正box位置)则输给后面的RCNN做进一步判断。(意思就是要从mn9个候选框中做筛选,提取proposals)
RPN 的结构如下图所示,backbone 输出的特征图经过一个 3 ∗ 3 3 * 33∗3 卷积之后分别进入了不同的分支,对应不同的 1 ∗ 1 1 * 11∗1 卷积。第一个卷积为定位层,输出 anchor 的4个坐标偏移。第二个卷积为分类层,输出anchor的前后景概率。
VGG
经典卷积神经网络-VGG原理_vgg卷积神经网络_胖虎记录学习的博客-CSDN博客
VGG网络结构图:
卷积层全部为3*3的卷积核,用conv3-xxx来表示,xxx表示通道数。论文作者一共实验了6种网络结构,其中VGG16和VGG19分类效果最好(16、19层隐藏层),证明了增加网络深度能在一定程度上影响最终的性能。 两者没有本质的区别,只是网络的深度不一样。
VGG的亮点:
1.小卷积核组。作者通过堆叠多个3*3的卷积核(少数使用1*1)来替代大的卷积核,以减少所需参数;
2.小池化核。相比较于AlexNet使用的3*3的卷积核,VGG全部为2*2的卷积核;
3.网络更深特征图更宽。卷积核专注于扩大通道数,池化专注于缩小高和宽,使得模型更深更宽的同时,计算量的增加不断放缓;
4.将卷积核替代全连接。作者在测试阶段将三个全连接层替换为三个卷积,使得测试得到的模型结构可以接收任意高度或宽度的输入。
5.多尺度。作者从多尺度训练可以提升性能受到启发,训练和测试时使用整张图片的不同尺度的图像,以提高模型的性能。
6.去掉了LRN层。作者发现深度网络中LRN(Local Response Normalization,局部响应归一化)层作用不明显。
VGG16网络结构详解
(1)维度
以VGG16进行网络结构介绍,其他组类型大同小异。整个模型结构可分为两大部分:提取特征网络结构与分类网络结构
卷积层默认kernel_size=3,padding=1;池化层默认size=2,strider=2。下面进行结构分析:
输入图像尺寸为224*224*3
经过2层的64*3*3卷积核,即卷积两次,再经过ReLU激活,输出尺寸大小为224*224*64
经最大池化层(maxpooling),图像尺寸减半,输出尺寸大小为112*112*64
经过2层的128*3*3卷积核,即卷积两次,再经过ReLU激活,输出尺寸大小为112*112*128
经最大池化层(maxpooling),图像尺寸减半,输出尺寸大小为56*56*128
经过3层的256*3*3卷积核,即卷积三次,再经过ReLU激活,输出尺寸大小为56*56*256
经最大池化层(maxpooling),图像尺寸减半,输出尺寸大小为28*28*256
经过3层的512*3*3卷积核,即卷积三次,再经过ReLU激活,输出尺寸大小为28*28*512
经最大池化层(maxpooling),图像尺寸减半,输出尺寸大小为14*14*512
经过3层的512*3*3卷积核,即卷积三次,再经过ReLU激活,输出尺寸大小为14*14*512
经最大池化层(maxpooling),图像尺寸减半,输出尺寸大小为7*7*512
然后将feature map展平,输出一维尺寸为7*7*512=25088
经过2层的1*1*4096全连接层,经过ReLU激活,输出尺寸为1*1*4096
经过1层的1*1*1000全连接层(1000由最终分类数量决定,当年比赛需要分1000类)输出尺寸为1*1*1000,最后通过softmax输出1000个预测结果
(2)权重参数(不考虑偏置)
输入层为214*224*3,没有参数为0,存储容量为224*224*3=150k
第一层卷积,输入层有3个channels,卷积核数量为64,所以参数为64*3*3*3=1728,存储容量为224*224*64=3.2m
第二层卷积,输入有64个channels,卷积核数量为64,所以参数为64*3*3*64=36864,存储容量为224*224*64=3.2m
第一层池化,输入为64个channels,高宽减半,所以参数为0,存储容量为112*112*64=800k
第三层卷积,输入有64个channels,卷积核数量为128,所以参数为64*3*3*128=73728,存储容量为112*112*128=1.6m
第四层卷积,输入有128个channels,卷积核数量为128,所以参数为128*3*3*128=147456,存储容量为112*112*128=1.6m
第二层池化,输入为128个channels,高宽减半,所以参数为0,存储容量为56*56*128=400k
第五层卷积,输入有128个channels,卷积核数量为256,所以参数为256*3*3*128=294912,存储容量为112*112*128=800k
第六层卷积,输入有256个channels,卷积核数量为256,所以参数为256*3*3*256=589824,存储容量为112*112*128=800k
。。。。。。
全连接层权重参数为:前一层节点数×本层的节点数
FC1(1×1×4096)参数:7×7×512×4096=102760448,存储容量为4096
FC2(1×1×4096)参数:4096×4096=16777216,存储容量为4096
FC3(1×1×1000)参数:4096×1000=4096000,存储容量为1000
VGG16具有如此之大的参数数目(主要集中在全连接层),可以预期它具有很高的拟合能力;但同时缺点也很明显:即训练时间过长,调参难度大;需要的存储容量大,不利于部署。
FAST RCNN
RCNN、Fast-RCNN、Faster-RCNN网络详解-CSDN博客
Faster RCNN
Faster RCNN 超详细入门 01-准备篇-RCNN,SPPnet,Fast RCNN,RoI Pooling_湘粤Ian的博客-CSDN博客
Faster RCNN超详细入门 02 网络细节与训练方法_faster rcnn训练_湘粤Ian的博客-CSDN博客
RPN + FAST RCNN
YOLO-V1
YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点_湘粤Ian的博客-CSDN博客
网络结构是由GoogLeNet所启发,取代了GoogLeNet使用的inception
- YOLO将输入的图片resize成448 x 448,并且为 S x S(S = 7)个grid,如果物体的中心落入该grid中,那么该grid就需要负责检测该物体。
- 一次性输出所检测到的目标信息,包括类别和位置。
-
对于每一个网格(grid),都会预测出B个bounding boxes(B=2),这个bounding boxes有5个量,分别是物体的中心位置(x,y)和它的高(h)和宽(w),以及这次预测的置信度(confidence score)。
-
每个框还要负责预测这个框中的物体是什么类别的,共预测C个类。
-
综上,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C)。(S x S个网格,每个网格都有B个预测框,每个框又有5个参数,再加上每个网格都有C个预测类)
YOLO-V2
YOLO 超详细入门02 v2 (含代码及原文)_yolov2原文_湘粤Ian的博客-CSDN博客
YOLOv2 采用Darknet-19 作为特征提取网络,包括19个卷积层, 5个 maxpooling 层。
-
原型设计与 VGG16 一致,主要采用3x3卷积, 2x2 maxpooling层 (feature map维度降低两倍, channles增加两倍)。
-
与NIN (Network in Network) 类似,Darknet-19最终采用global avgpooling做预测。
-
在3x3卷积层之间使用1x1卷积层来压缩 feature map channles 以降低模型计算量和参数 (parameters)。
-
每个卷积层后面同样使用了 batch normalization 层以加快收敛速度,降低模型over-fitting。