YOLO的网络结构(一)
其网络结构能分为三部分。
第一部分:图片的输入
第二部分:基础网络。作者原文使用的是 Darkjnet-53 without FC layer。
第三部分:yolo v3的三个分支。y1(13x13x255),y2(26x26x255),y3(52x52x255)。
Y1从上面结点获取。是最高层的,最抽象的特征。适合比较大的目标检测;
Y2是在Y1的基础上做一个上采样+一个低层的一个特征进行连接(concat)。
适合中等的目标检测;
Y3是在Y2的基础上做一个上采样+一个更低层的一个特征进行连接(concat)。适合小 目标的检测。
三个尺度的输出皆是奇数,使得网格会有个中心位置。
通道数255:{[80(coco数据集共有80类)+[X+Y+W+H+Confiderce]}×3(anchor) = 255
CBL为卷积块:由conv2d,Batch Normalization,Leaky relu 这三个网络层组成。
Res为残差块:包含两个卷积块和一个add层,add层只是将相同维度的张量进行相加。
ResX为多个残差块,X代表残差块的个数。
上采样;将特征图的宽和高变成原来的两倍,通道数不变。
Concat张量拼接:相同宽和高的通道数相加。
__
参考:https://www.bilibili.com/video/BV1Z5411t7Yc?from=search&seid=13190302703205781476
https://blog.csdn.net/weixin_46269983/article/details/107637613?biz_id=102&utm_term=%E5%A6%82%E6%9E%9C%E7%90%86%E8%A7%A3yolov3%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-107637613&spm=1018.2118.3001.4449
知识点:
卷积层
工作原理:我们是使用卷积核来提取特征的,卷积核可以说是一个矩阵。
而卷积的任务就如下图所示:
从左上角开始,卷积核就对应着数据的3*3的矩阵范围,然后相乘再相加得出一个值。按照这种顺序,每隔一个像素就操作一次,我们就可以得出9个值。这九个值形成的矩阵被我们称作**映射(Activation map)。这就是我们的卷积层工作原理。
重要参数:
1、步长。步长就是控制卷积核移动的距离。在上面的例子看到,卷积核都是隔着一个像素进行映射的,那么我们也可以让它隔着两个、三个,而这个距离被我们称作步长。
2、padding。padding就是我们对数据做的操作。一般有两种,一种是不进行操作,一种是补0使得卷积后的**映射尺寸不变。上面我们可以看到5×5×3的数据被3×3的卷积核卷积后的映射图,形状为3*3,即形状与一开始的数据不同。有时候为了规避这个变化,我们使用“补0”的方法——即在数据的外层补上0。
池化层
池化层的首要作用是下采样;还有降维、去除冗余信息、对特征进行压缩、简化网络复杂度、减小计算量、减小内存消耗等等,即减少参数量;可以实现不变性,其中不变形性包括,平移不变性、旋转不变性和尺度不变性。还能防止过拟合,提高模型泛化能力。
有最大池化和平均池化,池化层一般放在卷积层后面。所以池化层池化的是卷积层的输出。
其扫描的顺序跟卷积一样,都是从左上角开始然后根据你设置的步长逐步扫描全局。选择最大池化,是为了提取最明显的特征。而平均池化是顾及每个像素,即将所有的像素值相加然后再平均。
池化层也有padding的选项,同卷积一样。
全连接层
全连接层在整个神经网络中起到“分类器”的作用。如果说卷积层、池化层和**函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到标记空间的作用。在实际使用中,全连接层可由卷积操作实现:对前层是全连接层可以转化为卷积核1X1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的宽和高。
另外:CNN网络中前几层的卷积层参数量占比小,计算量占比大;而后面的全连接层正好相反,大部分CNN网络都具有这个特点。因此我们在进行计算加速优化时,重点放在卷积层;进行参数优化、权值裁剪时,重点放在全连接层。