每月笔记之2019年7月

1、siamese
其实讲了这么多,主要思想就是三点:
1)输入不再是单个样本,而是一对样本,不再给单个的样本确切的标签,而且给定一对样本是否来自同一个类的标签,是就是0,不是就是1
2)设计了两个一模一样的网络,网络共享权值W,对输出进行了距离度量,可以说l1、l2等。
3)针对输入的样本对是否来自同一个类别设计了损失函数,损失函数形式有点类似交叉熵损失:

2、孪生神经网络和伪孪生神经网络分别适用于什么场景呢
先上结论:孪生神经网络用于处理两个输入"比较类似"的情况。伪孪生神经网络适用于处理两个输入"有一定差别"的情况。比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合;如果验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字),就应该使用pseudo-siamese network。也就是说,要根据具体的应用,判断应该使用哪一种结构,哪一种Loss。

3、SiamMask
对视觉目标跟踪(VOT)和视频目标分割(VOS)的统一框架SiamMask。我们将初始化简化为视频跟踪的box输入即可,同时得到box和mask两个输出。

4、关于Siamese Tracking 的未来研究方向(free ideas):
当你阅读了一定的文章以及有现成的代码之后,下面当然是如何着手改进。我自己总结了一些小的可以改进的方向,仅供参考。
1)高效的在线学习算法:进展到目前为止,我的所有实验研究表明。Siamese网络无法真正意义上抑制背景中的困难样本。离线的学习从本质上无法区分两个长相相似的人或者车。而CF相关算法可以通过分析整个环境的上下文关系来进行调整。如果对于提升整个算法的上界(偏学术)的角度考虑,在线学习有必要。如果正常的工程使用,我认为目前的算法只要在相应的场景中进行训练就足够了。
2)精确输出表达:今年我们的工作提出额外的mask输出。可直接扩展的思路为关键点输出(CornerNet / PoseTrack),极点预测(ExtremeNet),甚至6D pose跟踪。本质上是通过网络可以预测任何与目标相关的输出。大家可以任意的发散思维。
3)定制网络架构:其中包含两个子方向,一个是追求精度的去探索究竟什么样的网络架构会有利于当前的跟踪框架的学习。另一个有价值的子方向是如何构建超快速的小网络用于实际工程。工程项目中有时并没有GPU的资源供使用,如何提供“廉价”的高质量跟踪算法也具有很强的实际意义。当对网络进行裁剪之后,很容易达到500FPS的高性能算法来对传统的KCF进行真正的替换。
4)离线训练学习优化:目前的跟踪算法在相似性学习方向还是过于简单,如果去设计更为有效的度量学习方案,应该会有一定的提升。同时我们也并没有很好的掌握网络的训练。当前的训练策略是将网络主干的参数进行固定,先训练head。然后逐步放开。实际上我们发现,当直接将所有层全部放开一起训练的时候,网络的泛化性能会显著下降。另一个方面,train from scratch的概念已经在检测领域非常普遍了。跟踪的网络目前我们的经验在跟踪方面并不work。
5)更细粒度预测:这一条实际上是上一条的续集,就是专注于score分支的预测。现在大家的做法是>0.6 IoU的都当做前景(正样本),但实际上正样本之间还是有较大的差异的。跟踪本质上也是不断预测一个非常细小物体帧间运动的过程,如果一个网络不能很好的分辨细小的差异,他可能并不是一个最优的设计选择。这也是ATOM的IoUNet主攻的方向。
6)泛化性能提升:非常推荐自动化所黄凯奇老师组的GOT-10k数据集,数据组织的非常棒。黄老师组在one-shot learning领域有着深厚的积淀,所以站在这个领域的角度,他们提出了严格分离训练集和测试集的物体类别来验证泛化性能。所以原则上所有one-shot learning方向的一些嵌入学习方法都可以移过来用。同时,我觉得Mask-X-RCNN,segment everything这个思路可以借鉴。本质上我也不得不承认,基于深度学习的跟踪算法存在泛化性能问题。我们有理由怀疑跟踪是否会在未知的类别上有较好的泛化性能,实际上肯定是会下降。
7)long-term跟踪框架:截止到目前为止,虽然VOT组委会以及牛津这边的OxUVA都有专门的long-term的数据集,但long-term算法并没有一个较好的统一框架出来。关于这方面的研究似乎有点停滞,今年大连理工的文章非常可惜,我觉得质量非常不错。

5 在开始的时候,使用 MultiBox 中的 best jaccard overlap(也就是 IoU)来匹配每一个 ground truth box 与 default box,这样就能保证每一个 ground truth box 与唯一一个 default box 对应起来。但是又不同于 MultiBox,SSD 在进行这步之后又将 default box 与任意的 ground truth box 进行匹配,只要两者之间的 jaccard overlap 大于一个阈值即可,本文中的阈值取的是 0.5.像上面这样操作简化了学习问题,使网络可以预测多个重叠默认框的高分,而不是只挑选最大重叠的框。

6 deeplab hole algorithm( à trous algorithm 算法,)
最早用的就是 deeplab 的文章了,这篇文章和 fcn 不同的是,在最后产生 score map 时,不是进行 upsampling,而是采用了 hole algorithm,就是在 pool4 和 pool5 层,步长由2变成1,必然输出的 score map 变大了,但是 receptive field 也变小了,为了不降低 receptive field,怎么做呢?利用 hole algorithm,将卷积 weights 膨胀扩大,即原来卷积核是3x3,膨胀后,可能变成 7x7 了,这样receptive field变大了,而 score map 也很大,即输出变成dense的了。
  这么做的好处是,输出的 score map 变大了,即是 dense 的输出了,而且 receptive field 不会变小,而且可以变大。这对做分割、检测等工作非常重要。

7 CNN 中的特征图以一种密集的方式表征空间特征,那么我们能直接使用特征图代替原图来检测目标吗?
由此产生了Fast R-CNN

8 Fast R-CNN 最重要的一点就是包含特征提取器、分类器和边界框回归器在内的整个网络能通过多任务损失函数进行端到端的训练,这种多任务损失即结合了分类损失和定位损失的方法,大大提升了模型准确度。(注:没有包含RPN网络 区域产生用的Selective Search,选择性搜索)

9 然后,我们对这些锚点随机采样,构成大小为 256 的 mini batch——维持前景锚点和背景锚点之间的平衡比例。
RPN 用所有以 mini batch 筛选出来的锚点和二进制交叉熵(binary cross entropy)来计算分类损失。然后它只用那些标记为前景的 mini batch 锚点来计算回归损失。为了计算回归的目标,我们使用前景锚点和最接近的真实目标,并计算将锚点转化为目标所需的正确 Δ。

10 Python无门槛,C++难度系数高。Python入门很快,基础的知识及相关的库 如numpy,panda和matplotlib掌握就行。Python进阶不是特别难,你看一下《流畅的Python》书籍和一些tricks就行。至于C++,这玩意没个好几年沉淀,千万别说自己掌握或者精通。C++也是体现写代码有多刚的方面,CUDA加速等。

11 建议尽快入门CV基础知识(CS231n这个课程还可以),网易云课堂上有吴恩达免费中文翻译版 实习僧APP

12 RPN是一个 卷积层(256维) + relu + 左右两个层的(clc layer 和 reg layer)的小网络
应用在滑动窗口区域上的 , 所有的滑动窗口共享这个 RPN

13 RPN是一个将 n x n x channels的 输入 通过256个 n x n 大小的卷积核 生成 1 * 1 * 256的feature map,即最后是256维的特征(假设前面得到的特征图是w x h x channels,那么n x n x channels的输入是在这个w x h x channels的特征图上的用滑动窗口框出的区域, 这个滑动窗口就是卷积核, 比如3x3的卷积核, stride=1)
它的输入就是滑动窗口 nxn 对应的特征图区域,经过它卷积后 特征图变成1 x 1了

14 全连接只是卷积操作的一种特殊情况(当卷积核的大小与图片大小相同的时候,其实所谓的卷积就是全连接了)

15 深度学习中的卷积与互相关
在深度学习中,卷积中的过滤器不经过反转。严格来说,这是互相关。我们本质上是执行逐元素乘法和加法。但在深度学习中,直接将其称之为卷积更加方便。这没什么问题,因为过滤器的权重是在训练阶段学习到的。如果上面例子中的反转函数 g 是正确的函数,那么经过训练后,学习得到的过滤器看起来就会像是反转后的函数 g。因此,在训练之前,没必要像在真正的卷积中那样首先反转过滤器。

16 通过将每个边界框检测器分配到图像中的特定位置,one-stage目标检测算法(例如YOLO,SSD和DetectNet)都是这样来解决这个问题。因为,检测器学会专注于某些位置的物体。为了获得更好的效果,我们还可以让检测器专注于物体的形状和大小。

17 NMS保留拥有最高的 置信度 的预测框,并删除任何与之重叠超过一定阈值的预测框(例如60%)。通常我们只保留10个左右的最佳预测并丢弃其他预测。理想情况下,我们希望图像中的每个物体只有一个边界框。

18 SSD不使用k-means来确定先验框。相反,它使用数学公式来计算先验框尺寸,因此SSD的先验框与数据集无关(SSD称它们为“default boxes”)。

19 尽管每个网格单元中有5个检测器,但对于845个检测器来说,这个模型实际上只学习了总共5个检测器,而不是每个网格单元都学习5个唯一的检测器。这是因为卷积层的权重在每个位置都相同,因此在网格单元之间共享。但模型为每个先验框学习一个检测器,它们在图像上滑动,以获得845个预测值,网格上每个位置有5个。因此,尽管我们总共只有5个独特的检测器,但由于卷积的缘故,这些检测器与它们在图像中的位置无关,因此无论它们位于何处,都可以检测到物体。每个位置的输入像素与检测器所学习到的权重,决定了该位置的最终边界框预测。(位置无关性 训练时某个位置是车 但测试时这个位置是人也能预测出来 因为每个网格位置都会预测所有的类别概率 卷积核在图像上滑动时一样的权重)

20 而YOLOv2(我们的示例模型)只有一个13×13的输出网格,而SSD有几个不同大小的网格。
YOLOv3更像SSD,因为它使用3个不同大小的网格预测边界框。

21 由于网络的输入是416×416大小的正方形图像,因此我们必须将训练图像放在该正方形中。下面是几种方法:
直接将图像resize到416×416,这可能会挤压图像;
将最小边调整为416,然后从图像中裁剪出416×416区域;
将最大边调整为416,用零填充另外的短边;

22 数据扩增也会有副作用。通过随机截取图像,然后将大小调整为416×416,这也会扰乱高宽比(更像故意的)。
总结来看,直接对原始图像进行resize,而忽略边界框的高宽比,这是最简单有效的。这也是Yolo和SSD所采用的方式,这种方式可以看成让模型学会自适应高宽比。如果我们在处理固定大小的输入图像,例如1280×720,那么使用裁剪可能更合适。

23 对于目标检测模型,你需要评估以下几个部分:
每个检测物体的分类准确度;预测框与真实框的重合度(IOU)模型是否找到图片中的所有物体(召回,recall)。
仅采用任何一个指标是不够的。比如,如果设定IOU的阈值为50%,当一个预测框与一个真实框的IOU值大于该阈值时,被判定为真阳(TP),反之被判定为假阳(FP)。但是这并不足以评估模型的好坏,因为我们无法知道模型是否漏检了一些物体,比如存在某些模型没有预测出的真实框(假阴,FN)。
为了将以上几种不同因素转化为一个单一指标,通常我们计算mAP(mean average precision)。mAP值越高,模型越好。计算mAP的方法随数据集略有差异。

24 batch normalization的算法过程如下:
 求当前batch的数据的均值u和方差sigma
 将当前的所有数据减去均值u
 将当前的所有数据除以方差的平方根sqrt(sigma)
 将经过前三步之后得到的数据乘以gamma,再加上betta,这里的gamma和betta是可学习的参数
(注:如果取消了第四步,那相当于经过了bn层之后的数据都变成了正态分布,这样不利于网络去表达数据的差异性,会降低网络的性能,加上了第四步之后,网络会根据模型的特点自动地去调整数据的分布,更有利于模型的表达能力点。)
当batch_size较小的时候,bn算法的效果就会下降,这是因为在较小的batch_size中,bn层难以学习到正确的样本分布,导致gamma和betta参数学习的不好。为了解决这一问题,Facebook AI Research提出了Group Normalization。

25 group normalization的算法流程:
将当前层的数据在通道的维度上划分为多个group
求出每个group中的数据的均值和方差
将每个group中的数据减去它们相应的均值再除以方差的平方根
将经过前三步之后得到的数据乘以gamma,再加上betta

26 L2 Normalization算法的过程也比较简单:
求出当前层数据的平方
求出当前层数据的平方和
将第一步得到的数据除以第二步得到的数据
(注:)首先,经过L2 norm的数据都处于0到1之间。其次,经过L2 norm的数据之间的差异性会被放大。这两个特点能够在某些情况下发挥重要的作用,而在实际应用中,往往就是这样的小trick的累积最终形成了质变。

27 L2 norm在深度学习中的应用,比较著名的有SSD目标检测器。作者在SSD中的conv4_3层后面加上了L2 norm,他的理由是该层的数据尺度与其他层不同,所以需要加上一个norm操作

28 训练模型时遇到不合理的现象时,可以按照下面的步骤去排查:
检查数据和标签,这是刚开始调试模型时最可能出错的方向。
检查训练参数和模型参数的设置,看看是否有不合理的地方
检查网络框架中的具体操作的使用是否有错误。
检查不同的细节操作对网络的输出的影响。

29 bn和l2都有强化了特征的差异性,区别在于l2的输出是在0到1之间,而bn不是。建议根据label的范围来选择l2还是bn,一般只有跟输出层最近的那个层需要加

30 Depthwise Separable Convolution是将一个完整的卷积运算分解为两步进行,即Depthwise Convolution与Pointwise Convolution。(深度可分离卷积)

31 为什么SiameseFC 需要no_padding 而检测网络不需要 ????
为什么你所说的问题在检测和语义分割中并不存在? 因为对于物体检测和语义分割而言,训练过程中,物体本身就是在全图的每个位置较为均匀的分布。我们可以很容易的验证,如果在物体检测网络只训练标注在图像中心的样本,而边缘的样本都不进行训练,那么显然,这样训练的网络只会对图像的中心位置产生高响应,边缘位置就随缘了,不难想象这种时候边缘位置的性能显然会大幅衰减。而更为致命的是,按照SiamFC的训练方式,中心位置为正样本,边缘位置为负样本。那么网络只会记录下边缘永远为负,不管表观是什么样子了。这完全背离了我们训练的初衷。

32 我也使用 SiamMask 做了一个类似的项目,当然精度上和 Adobe 的 FastMask 肯定存在差距。但我们的方法可以很容易的生成一些表情包或者 b 站的智能防挡弹幕。

33 SiamMask中mask预测是x的从图像到分割和z中的目标对象的函数。以这种方式,z可以用作参考指导分割过程,使得任意类的目标可以被跟踪。这清楚地意味着,给定不同的搜索图像z,网络将为x产生不同的分割mask。

34 opencv resize函数
如果要缩小图像,通常推荐使用INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。
默认参数为:INTER_LINEAR

35 Learning to Refine Object Segments
本文主要提出一种自上而下的refinement方法来增强前馈网络以更好分割的方法。该方法与DeepMask网络结合,取得了优秀的实验结果,取名为SharpMask方法。

36 RoI Align的主要创新点是,针对问题1,不再进行取整操作。针对问题2,使用双线性插值来更精确地找到每个块对应的特征。总的来说,RoI Align的作用主要就是剔除了RoI Pooling的取整操作,并且使得为每个RoI取得的特征能够更好地对齐原图上的RoI区域。

37 Resnet和FPN结合??

38 语义分割只能判断类别,无法区分个体。

Instance Segmentation实例分割方式有点类似于物体检测,不过物体检测一般输出的是 bounding box,实例分割输出的是一个mask。
实例分割和上面的语义分割也不同,它不需要对每个像素进行标记,它只需要找到感兴趣物体的边缘轮廓就行,比如下图中的人就是感兴趣的物体。该图的分割方法采用了一种称为Mask R-CNN的方法。我们可以看到每个人都是不同的颜色的轮廓,因此我们可以区分出单个个体。

Panoptic Segmentation(全景分割)是语义分割和实例分割的结合。如下图所示,每个像素都被分为一类,如果一种类别里有多个实例,会用不同的颜色进行区分,我们可以知道哪个像素属于哪个类中的哪个实例。比如下图中黄色和红色都属于人这一个类别里,但是分别属于不同的实例(人),因此我们可以通过mask的颜色很容易分辨出不同的实例。

39 实例分割的基本思路就是在语义分割的基础上加上目标检测,先用目标检测算法将图像中的实例进行定位,再用语义分割方法对不同定位框中的目标物体进行标记,从而达到实例分割的目的。

实例分割算法也有一定的发展历史但其中影响深远且地位重要的算法不多,这里笔者仅以 mask R-CNN 为例进行介绍。

40 总而言之,SPP层的作用就是在卷积层和全连接层之间对卷积层的输出信息进行某种汇总,这样就可以避免在一开始就对图像进行裁剪和缩放。

41 所以,我们总结一下SPP-Net的基本思路:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。再将特征向量输入到分类器进行分类。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,相较于R-CNN来说SPP-Net的速度可谓飞速。

42 值得一提的是,在做实验的时候发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析为造成这种区别的原因是COCO上小目标的数量更多,而小目标对misalignment问题的影响更为明显(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)

43 ResNeXt-101+FPN的组合可以说是现在特征学习的王牌了

44 MSE 均方差损失函数
这个对数似然函数的形式和我们的MSE损失函数的定义是一样的。所以,使用MSE损失函数意味着,我们假设我们的模型是对噪声的输入做估计,该噪声服从高斯分布。
使用MSE的一个缺点就是其偏导值在输出概率值接近0或者接近1的时候非常小,这可能会造成模型刚开始训练时,偏导值几乎消失。
这导致模型在一开始学习的时候速率非常慢,而使用交叉熵(分类损失函数常用的)作为损失函数则不会导致这样的情况发生。

45 所以,使用逻辑函数得到概率,并结合交叉熵当损失函数时,在模型效果差的时候学习速度比较快,在模型效果好的时候学习速度变慢。
所以,使用交叉熵损失函数,不仅可以很好的衡量模型的效果,又可以很容易的的进行求导计算。

46 交叉熵的来源:
一条信息的信息量大小和它的不确定性有很大的关系。一句话如果需要很多外部信息才能确定,我们就称这句话的信息量比较大。

47 smooth l1 loss
为了从两个方面限制梯度:
当预测框与 ground truth 差别过大时,梯度值不至于过大
当预测框与 ground truth 差别很小时,梯度值足够小。

48

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值