anchor 订阅
安佳,全球知名乳制品品牌。1886年诞生于新西兰,产品热销全球70多个国家和地区,深受万千消费者的青睐。 展开全文
安佳,全球知名乳制品品牌。1886年诞生于新西兰,产品热销全球70多个国家和地区,深受万千消费者的青睐。
信息
所属公司
新西兰恒天然集团
所属行业
乳品
中文名称
安佳
创立时间
1886年
创立地点
新西兰
英文名称
Anchor
安佳品牌介绍
安佳 [1-2]  隶属于恒天然集团,拥有130多年的悠久历史,是恒天然旗下的旗舰品牌。 恒天然牧场和工厂都建在纯净天然的新西兰,通过严格掌控“从牧场到餐桌”供应链的每一步,确保进口到中国的产品质量符合中国食品安全国家标准,让源于牛奶的营养菁华滋养每个家庭的健康生活。在上百年的发展历程中,安佳一直致力产品革新与开发,现在已经成长为一个全球性品牌。通过遍布世界的销售网络,如今安佳在全球生产和销售500多种不同的产品。多年以来,安佳始终致力于研发及生产各种高品质的乳制品以满足大众和专业市场的需求,其业务覆盖消费品牌以及餐饮服务等多个领域。在消费品牌方面,安佳纯牛奶、儿童牛奶、奶粉,以及黄油、淡奶油、芝士等产品帮助满足全家人对于每日营养的需要;在餐饮服务方面,安佳品牌为烘焙店、餐厅、酒店和快餐店提供黄油、淡奶油、芝士等高品质乳制品和餐饮解决方案。 [2] 
收起全文
精华内容
下载资源
问答
  • anchor
    千次阅读
    2022-02-12 10:57:42

    前言

    本文参考目标检测阵营 | Anchor-Base vs Anchor-Free

    如何评价zhangshifeng最新的讨论anchor based/ free的论文? - 知乎

    基础知识 | 目标检测中Anchor的认识及理解

    目标检测领域的发展从anchor-free到anchor-base,现在又有回到anchor-free的趋势,学术界技术的迭代更新也引导着工业界的变革。今天我们就从anchor出发,分析对比基于anchor-base和anchor-free的检测算法及优劣特性。

    目录

    前言

    目标检测中究竟什么是anchor?

    图像中的目标检测是如何做的?

    Anchor-Base

    基于单阶段的检测算法

    基于两阶段的检测算法

    Anchor-Free

    基于关键点的检测算法

    基于目标中心的检测算法

    二者孰优孰劣

    分类方式不同

    回归方式的不同

    知乎回答一(作者本人)

    知乎回答二

    从Faster R-CNN来理解Anchor

    过程

    Faster RCNN


    目标检测中究竟什么是anchor?

    anchor也叫做锚,其实是一组预设的边界框用于在训练时构建真实的边框位置相对于预设边框的偏移。通俗点说就是预先设置目标可能存在的大概位置,然后再在这些预设边框的基础上进行精细化的调整。而它的本质就是为了解决标签分配的问题。

    锚作为一系列先验框信息,其生成涉及以下几个部分:

    • 用网络提取特征图的点来定位边框的位置;

    • 用锚的尺寸来设定边框的大小;

    • 用锚的长宽比来设定边框的形状;

    通过设置不同尺度,不同大小的先验框,就有更高的概率出现对于目标物体有良好匹配度的先验框约束。

    图像中的目标检测是如何做的?

    在传统的图像处理时期,要想检测出图像中的目标,通常先提取图像特征,然后编码成一串串特征描述子送入机器学习的分类器中进行判别。比如HOG特征提取器通过滑窗+金字塔的方式逐个抠图,这种基于区域的方式在深度学习中得到了延续。

    在两阶段的目标检测分支中,暴力滑窗获得区域的思想逐步演化出锚的概念,从Faster RCNN网络开始正式基于anchor回归坐标,通过RPN的策略生成候选框。

    在单阶段的目标检测分支中,从SSD到YOLOv2,v3,v4,v5都延续着基于anchor做回归的路线。

    这里小伙伴们会发现怎么把YOLOv1漏了?

    YOLOv1只有区域划分的思想而没有锚框的概念,虽然将图片网格化后在每个网格中预测目标,但是尺度的回归是在整个图像中,所以该网络出来时检测精度相比同期作品低了一大截,这也是为什么YOLO的后期版本均加入了锚框的思想,在锚框的约束下使模型的精准度和召回率都有了质的提升。

    Anchor-Base

    前几年目标检测领域一直被基于锚的检测器所统治,此类算法的流程可以分为三步:

    1. 在图像或者点云空间预设大量的anchor(2D/3D);

    2. 回归目标相对于anchor的四个偏移量;

    3. 用对应的anchor和回归的偏移量修正精确的目标位置;

    基于单阶段的检测算法

    在图像上滑动可能的锚点,然后直接对框进行分类。这两年单阶段的检测方法不断的扩充YOLO家族,小编接触过的就有YOLOv1—v5,Complex-YOLO,YOLO3D,YOLO-LitePoly-YOLO,YOLOP等等,GitHub上一搜能有小几十个变形。

    整体框架一般分为BackBone,Neck,Head三大块,基础特征部分其实ResNet-50就挺好了,或者采用CSP/C3等模块级联提取特征。Neck部分各个网络也都差不多,采用FPN或者PAN来融合高低层特征图信息。Head部分主要针对任务而定,如果做二维框检测就回归中心点,宽高,类别等信息;如果做三维框检测可以增加朝向角或者掩码图等等。

    基于两阶段的检测算法

    对每个潜在的框重新计算图像特征,然后将这些特征进行分类。这两年两阶段的新方法出现的比较少,在2D,3D或者前融合领域出现的两阶段检测算法还是依托于Faster-RCNN的理念。

    两阶段检测算法主要还是RCNN系列,包括RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN等。其中RCNN和Fast-RCNN之间过渡了一个SPPNet。之后在Faster-RCNN框架的基础上出现了特征金字塔。然后Mask-RCNN融合了Faster-RCNN架构、ResNet和FPN,以及FCN里的分割方法来提升mAP。

    下图是在网上找到的一张两阶段检测网络发展历程,从细分市场的角度描述的挺详细的,供小伙伴们对应学习(图片来自网络,如有侵权,联系删除):

    目标检测中为什么要引入anchor?

    相当于在检测网络中引入先验信息,可以想象一下在一张大图中去定位目标位置与在一个小框中修正目标位置哪个更容易些呢?

    Anchor-Free

    基于Anchor-Free的目标检测算法有两种方式,

    • 其一就是我们前几篇提到的关键点检测方法,通过定位目标物体的几个关键点来限定它的搜索空间;
    • 其二是通过目标物体的中心点来定位,然后预测中心到边界的距离。

    最直接的好处就是不用在训练之前对当前训练数据聚类出多个宽高的anchor参数了。

    基于关键点的检测算法

    此类方法将目标检测问题转换成关键点定位组合来解决,下面介绍几种关键点检测算法:

    首先就是CornerNet,它通过检测目标框的左上角和右下角两个关键点获得预测框。整个网络如下图所示:输入图像通过串联多个Hourglass模块做特征提取,然后输出两个分支,即左上角点预测分支和右下角点预测分支;每个分支模型经过Corner Pooling后输出三个部分:

    • Heatmaps:预测角点位置

    • Embeddings:预测的角点分组

    • Offsets:微调预测框

    Grid R-CNN算法基于RPN找到候选区域,对每个ROI特征独立的提取特征图。将特征图传到全卷积网络层里面输出概率的热度图,用于定位与目标物对齐的边界框的网格点;借助网格点通过特征图级别的融合,最终确定目标物的准确边界框。

    ExtremeNet算法通过串联多个Hourglass模块对每个目标预测5个关键点(上、下、左、右四个极点和一个中心点),如果五个关键点是几何对齐的,也就是说将不同热度图的极点进行组合,判断组合的几何中心是否符合中心点热图上的值的要求,再将它们分组到一个外接框中。

    基于目标中心的检测算法

    此类方法在构建模型时将其看作一个点,即目标框的中心点。检测器在回归中心点的同时得到它的相关属性。下面我们介绍几种基于目标中心的检测算法:

    YOLO作为早期的一种anchor-free的算法,将目标检测作为一个空间分离的边界框和相关的类概率回归问题,可以直接从整张图片预测出边界框和分类分数。

    但是它最后采用全连接层直接对边界框进行预测,由于图片中存在不同尺度和长宽比(scales and ratios)的物体,使得YOLO在训练过程中学习适应不同物体的形状比较困难。

    上面我们也提到YOLO由于在网络中没有预先假设框的大小和宽高比,所以在训练的过程中它除了知道每个网络输出几个检测框外,其他预设框的任何信息都一无所知。

    CenterNet只需要提取目标的中心点,无需对关键点分组和后处理。这篇文章的网络结构较为清晰,从开源的代码中可以看到,采用编解码的方式提取特征(Resnet/DLA/Hourglass),输出端分为三块:

    • Heatmap:预测中心点的位置;

    • wh:对应中心点的宽高;

    • reg:对应中心点的偏移;

    那么目标检测领域为什么又考虑去掉anchor呢?

    1. 预先设定的anchor尺寸需要根据数据集的不同做改变,可以人工设置或对数据集聚类得到;

    2. anchor的数量相比目标的个数多很多,造成正负样本的不均衡现象;

    当然为了解决去掉anchor后目标尺度变化,类别不平衡等的问题,FPN,PAN,Focal loss等技术起到了很好的作用,通过FPN,PAN对不同层级特征的融合使得预测时使用的特征图中就包含了不同尺度的目标特征,这样就不需要用不同尺度的anchor来锁定目标尺寸再进行回归。而Focal loss对正负样本求损失时的加权也在一定程度上缓解了不平衡问题。

    二者孰优孰劣

    学术界有一篇专门介绍Anchor-Base和Anchor-Free差异的文章:《Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection》

    论文地址:https://arxiv.org/abs/1912.02424

    论文解读;ATSS: Bridging the Gap Between Anchor-based and Anchor-free Detection via ATSS 笔记 - winechord - 博客园

    知乎解读(有作者本人):如何评价zhangshifeng最新的讨论anchor based/ free的论文? - 知乎

    两种方式的本质区别在于如何定义正负样本以及回归的方式。如下给出了Anchor-Base算法RetinaNet(左图)和Anchor-Free算法FCOS(右图)的两个区别:

    • 分类方式不同:正负样本的选择方式

    • 回归方式不同:基于anchor还是point做回归

    分类方式不同

    如图(a) RetinaNet基于anchor做回归,首先计算来自不同尺度的anchor box与gt的IoU来确定正负样本;对于每个目标在所有IoU大于阈值k的anchor box中,选择最大的作为正样本,所有IoU小于阈值q的anchor box作为负样本,其余忽略不计;最后针对正样本的anchor回归相对偏移量。

    如图(b) FCOS基于center做回归,使用空间和尺度约束将anchor点分配到不同尺度上,通过判断特征图上的点是否落入gt中来确认正负样本,即将物体边框内的所有位置都定义为正样本;最后通过4个距离值和1个 中心点的分数来检测物体。

    蓝色框、红色框和红色点分别代表真值,锚框和锚点。

    回归方式的不同

    如图(b) RetinaNet回归的是anchor box和gt的4个偏移量。

    如图(c) FCOS回归的是中心点到目标四条边的距离。

    从这两种算法我们可以看出,如果选择基于anchor做位置回归,那么检测精度会受限于anchor的宽高设计,如上图第一行,如果anchor设计的过小,与gt计算IoU时会因为重叠率小于阈值而被作为负样本。造成的影响不仅包括了正样本个数的减少,还有负样本噪声的增加。

    经过前人的研究可以得到这样的信息:如果在训练过程中选择的正负样本保持一致,此时无论是采用基于anchor进行回归还是基于关键点进行回归,得到的检测结果是相近的。那么在训练的过程中如何选择正负样本就成了提升检测性能的关键因素!

    知乎回答一(作者本人)

    作者:张士峰
    链接:https://www.zhihu.com/question/359595879/answer/927861326
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    感谢楼主的提问,以前都是偷偷看各位大佬们在知乎上提问和讨论的,现在有机会来回答一下。首先想跟楼主说一下,就是问题最后的那个描述“这篇论文是否说明anchor-based的方法在未来目标检测可能要被淘汰 ?”感觉描述这篇论文不是很合适,因为这个工作主要是探索anchor-based和anchor-free的区别与联系,并没有说哪个要被淘汰。

    回到正题,最近anchor-free的检测出了很多优秀的论文,不少大佬都有对anchor-based和anchor-free进行分析,其中指出过说,只铺1个anchor的RetinaNet和类似FCOS的anchor-free方法非常像,这也是我们这个工作的出发点。既然两者非常像,为什么性能存在不少的差距?为了分析导致两者性能差异的本质区别,我们首先把一些实现差异排除掉,FCOS提出或使用了几点改进,这些改进在RetinaNet中也work,因此我们把这些改进都加到了只铺1个anchor的RetinaNet中。此时的RetinaNet与FCOS还有差不多1个点的性能差距,而两者的不同仅剩正负样本的选取和回归的起点。一开始我们猜想是,这两个不同都会导致最终性能的差异,但实验结果表明,回归的起点对结果影响不大,主要是正负样本的选取导致的性能差异。所以,除了提出一些通用的改进外,FCOS还提出了一个更好的正负样本选取方式,它比RetinaNet中基于固定IoU选取正负样本要有更好的表现。

    受此启发,我们就对正负样本的选取进行了一些探索,提出了一个adaptive的选取方式ATSS,在几乎没有超参的情况下,对只铺1个anchor的RetinaNet涨2.3个点,对铺多个anchor的RetinaNet涨0.8个点,对FCOS涨1.4个点(FCOS不加center sampling结果是37.8,我们的center sampling是只用了ATSS的第一步,能涨到38.6,再用ATSS剩下的步骤能涨到39.2)。虽然ATSS需要借助于铺设1个anchor来选取正样本,但无论这1个anchor铺什么比例,或铺多大尺寸,ATSS提升都挺稳定,主要是因为ATSS会根据目前所铺设的anchor,自适应地根据统计信息来选取合适的正负训练样本。

    另外一点,我们发现使用ATSS后,只铺1个anchor的RetinaNet和铺3~9个anchor的RetinaNet结果基本一致。铺多个anchor的目的之一是提供更多的正样本,同时解决FCOS中提到的ambiguous samples问题。但铺多个anchor会带来两个问题,一是负样本的大量增加,二是需要同一个特征点来预测多个不同的类别。这两个问题会加剧分类的难度。我们猜想,这是在使用恰当正负样本采样策略后铺一个anchor和多个anchor性能没区别的原因。因此,铺设多个anchor还需进一步研究来发挥它的作用。

    以上说的都是在one-stage的anchor-based算法和center-based的anchor-free算法中验证。知乎网友也说了有些类似的实验结果或结论,感谢知乎网友的点评以及对我们的看重,着实压力很大,后面会努力,做出更solid的解决办法。

    知乎回答二

    作者:王剑锋
    链接:https://www.zhihu.com/question/359595879/answer/927936835
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    看到这篇paper的第一反应是比较失落,因为我们组也在做很类似的事情,但走了很多惨绝人寰的弯路。等看完code之后发现和预想的有点出入,总体上是比较遗憾和失望,下面会提到为什么。

    ATSS的实际motivation大概率是来自FreeAnchor。FreeAnchor告诉了我们anchor matching(或者说label assign)这个地方是有油水的。说起来我有个同事上半年就想做label assign,但是这个环节非常不好做上限分析,就一直没有开始做,也是直到FreeAnchor出来才开始做。我对FreeAnchor的评价还不错,可惜细节比较多,一些实现方式也不太好做更深的分析。(另外吐槽一下知乎上对FreeAnchor的讨论都是什么鬼。)

    类似的paper其实之前也有,最像的是PISA,虽然表现形式完全不同,本质却是非常相似,都是「对于每个ground-truth,依照某种指标取top-k个sample,再在loss上进行一下re-weight」。

    有了FreeAnchor之后,挪到FCOS上做一个“FreeFCOS”好像是一个非常直接的想法,毕竟FCOS就是RetinaNet的一个简单变种而已。事实上我们组在几天之内就成功跑出了一版可以跑到39.2的FreeFCOS(简单移植,没有novelty不值得写paper),我当时还立了一个半个月内做过40的flag,但再往后就像遇到了次元壁一样无论怎么做都提不上去了。

    ATSS虽然基本上照搬了FreeAnchor的matching部分,但毕竟形式上比FreeAnchor简洁太多了,总体上很清爽。只是有两处问题我觉得蛮硬伤的:

    1. 去掉了FCOS的hand-crafted分层(告诉ground-truth归哪一层feature map管),但是依然需要保留一个有面积的anchor,实质上还是在用这个面积来进行hand-crafted分层,而且这个面积会和RetinaNet的anchor一样critical。Table 5告诉我们这个面积不敏感,但Table 5的范围太窄了,我推测RetinaNet也有差不多的robustness。而FreeFCOS是可以不分层的。
    2. mean+std这个threshold恐怕大概率是试出来的;4.1中最后一段对此做了解释,但是非常牵强:首先引入1σ分位点的概念,但top-k的iou还满足正态分布这个就很鬼畜了;另外这里提到了一个20%,我个人推测这个threshold能work的原因很可能是因为feature map有5层,每层取一样多的k个,那ground-truth落在某一层的概率就是20%;也就是说,真正本质的threshold可能是让最终的正样本大致落在同一层上比较好,和mean、std、正态分布之类的都没什么关系。也就是说,也还是hand-crafted分层的一部分。

    这两处问题合在一起,会导致整个方法其实根本不是adaptive的,因为不管网络训练到什么程度,对于一个ground-truth,ATSS给它match到的anchor(看起来会变但)始终都没变。因为anchor不会变,anchor和ground-truth的中心点距离和iou也就不会变,根据距离算出的每层的top-k也就不会变,threshold也是根据iou算出来的,于是最终的正样本也就不会变。哪里adaptive了呢?

    真正的adaptive我觉得应该做到两点:(1) 没有anchor;(2) 也不要做其他形式的hand-crafted分层。孙剑老师曾经challenge我为什么这样是有价值的?我当时的回答是,我们有很多个项目,模型本身是一模一样的,但因为数据resolution不同,ground-truth的size不同,每个项目拿过来都要重新调anchor或者调分层参数,不仅是研究员和工程师的精力成本,也是自动化的障碍,在学术上还是更好解scale问题的阻碍;这个事,能不能训练的时候自己就学了?甚至,能不能其他一些辅助训练的threshold也自己就选好了?至少目前的detection方法还做不到。

    至于ATSS的另一个贡献,即bridging the gap,我觉得这个应该算是FCOS文里就该指出来但是遗憾没有指出来的东西,如果换成更老辣的人(比如FAIR)来做FCOS,可能早就没有这个问题了。(题外话,FCOS不成熟的地方有好几处,有一部分被impr版fix了,有的现在也没有)。

    还有一个问题可能值得一提,就是label assign的上限问题。由于label assign没有ground-truth,我们很难做上限分析,不知道还有多少空间可以做。关注label assign的除了FreeAnchor、PISA、ATSS之外,还有一篇与ATSS几乎同时放出来的MAL,抱歉我还没怎么看它具体怎么做的,但它的ResNet-50的结果也是39.2。虽然实现方式各有差异,但都只做到39出头。我不知道是因为我们还没有找到更好的方式,还是说label assign的空间可能已经不大了,毕竟说到底label assign也只是为了网络更好地收敛而服务的。这个需要其他人来解答了。

    从Faster R-CNN来理解Anchor

    过程

    最开始出现的是R-CNN,如下图:

    从上图可以看出其框架做了很多重复的计算,在第二步之后,如果有2k个proposals,那后面就要执行2k边,太低效。于是,出现了改进的SSP-Net,如下图:

    SSP-Ne框架组合了Classification和Regression,做成单个网络,并且可以Een-to-End进行训练,速度上提高许多。但是,SSP-Net还是基于Selective Search产生proposal,之后就出现了Fast R-CNN,其是融合了R-CNN和SPP-Net的创新,并且引入多任务损失函数,使整个网络的训练和测试变得十分方便。

    但是Region proposal的提取还是使用了Selective Search,目标检测时间大多消耗在这上面(大约region proposal需2~3s,而提特征分类只需0.32s),这种是无法满足实时应用,而且并没有实现真正意义上的端到端训练测试(因为region proposal使用了Selective Search先提取处来)。

    于是就有了直接使用CNN产生region proposal并对其分类,这就是Faster R-CNN框架,如下图:

    Faster R-CNN将proposals交给了CNN去生成,这样Region Proposal Network(RPN)应运而生。

    Faster RCNN

    仔细看看Faster R-CNN框架,其实还保留了Fast R-CNN的框架,其主要就是CNN+RPN。其中RPN主要就是负责生成proposals,然后与最后一层的feature map一起使用,用ROI Pooling生成固定长度的feature vector。具体如下:

    那接下来开始好好的说一下RPN和Anchor!下图是我从网络copy过来的,应该更加能理解整体的流程及内容。

    在上图中,红色的3x3红框是其中一个滑窗的操作过程,注意这里的Anchor是原图像像素空间中的,而不是feature map上的。这样的话,就可以很好去知道Anchor的意思,而且Anchor对于RPN非常重要。

    现在,我们假设现在的feature map尺寸为W x H x C(13x13x256就是feature map的Width=13,Height=13和Channel=256),在feature map使用滑动窗口的操作方式,当前滑窗的中心在原像素空间的映射点就称为Anchor,并且以Anchor为中心去生成K(paper中default K=9,3个尺寸和3个缩放比例)个proposals。

    在feature map上滑动一次,得到一个小网络,该网络输入是3x3x256,经过3x3x256x256的卷积,就可以得到1x1x256的低维特征向量。

    然后就得到上图的两个分支。

    • Classification:经过1x1x256x18的卷积核,得到1x1x18的特征向量,分别代表9个proposals的Object的概率(是或不是);

    • Regression:经过1x1x256x36的卷积核,得到1x1x36的特征向量,分别代表9个proposals的(长宽及中心点坐标)。

    注意,上面只是一个小网络,也就是一个3x3滑窗的过程及结果,在网络整体运行的过程中,要将整个feature map都要滑动一遍,最终就会得到两个损失函数:

    其中就是Classification(Lcls)和Regression(Lreg)两个损失。对于边界框的回归,其是采用以下4个坐标的参数化:

    综上,通过滑窗和Anchor机制就可以找到固定比例、一定大小的proposals,这样RPN就可以完美替代低效的Selective Search去产生proposals。

    最终,在目标检测领域中,这个框架算是一个里程碑,值得大家学习与深入探索。最后的检测结果也是不错的。

    更多相关内容
  • 锚 :anchor: Anchor是Solana 运行时的框架,提供了几个方便的开发人员工具。 Rust eDSL用于编写Solana程序 规格 用于从IDL生成客户端的TypeScript包 CLI和工作区管理,用于开发完整的应用程序 如果你熟悉复仇的...
  • use ( require ( 'markdown-it-anchor' ) , opts ) 看到一个 。 opts对象可以包含: 名称 描述 默认 level 在所选级别或所选级别数组上应用锚点的最低级别。 1个 slugify 自定义分段功能。 参见 ...
  • CKEditor 5锚点 该软件包实现了CKEditor... import Anchor from '@ckeditor/ckeditor5-anchor/src/anchor' ; 在代码中使用它 ClassicEditor . create ( document . querySelector ( '#editor' ) , { plugins : [ An
  • 主要介绍了winform 使用Anchor属性进行界面布局的方法,有需要的朋友可以参考一下
  • ant design vue 锚点使用 Anchor 踩坑记录
  • import AnchorLink from 'react-anchor-link-smooth-scroll' const SmoothScroll = ( ) => ( < AnchorLink href = '#things'> Things < / AnchorLink > < AnchorLink href = '#stuff'> Stuff < / Anchor...
  • 深度度量学习的代理锚丢失 PyTorch的CVPR 2020论文官方PyTorch实施。 经过代理-锚丢失训练的标准嵌入网络可实现SOTA性能,并能最Swift地收敛。 该存储库提供了四个数据集(CUB-200-2011,Cars-196,斯坦福在线产品...
  • 锚的Anchor 是 Solana 的Sealevel运行时框架,提供了多种方便的开发人员工具。用于编写 Solana 程序的 Rust eDSLIDL规范用于从 IDL 生成客户端的 TypeScript 包用于开发完整应用程序的 CLI 和工作区管理如果你熟悉...
  • Anchor-功能丰富的开源EOSIO钱包特征Anchor的一些显着功能包括但不限于: 一个支持通用EOSIO功能(令牌传输,资源管理,治理等)的用户界面。 与直接集成,可为兼容网络上的提供有限的。 支持几乎所有基于EOSIO的...
  • 获得数据集anchor box的大小
  • 锚图锚图构建算法的 Python 实现。 此处定义的算法:Wei Liu、Junfeng He 和 Shih-Fu Chang,“Large Graph Construction for Scalable Semi-Supervised Learning”,机器学习国际会议 (ICML),以色列海法,2010 年...
  • 使用withAnchorPoint提供简单,棘手但功能强大的功能,例如iOS中的Anchor Point,Android中的Pivot Point,css中的transform-origin ,以在React-Native中实现更好的3D变换动画。 在React Native中简化3D转换 入门 ...
  • 目标检测是计算机视觉应用的基础, 基于锚框的一些目标检测算法已难以满足目标检测中对目标处理的效率、性能等诸多方面的要求, 而anchor free方法逐渐广泛应用于目标检测. 本文首先重点介绍了CornerNet、CenterNet、...
  • Anchor软件包位于pypi上。 只需运行: pip install anchor-exp 或克隆存储库并运行: python setup.py install 如果要使用AnchorTextExplainer ,则必须运行以下命令: python -m spacy download en_core_web_lg ...
  • gitbook-plugin-anchor-导航 将锚点导航添加到您的Gitbook。 默认显示: 悬停显示: 使用安装在您的书中 $ npm install --save gitbook-plugin-anchor-navigation 将插件添加到您的book.json : { "plugins" ...
  • 如下所示: export default { inserted: function(el, binding) { el.onclick = function() {... total = document.getElementById(`anchor-${binding.value}`).offsetTop; } let distance = document.documentEle
  • 快速跳转锚,无论你在任何页面 厌倦了不断在大页面中上下滚动? 不再! 远离烦人的滚动按钮; 使用锚索引,无论您在任何页面的任何位置,都可以在锚...开源@ https://github.com/rdok/anchor-index 支持语言:English
  • Lep-Anchor 已被开发用于通过使用 Lep-MAP3 提供的所有信息以及长读取和重叠群-重叠群比对提供的附加信息来有效地将基因组锚定到染色体中,以连接重叠群和折叠单倍型。 Lep-Anchor 支持多个地图上的数百万个标记。 ...
  • 主要介绍了JavaScript中的anchor()方法使用,是JS入门学习中的基础知识,需要的朋友可以参考下
  • FreeAnchor:学习匹配可视对象检测的锚点(NeurIPS 2019)FreeAnchor“ FreeAnchor:学习匹配可视对象检测的锚点”的代码。 该存储库基于maskrcnn-benchmark,FreeAnchor也已在mmdetection中实现,这要感谢@ yhcao6...
  • 创建文件夹anchor / plugins / reCAPTCHA / 将文件recaptchalib.php 下载到文件夹anchor / plugins / reCAPTCHA / 更改代码添加评论(发表评论)/anchor/routes/site.php 到我的 site.php ( ) 我关闭了垃圾邮件检查...
  • Anchor Library

    2018-08-25 13:04:08
    CY7C68013开发资源,很好的官方资源。。Anchor EZ-USB Firmware Library
  • 添加锚链接(WordPress插件) 就像Github在Readme.md文件中所做的那样,在所选帖子的内容中创建指向标题标签的锚链接。...如果不需要,请不要加载CSS define('ADD_ANCHOR_LINKS_DONT_LOAD_CSS', true);学分
  • Anchor机制解读.pdf

    2019-06-05 10:22:39
    针对目标检测中基于anchor机制进行解读的PDF文件,包括其优缺点总结。
  • 锚定数据 使用锚作为查询字符串。 目录 这个怎么运作 该库使用[removed].hash来存储查询字符串等信息。 如果你有一个复合数据,lib 用valueDelimiter存储它,默认情况下是=那么我们会有key=value 。...
  • jump-to-anchor-crx插件

    2021-04-04 02:54:03
    语言:English 上下文菜单项跳到最接近所选文本(如果有)的锚点,否则跳转到右键单击点。 上下文菜单项跳到最接近所选文本(如果有)的锚点,否则跳转到右键单击点。
  • 深入理解anchor

    万次阅读 多人点赞 2019-11-10 20:53:49
    主要研究了anchor大小的设置以及提出了MTCNN中的anchor机制

    在博客SSD原理解读-从入门到精通中提到了anchor作用:通过anchor设置每一层实际响应的区域,使得某一层对特定大小的目标响应。很多人肯定有这么一个疑问:那anchor到底可以设置到多大呢?,本文尝试对anchor的大小进行了一系列的探索,同时借鉴了SSD的anchor机制,提出了MTCNN中的anchor机制,能够显著提高MTCNN的精度。



    理论感受野大小的计算

    由于本文在讨论anchor大小的时候,都是与理论感受野大小相关的,这里有必要说一下理论感受野大小的计算。关于理论感受野大小的计算,有一篇很好的文章:A guide to receptive field arithmetic for Convolutional Neural Networks,国内也有这篇文章的翻译,在网上都可以找到。关于这篇文章就不展开说了。这里直接给出我用的计算感受野大小的python代码,直接修改网络参数就可以计算理论感受野大小,非常方便。

    def outFromIn(isz, net, layernum):
        totstride = 1
        insize = isz
        for layer in range(layernum):
            fsize, stride, pad = net[layer]
            outsize = (insize - fsize + 2*pad) / stride + 1
            insize = outsize
            totstride = totstride * stride
        return outsize, totstride
    
    def inFromOut(net, layernum):
        RF = 1
        for layer in reversed(range(layernum)):
            fsize, stride, pad = net[layer]
            RF = ((RF -1)* stride) + fsize
        return RF
    
    # 计算感受野和步长,[11,4,0]:[卷积核大小,步长,pad]
    def ComputeReceptiveFieldAndStride():
        net_struct = {'PNet': {'net':[[3,2,0],[2,2,0],[3,1,0],[3,2,0],[1,1,0]],'name':['conv1','pool1','conv2','conv3','conv4-3']}}
        imsize = 512
        print ("layer output sizes given image = %dx%d" % (imsize, imsize))
        for net in net_struct.keys():
                print ('************net structrue name is %s**************'% net)
                for i in range(len(net_struct[net]['net'])):
                    p = outFromIn(imsize,net_struct[net]['net'], i+1)
                    rf = inFromOut(net_struct[net]['net'], i+1)
                    print ("Layer Name = %s, Output size = %3d, Stride = %3d, RF size = %3d" % (net_struct[net]['name'][i], p[0], p[1], rf))
    

    运行结果如下
    在这里插入图片描述
    除了通过公式计算,还有一种更加方便的可以用于手工计算的方式。这里给出几条规则:

    1. 初始featuremap层的感受野是1
    2. 每经过一个convkxk s1(卷积核大小为k,步长为1)的卷积层,感受野 r = r+ (k - 1),常用k=3感受野 r = r + 2,k=5感受野r= r + 4
    3. 每经过一个convkxk s2的卷积层或max/avg pooling层,感受野 r = (r x 2) + (k -2),常用卷积核k=3, s=2,感受野 r = r x 2 + 1,卷积核k=7, s=2, 感受野r = r x 2 + 5
    4. 每经过一个maxpool2x2 s2的max/avg pooling下采样层,感受野 r = r x 2
    5. 经过conv1x1 s1,ReLU,BN,dropout等元素级操作不会改变感受野
    6. 经过FC层和GAP层,感受野就是整个输入图像
    7. 全局步长等于经过所有层的步长累乘

    具体在计算的时候,采用bottom-up的方式。
    要计算哪一层的感受野,就将该层的输出设置为1,然后依次向前计算,比如下图中的网络结构中,要计算pool3的感受野,将pool3的输出设置为1,就可以得到conv1的输入大小为30x30,也就是P3的感受野大小为30。
    在这里插入图片描述
    按照这个算法,我们可以算出SSD300中conv4-3的理论感受野:
    r =(((1 +2 +2+2+2 )x2 +2+2+2 )x2 +2+2 )x2 +2+2 = 108
    注意:由于conv4-3后面接了3x3的卷积核做分类和回归,所以在计算感受野大小的时候,需要将用于分类和回归的3x3的卷积核也考虑进去。


    经典SSD网络anchor的设置

    下面我们来看一下经典网络中anchor大小是如何设置的

    在这里插入图片描述
    其中( )中的数字表示:anchor/理论感受野,下文中使用该数值表示anchor的大小。
    在这里插入图片描述
    注:SFD:Single Shot Scale-invariant Face Detector

    于老师开源的检测器:ShiqiYu/libfacedetection中anchor的设置
    在这里插入图片描述

    在这里插入图片描述

    观察SSD,SFD,YuFace,RPN中的anchor设计,我们可以看出anchor的大小基本在[0.1,0.7]之间。RPN网络比较特别,anchor的大小超出了感受野大小。


    anchor大小的探索

    下面我做了一系列实验探索anchor大小的范围,分别在数据集A和数据集B上,使用SFD_VGG16和SSD_YuFaceNet两个模型,所有层的anchor大小分别设计为0.1~0.9,观察模型的AP和loss大小。
    注:SFD_VGG16和SSD_YuFaceNet分别使用的是SFD开源的网络和ShiqiYu/libfacedetection开源的网络

    AP

    数据集A:
    在这里插入图片描述
    数据集B:
    在这里插入图片描述

    loss

    数据集A:
    在这里插入图片描述

    数据集B:
    在这里插入图片描述

    实验分析

    通过对经典网络的分析,以及实验的结果,可以观察到以下现象:

    1. anchor可以设置的范围较大,从实验结果来看,0.05~1.0基本都可以收敛,这也解释了为什么FasterRCNN中的RPN网络anchor大小可以超过感受野。从loss来看,anchor太大或者大小收敛效果都不好,甚至会出现不收敛的情况。这一点也很好理解,如果anchor太大,导致目标上下文信息较少,而如果anchor太小,又会导致没有足够多的信息。
    2. 综合AP的值以及loss的大小,我们可以看出,anchor在0.2~0.7之间收敛效果较好,这个结论与SSD经典网络的设置基本一致。这个范围既可以保证目标有足够多的上下文信息,也不会因为目标太小没有足够多的信息。

    注:由于目前实验数据还不够充分,这个范围可能并不准确,欢迎大家留言讨论。


    滑动窗口,感受野与anchor的关系

    首先区分一下这几个比较容易混淆的概念:

    1. 滑动窗口:使得某一层输出大小为1的输入大小就是该层的滑动窗口大小。比如MTCNN中PNet,滑动窗口大小为12x12
    2. 理论感受野:影响某个神经元输出的输入区域,也就是该层能够感知到的区域
    3. 有效感受野:理论感受野中间对输出有重要影响的区域
    4. anchor:预先设置的每一层实际响应的区域

    滑动窗口大小和理论感受野是一个网络的固有属性,一旦网络结构确定了,这两个参数就确定了,有效感受野是可以通过训练改变的,anchor是通过人工手动设置的。理论感受野,有效感受野,滑动窗口是对齐的, anchor设置过程中也要与感受野对齐,否则会影响检测效果。检测层上每个像素点都会对应一个理论感受野,滑动窗口以及anchor。


    MTCNN中的anchor机制

    MTCNN训练机制的问题

    熟悉MTCNN的朋友应该都知道,训练MTCNN的时候需要事先生成三类样本:positive,part,negative.这三类样本是根据groundtruth的IOU来区分的,原论文中的设置是IOU<0.3的为negative,IOU>0.65的为positve,0.4<IOU<0.65的为part。
    在这里插入图片描述
    上图中生成的positive样本为,图中红色框为groundtruth,蓝色框为候选框
    在这里插入图片描述
    其中回归任务回归的就是两者之间的offset
    在这里插入图片描述

    回归的4个偏移量(公式不唯一):

    ( x 1 − x 1 ’ ) / w (x1-x1’)/w (x1x1)/w

    ( y 1 − y 1 ’ ) / h (y1-y1’)/h (y1y1)/h

    ( x 2 − x 2 ’ ) / w (x2-x2’)/w (x2x2)/w

    ( y 2 − y 2 ’ ) / h (y2-y2’)/h (y2y2)/h
    对于小目标或者类似头肩这种目标,会出现一些问题
    在这里插入图片描述
    生成的positive样本如下:
    在这里插入图片描述
    基本上是一块黑色区域,没有太多有效信息。
    对于小目标:
    在这里插入图片描述
    生成的positive是
    在这里插入图片描述
    这样的图像,这些图像是非常不利于训练的,而且MTCNN在训练的时候输入分辨率都比较小(比如12,24,48),将这些生成的图像resize到12,24或者48之后会导致有效信息更少,为了解决这个问题,我们需要包含目标更多的上下文信息,会更加容易识别。
    在这里插入图片描述

    MTCNN中的anchor机制

    借鉴SSD中anchor的思想,提出了MTCNN中的anchor

    SSD在训练过程中通过anchor与groundtruth的匹配来确定每一个anchor的类别,具体匹配过程:计算与每个anchor的IOU最大(>阈值)的那个groundtruth,如果找到了,那么该anchor就匹配到了这个groundtruth,该anchor就是positive样本,anchor的类别就是该groundtruth的类别,回归的offset就是anchor与groundtruth之间的偏移量。由于SSD的anchor通常都比理论感受野小,所以SSD会包含较多的上下文信息,如下图所示。
    在这里插入图片描述
    联想到MTCNN,在生成训练样本的时候,我们可以将候选框当成anchor,生成positive的过程就是SSD中的匹配过程,由于需要包含更多上下文信息,最后会对anchor进行扩边生成最后的训练样本 。
    在这里插入图片描述
    红色区域就是anchor也就是生成的positive样本,整个黑色区域就是对anchor做扩边后生成的训练样本,可以看到包含了更多的上下文信息。

    实验结果与分析

    在多种数据集上对anchor机制进行了实验。
    数据集1:
    在这里插入图片描述
    数据集2:在这里插入图片描述
    从实验结果我们可以看出,anchor机制可以显著提高检测器的精度。


    结束语

    关于anchor其实还有很多地方值得探索,本文只是总结了一下最近工作中对anchor的一些最新的认识,就当抛砖引玉,大家如果有关于anchor更好的解读欢迎一起讨论。


    非常感谢您的阅读,如果您觉得这篇文章对您有帮助,欢迎扫码进行赞赏。

    这里写图片描述

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,520
精华内容 59,808
关键字:

anchor

友情链接: test_coordinate.rar