深入理解anchor

2023-10-27


在博客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更好的解读欢迎一起讨论。


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

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解anchor 的相关文章

随机推荐

  • ROS Noetic版本 rosdep找不到命令 不能使用的解决方法

    使用rosdep指令来安装开源包所需的依赖是很方便的 本文主要介绍ROS Noetic版本中使用rosdep 报错找不到命令 rosdep不能使用的解决方法 rosdep 找不到命令 Command rosdep not found but
  • nginx 中文url rewrite 404

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 原料 nginx with debug或openresty 背景 项目中有用户图片库需求 允许用户自定义文件夹 然后上传图片到该文件夹 当用户自定义的文件夹为中文或者访问u
  • 微信第三方平台之代开发小程序(二)

    第二部分 快速创建小程序 必须全网发布成功 注 第一部分 全网发布前的准备 请看我前面的文章 1 权限集准备 全网发布成功后才可生效 2 第三方收集法人微信 法人姓名 企业名称 信用代码四个商户信息外加第三方客服电话 3 企业名称需与工商部
  • 【python教程入门学习】Python教程第1篇:下载和安装Python

    Python是当下流行的通用编程语言 简单易学 容易上手 且 钱 景广阔 在网络爬虫 数据挖掘分析 人工智能 运营运维 日常工作效率提升 无不有Python的影子 因此 今天跟大家分享Python的下载和安装教程 第一步 下载Python最
  • 域名服务详解(域名解析流程和分类)

    一 基本概念 访问互联网是依靠IP地址的 但IP地址多种多样 很难记忆 所以使用域名服务 代替IP地址输入 1 hosts文件 1 位置 Windows系统在C Windows System32 drivers etc hosts 需要超级
  • usdt充值btc网络(非节点钱包地址)

    1 此充值具有一定的交易风险 请一定做好判断 步骤 用户绑定其他交易所的地址 往平台充值 只能使用用户绑定的钱包地址充值 否则无法确认充值成功 用户先填写充值金额 gt 生成充值订单 gt 通过平台设置的收币钱包地址充值 gt 填写充值产生
  • ReactNative组件生命周期

    组件生命周期详解 组件生命周期基础知识 组件 又名控件 是一段独立可复用的代码 在React Native应用开发中 组件是页面最基本的组成部分 和React的组件一样 RN的组件也有自己的生命周期 在RN应用开发中 组件的生命周期指组件初
  • jvm知识梳理

    1 java虚拟机的组成 java虚拟机主要由四部分组成 1 ClassLoader 按特定格式加载class文件到内存中 2 runtime data area jvm内存空间模型 3 execution engine 命令解析器 4 n
  • layui上传如何带参数到后台

    https www jacksonlhj cn articles 2022 03 18 1647584610237 html
  • 【C语言学习日记】 两个整数做简单加减乘除运算

    include
  • C++中访问类的私有数据成员的第三种方法

    我们知道 C 的类是有封装性的 那么对于私有数据成员我们如果想在类外访问 一般而言无外乎这么两种方法 1 通过公有的成员函数2 通过友元这是两种通常的做法 还有一种是比较 反常 的 但是同样也可以达到这样的目的 那就是通过类的基地址偏移来访
  • 相机型号总结

    相机型号 价格 一 富士 二 奥林巴斯 三 索尼 四 佳能 五 尼康 六 理光 价格 一 富士 1 GFX系列 富士最高端的机器 像素5000w 价格3w 7w 2 X系列 主流的富士相机 XH 防抖功能 XT X Pro X E XA 平
  • 工业互联网平台创新发展白皮书 附下载地址

    工业互联网平台创新发展白皮书 2018 是在工业和信息化部信息化和软件服务业司的指导下 由国家工业信息安全发展研究中心 两化融合服务联盟 产业互联网发展联盟开展调研 搜集 分析了62个平台 229个工业企业应用案例组织编写而成 从总体 行业
  • 03:TIM定时器

    目录 一 TIM 1 介绍 2 定时器的分类 3 基本定时器 4 通用定时器 5 高级定时器 6 定时器的基本结构 二 定时中断功能 A 定时器定时器中断 1 连接图 编辑 2 步骤 3 函数介绍 4 代码 三 外部时钟功能 A 定时器外部
  • QT笔记-TreeWidget控件使用

    1 添加控件时 默认有1行 并且值为1 如何去掉 隐藏头即可去掉 方法1 方法2 ui treeWidget gt setHeaderHidden true 2 控件使用 1 添加控件 h private void OnInitTreeVi
  • antd select 实现可输入可远程检索并选择

    组件部分 import Select from antd const Option Select export interface SelectProps searchVal string setSearchOpt any onChange
  • 天数怎么换算成月_excel如何将天数换算为多少年多少月多少日

    excel如何将天数换算为多少年多少月多少日以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 excel如何将天数换算为多少年多少月多少日 思路如下 1 将天数除以
  • 让程序在screen模式下运行

    让程序在screen模式下运行 screen S yourname gt 新建一个叫yourname的session 然后输入你要执行的命令 screen ls gt 列出当前所有的session screen r yourname gt
  • Ping命令讲解

    ping是什么 ping Packet Internet Groper 因特网包探索器 用于测试网络连接量的程序 Ping发送一个ICMP 回声请求消息给目的地并报告是否收到所希望的ICMP echo ICMP回声应答 它是用来检查网络是否
  • 深入理解anchor

    在博客SSD原理解读 从入门到精通中提到了anchor作用 通过anchor设置每一层实际响应的区域 使得某一层对特定大小的目标响应 很多人肯定有这么一个疑问 那anchor到底可以设置到多大呢 本文尝试对anchor的大小进行了一系列的探