DenseBox检测算法的设计十分超前,如今很多Anchor-free方法有其影子,如果当时不是比Faster R-CNN晚了一点出现,可能目标检测领域很早就开始往Anchor-free的方向发展了



来源:晓飞的算法工程笔记 公众号

论文: DenseBox: Unifying Landmark Localization withEnd to End Object Detection

Introduction


  DenseBox是早期的Anchor-free目标检测算法,当时R-CNN系列在小物体的检测上有明显的瓶颈,所以作者提出DenseBox,在小物体的检测也有不错的表现。在DenseBox提出的早些时间,著名的Faster R-CNN出现了,其强大的性能主导了目标检测算法往anchor-based的方向发展。直到FPN的出现后,Anchor-free算法的性能才有了很大的提升,更多的工作开始涉及Anchor-free领域。目前很多Anchor-free目标检测研究都有DenseBox的影子,所以DenseBox的设计思路还是很超前的。

DenseBox for Detection


  DenseBox的整体设计如图1所示,单个卷积网络同时输出多个预测框及其类别置信度,输出的特征图大小为\(5\times \frac{m}{4}\times \frac{n}{4}\)。假设像素\(i\)位于\((x_i, y_i)\),其期望的5维向量为\(\hat{t}_i=\{\hat{s}, \hat{dx^t}=x_i - x_t, \hat{dy^t}=y_i - y_t, \hat{dx^b}=x_i - x_b, \hat{dy^b}=y_i - y_b \}\),第一个为分类置信度,后四个为像素位置到目标边界的距离,最后,将所有像素的输出转化为预测框,经过NMS处理后进行最后的输出。

Ground Truth Generation

  DenseBox在训练时没有将完整的图片作为输入,而是截取包含目标以及足够背景的较大区域进行训练。在训练时,将截取的图片resize大\(240\times 240\),保证人脸位于截取区域的中心以及高度大约50像素,输出\(5\times 60\times 60\)的特征图。正样本区域是目标中心点半径为\(r_c\)内的圆,\(r_c\)与目标的大小相关,论文设置为0.3。如果截取的区域包含多个人脸,仅保留中心点在截取区域中心0.8到1.25范围内的人脸,其它均认为是负样本。

Model Design

  DenseBox的网络结构如图3所示,包含16个卷积层,前12个卷积层由VGG19初始化,网络也添加了一些不同层之间的特征融合,可以综合不同感受域的特征。

Multi-Task Training

  网络同时进行分类和位置预测,网络由两个任务共同学习,分类任务的损失值直接通过L2损失计算:

  位置预测任务的损失值也通过L2损失计算:

  由于论文采用了截取图片的方式进行训练,就会面临样本制作的问题,而DenseBox在正负样本制作以及学习上面做了一些工作:

  • Ignoring Gray Zone,灰色区域是处于正负点之间的过渡区域,不参与损失值的计算。对于一个非正样本点,如果其半径为2的范围内存在正样本点,则归入灰色区域。
  • Hard Negative Mining,在训练过程中,根据公式1将样本排序,取top 1%作为hard-negative,能够帮助网络重点学习这些难样本。
  • Loss with Mask,根据像素点的类型定义特征图的掩膜\(M(\hat{t}_i)\),并结合公式1、公式2以及掩膜输出最终的损失值:

  除了上面的几点,为了更好地挖掘负样本的作用,论文也通过随机裁剪训练集以生成足够的随机负样本。在训练时,正样本图片和随机负样本图片以1:1比例输入网络。此外,为了增强网络的鲁棒性,进行了一些数据增强:

  • 随机抖动每个截取的图片
  • 左右翻转
  • 水平移动25像素内
  • 随机缩放[0.8, 1.25]

Landmark Localization

  基于上面的设计,DenseBox也可用于标记点定位,仅需要在原有的基础上添加一些层用于预测标记即可。论文还发现,可通过融合标记点分支和分类分支进一步调整检测结果,具体做法如图4所示,调整输出的损失函数跟分类损失一样采用L2函数。此时,完整的网络损失变为:

Experiments


  人脸关键点上的性能对比。

  车辆关键点检测任务上的性能对比。

Conclusion


  DenseBox检测算法的设计十分超前,如今很多Anchor-free方法有其影子,如果当时不是比Faster R-CNN晚了一点出现,可能目标检测领域很早就开始往Anchor-free的方向发展了。





如果本文对你有帮助,麻烦点个赞或在看呗~

更多内容请关注 微信公众号【晓飞的算法工程笔记】

DenseBox:思想超前的早期Anchor-free研究 | CVPR 2015的更多相关文章

  1. 洞察行业领先者的前沿思想——第五届TOP100全球软件案例研究峰会精彩谢幕

    (第五届TOP100summit开幕式现场) 12月09日-12日,由msup主办的第五届TOP100全球软件案例研究峰会(以下简称TOP100summit)在北京国家会议中心举行,作为互联网行业最有 ...

  2. 核心思想:评价早期SaaS创业公司时,投资人在关注什么?(是否有机会发展成一个平台,长期的护城河)

    编者按: 当聊到早期项目时,人们经常会问投资人一个问题:“在评价早期 SaaS 创业公司时,投资人会关注什么——指标还是其他方面?” Nakul Mandan 作为 Lightspeed 风投机构的合 ...

  3. Java编程思想——第17章 容器深入研究 读书笔记(三)

    七.队列 排队,先进先出. 除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: ad ...

  4. Java编程思想——第17章 容器深入研究(two)

    六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add ...

  5. Java编程思想——第17章 容器深入研究 读书笔记(四)

    九.散列与散列码 HashMap使用equals()判断当前的键是否与表中存在的键相同. 正确的equals()方法需满足一下条件: 1)自反性.x.equals(x) 是true; 2)对称性.x. ...

  6. Java编程思想——第17章 容器深入研究 读书笔记(二)

    五.List的功能方法 排除Collection已包含的方法外还增加了 boolean addAll(int index, Collection<? extends E> c);从索引位置 ...

  7. Java编程思想——第17章 容器深入研究 读书笔记(一)

    这一章将学习散列机制是如何工作的,以及在使用散列容器时怎么样编写hashCode()和equals()方法. 一.容器分类 先上两张图 来概况完整的容器分类 再细说都为什么会有那些特性. 二.填充容器 ...

  8. Java编程思想——第17章 容器深入研究(一)

    这一章将学习散列机制是如何工作的,以及在使用散列容器时怎么样编写hashCode()和equals()方法. 一.容器分类 先上两张图 来概况完整的容器分类 再细说都为什么会有那些特性. 二.Coll ...

  9. GoogLeNet 之 Inception v1 v2 v3 v4

    论文地址 Inception V1 :Going Deeper with Convolutions Inception-v2 :Batch Normalization: Accelerating De ...

  10. tensorflow学习笔记——GoogLeNet

    GoogLeNet是谷歌(Google)研究出来的深度网络结构,为什么不叫“GoogleNet”,而叫“GoogLeNet”,据说是为了向“LeNet”致敬,因此取名为“GoogLeNet”,所以我们 ...

随机推荐

  1. 【Unity3D】协同程序

    1 简介 ​ 1)协程概念 ​ 协同程序(Coroutine)简称协程,是伴随主线程一起运行的程序片段,是一个能够暂停执行的函数,用于解决程序并行问题.协程是 C# 中的概念,由于 Unity3D 的 ...

  2. 两个数组的交集II

    两个数组的交集II 给定两个数组,编写一个函数来计算它们的交集. 示例 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 输入:nums1 = [4,9,5], ...

  3. Java Swing实现五子棋程序

    首先感谢08年MLDN出的这个培训视频,我把代码和文档整理了一下,发布出来给需要学习Swing的朋友. 源码地址: https://gitee.com/indexman/gobang 一.知识点准备: ...

  4. 【LeetCode二叉树#08】寻找树左下角的值(回溯机制X深度)

    找树左下角的值 力扣题目链接(opens new window) 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 示例 2: 思路 层序遍历 这个是很自然的思路,因为层序遍历可以避免对于& ...

  5. HAProxy端口资源耗尽的解决办法

    项目背景 系统使用HAProxy为mq和部分应用的负载均衡服务.近期,瞬时流量过大,导致出现连锁反应,HA开始波动. HAProxy版本:1.6.3 问题分析 心跳检测大量失败,项目状态极不稳定.观察 ...

  6. macOS搭建SonarQube

    目录 前言 准备环境 下载安装包 解压路径:/usr/local 创建数据库 修改配置文件 配置环境变量 启动SonarQube 扫描项目 项目报告介绍 总结 前言 初到新公司,接手8-10个java ...

  7. 【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容

    问题描述 在Azure App Service for Windows 中部署web项目时候,需要在wwwroot下设置web.config,对于不同语言的项目,web.config文件中的httpP ...

  8. 【Azure 事件中心】在Azure Function App中消费Event Hub数据,时常出现EventReceiveError

    问题描述 在Azure Function App中消费Event Hub数据,时常出现EventReceiveError:New receiver 'P3-00122a562-4fa4-7f3f-ad ...

  9. STM32标准库时钟树设置

    STM32的系统时钟大致可以分为以下流程 1.外部晶振提供HSE高速外部时钟信号 2.HSE经过PLL锁相环,倍频后得到PLL_CLK高速内部时钟信号 3.PLL_CLK经过分频后得到系统时钟SYSC ...

  10. STL-RBT_map,set模拟实现

    set #include"26RBT_container.h" namespace test { //set通过普通迭代器使用const迭代器实现限制key不能被修改 templa ...