神经网络入门概念和框架理解(YOLOv1v2v3改进分析)

神经网络的入门知识

应用需求:

​   可以逼近任意连续函数能力

主要内容:
  1.激励函数

​     对上一层所有输入信息产生输出信息对变换关系

​     常见的激活函数 sigmoid Relu tansh softsign ELU 等

  2.损失函数

​     定义指标表示一个模型是坏的,这个指标成为成本(cost)或者损失(loss)

  3.常见的损失函数

    交叉嫡——用在分类问题上,衡量我们的预测用于描述真相的低效性

  ​  平方损失函数——用在具体数值的预测

  ​  均方误差函数——各个训练点到最优拟合线的距离最小(平方和最小)

典型方法举例——梯度下降法

​ ​  想要一个网络能够拟合任意的连续函数,就需要损失函数越来越小,所以需要约定一个方向使得每次训练完一批次的样本数据得到预测结果和目标结果的差异越来越小,而这个差异越来越小的方向就是我们需要的梯度下降

工作方式

​ ​  第一阶段:神经网络输入样本数据经过前向传递到达输出层得到预测结果

​ ​  第二阶段:使用不同计算方式(不同的损失函数)计算样本预测结果和样本目标结果的差异并以此作为调整权重偏执的依据,然后传至上层网络

热门深度学习框架:

一、TensorFlow(google)
​  优势

​ ​  TensorFlow有很直观的计算图可视化呈现,模型能够快速的部署在各种硬件机器上,从高性能的计算机到移动设备,再到更小的更轻量的智能终端

​ ​  TensorFlow提供全面的服务,无论是Python,C++,JAVA,Go,甚至是JavaScript,Julia,C#,几乎所有开发者都可以从熟悉的语言入手开始深度学习的旅程。

​  劣势

​ ​  相比Pytorch,Caffe等框架,TensorFlow的计算速度可以说是“牛拉车“。而且通过它构建一个深度学习框架需要更复杂的代码,还要忍受重复的多次构建静态图。

二、Pytorch(facebook)
​  优势

​ ​  Pytorch库足够简单,跟NumPy,SciPy等可以无缝连接,而且基于tensor的GPU加速非常给力

​ ​  训练网络迭代的核心-梯度的计算,Autograd架构(借鉴于Chainer),基于Pytorch,我们可以动态地设计网络,而无需笨拙地定义静态网络图,才能去进行计算,想要对网络有任务修改,都要从头开始构建静态图。

​  劣势

​ ​  模型部署较为困难

三、百度飞桨

热门目标检测框架:

一、YOLO
  核心思想

​   把模型的输出划分成网格形状,每个网格中的cell都可以输出物体的类别和边界框,坐标等,可包含8个维度;

​   物体落在那个cell,那个cell就负责预测这个物体;

​   1.训练阶段:如果物体中心落在这个cell,那么就给这个cell打上这个物体的label(包括xywh和类别)。也就是说我们是通过这种方式来设置训练的label的。换言之,我们在训练阶段,就教会cell要预测图像中的哪个物体

​   2.测试阶段:如果你在训练阶段教会了cell去预测中心落在该cell中的物体,那么cell自然也会这么做。

  模型架构
  YOLO v1

​   输出:输出的channel数目为30。一个cell内,前20个元素是类别概率值,然后2个元素是边界框confidence,最后8个元素是边界框的 (x, y,w,h) 。

​    Confidence预测:confidence表示cell预测的bounding box包含一个物体的置信度有多高并且该bounding box预测准确度有多大。

​   Bounding box预测:bounding box的预测包括xywh四个值。xy表示bounding box的中心相对于cell左上角坐标偏移,宽高则是相对于整张图片的宽高进行归一化的。

​    类别预测

​   1.对于训练阶段,也就是打label阶段,怎么打label呢?对于一个cell,如果物体的中心落在了这个cell,那么我们给它打上这个物体的类别label,并设置概率为1。

​   2.对于测试阶段来说,网络直接输出Pr(class i/object) ,就已经可以代表有物体存在的条件下类别概率。但是在测试阶段,作者还把这个概率乘上了confidence

​    既然我们一个cell只能预测一个目标,为什么还要预测两个bounding box(或者更多)?

​   这个还是要从训练阶段怎么给两个predictor安排训练目标来说。在训练的时候会在线地计算每个predictor预测的bounding box和ground truth的IOU,计算出来的IOU大的那个predictor,就会负责预测这个物体,另外一个则不预测。

​    训练阶段的loss

  ​ 1.有物体中心落入的cell,需要计算分类loss,两个predictor都要计算confidence loss,预测的bounding box与ground truth IOU比较大的那个predictor需要计算xywh loss。

​    2.特别注意:没有物体中心落入的cell,只需要计算confidence loss

  YOLO v2

​   骨架网络设计

​    1.网络抛弃了全连接,采用全卷积FCN的架构,因此可以输入任意大小的图片。

​    2.在每个卷积层之后都使用了BN。BN的作用是为了是网络更容易收敛,除此之外还有正则化的作用,可以防止过拟合。

​    3.使用了跨层连接,这个借鉴了ResNet的identity mapping思想。跨层连接的一个大好处是使梯度更容易前传,也就是说可以让网络训练变得更容易。但是,这个跨层连接有点别致,一般的跨层连接,会通过求和或者通道连接进行特征融合,但是yolov2在融合之前还添加了一个reorganization的操作。

  经过这样的操作,实际上已经把feature map的排布重整了,直觉上觉得这么做不太好,但事实证明它是可行的。不过这么做的一个好处就是将所有的信息都传递到后面的层,并没有因为下采样等操作导致损失信息,因此获得了更多细粒度的特征。

​   reorganization层:就是将大分辨率的feature map进行重新排布得到分辨率更小的feature map,相应的通道数增加。举例来说,如果网络的输入维度是3x416x416,那么conv13_512的维度则是512x26x26,将其进行重新排布之后则变成2048x13x13。

​    网络输出

​   假设网络图片的输入大小是[416,416],那么经过骨架网络(或者说特征提取网络)之后,由于存在步长为32的分辨率降低,这样网络的输出是[13,13,1024]。

  要将其转化为预测,使用一个1x1的卷积将通道数压缩到1024→(num_anchor x (4+1+num_class),如下图所示)这个维度就可以了,这里的num_anchor表示feature map上每个点对应的anchor数目,4表示xywh,1表示confidence,num_class表示预测的类别数,注意这里的类别数是不包括背景的。

​    网络预测 ——Anchor的预测

​   yolo v1中是没有使用到anchor的,这使得每个网格中的每个cell只能预测一个物体。因此yolo v2借鉴了faster RCNN中anchor的思想,这样实际上使得grid的每个cell可以预测多个尺度的不同物体。

  yolo v1中grid的大小是7x7,但是yolo v2的grid变成了13x13,grid中的每个cell都对应这5个不同尺寸的anchor

​   对于预测的bbox的中心、宽高、置信度、类别还需要经过一系列的转换才能使得网络预测具有实际的意义

​   以上得到的anchor的预测结果是很多的,因此需要进行后处理,即通过非极大值抑制(NMS)和confidence滤除不包含物体的预测,得到最终的预测结果。

​   网络训练

​   1.给Anchor打Label

​   选择一个长宽和这个bbox最匹配的anchor来负责预测这个物体,长宽最匹配是计算它们的IOU(“预测的边框” 和 “真实的边框” 的交集和并集的比值),值最大的其中一个anchor负责预测这个物体

​    2.损失函数

​    第一项:负责预测物体的anchor的xywh损失。如果anchor负责预测物体,那么需要计算坐标的L2(最小平方误差)损失。

​    第二项:不负责预测物体的anchor的xywh损失。如果anchor不负责预测物体,那么需要在迭代的初期(比如iteration<12800)去计算坐标的L2损失。

​    第三项:负责预测物体的anchor的confidence损失。负责预测物体的anchor需要计算confidence损失,confidence的目标就是预测的bbox和真实bbox的iou。

​    第四项:不负责预测物体的anchor的confidece损失。对那些不负责预测gt的anchor,需要计算每个anchor和所有gt box的IOU。

​   第五项:负责预测物体的anchor的类别损失。每个类别的输出概率0-1之间,计算的是L2损失。也就是说分类问题也把它当做了回归问题。另外需要注意的是,类别预测中是不需要预测背景的,因为confidence实际上就已经代表是否存在物体,类别就没必要去预测背景。

​    3.多尺度训练

​   因为骨架网络是一个全卷积的网络,因此可以输入任意大小的图片,这个时候网络输出的grid大小就不是固定的,如果是416x416的图片输入,那么网络的输出的grid是13x13大小的,但图片大小变化的时候,那么grid大小也会相应的变化,这时候,anchor的数量也会相应的发生变化。

  YOLO V3

​   改进之处

​   1.多尺度预测 (类FPN)

​   尺度1:对于 13 ∗ 13 13*13 1313的特征图,有 13 ∗ 13 ∗ 3 13*13*3 13133

  尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个 16x16 大小的特征图相加,再次通过多个卷积后输出 box 信息,相比尺度1变大两倍. 26 ∗ 26 ∗ 3 26*26*3 26263

  尺度3: 与尺度2类似,使用了 32x32 大小的特征图

  YOLO V3的精简版tiny-darknet采用的 bounding box prior是6个

  2.backbone网络架构不同,YOLO V2采用的是darknet-19,而YOLO V3采用的是darknet-53

  (1)darknet-53中无池化层,全连接层,特征图的缩小是通过增加卷积核的步长实现的;一方面基本采用全卷积(YOLO v2中采用pooling层做feature map的sample,这里都换成卷积层来做了)

  darknet-53中 CNN Kernel+BN+LeakyRelu 成为了标准组件;

  darknet-53中采用了残差的设计思想;

  3.分类器-类别预测

  将原来的单标签分类改进为多标签分类(softmax->logistic)

二、与RCNN的不同

  YOLO没有显示求取region proposal的过程。Faster R-CNN中尽管RPN与fast rcnn共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和fast rcnn网络.相对于R-CNN系列的"看两眼"(候选框提取与分类),YOLO只需要Look Once.

  YOLO统一为一个回归问题

  R-CNN将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)

三、Mask RCNN

​   模型结构:ResNet-FPN+Fast RCNN+mask

  骨干网络ResNet-FPN,用于特征提取,另外,ResNet还可以是:ResNet-50,ResNet-101,ResNeXt-50,ResNeXt-101;

  头部网络,包括边界框识别(分类和回归)+mask预测

  ROI Align

  Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。

  Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值