CornerNet-Lite算法笔记
论文名称:CornerNet-Lite: Efficient Keypoint Based Object Detection
论文链接:https://arxiv.org/abs/1904.08900
代码链接:https://github.com/princeton-vl/CornerNet-Lite
简介
该论文与Cornernet论文作者相同,都是由普林斯顿大学的几位学者提出。截止2019年4月份,CornerNet-Lite 应该是目标检测(Object Detection)中速度和精度trade-off的最佳算法。在精度上超越原来的Cornernet(速度是原来的6倍),在实时检测器领域无论是速度还是精度都超越yolov3(34.4% AP at 34ms for CornerNet-Squeeze compared to 33.0% AP at 39ms for YOLOv3 on COCO)。
CornerNet-Lite是CornerNet的两种有效变体的组合:CornerNet-Saccade和CornerNet-Squeeze,前者使用注意机制(attention)消除了对图像的所有像素进行处理的需要,将cornernet单阶段检测器变为两阶段检测器,attention maps作用类似与fasterrcnn中的rpn但又有所不同,将roi区域crop下来进行第二阶段的精细检测,该网络与cornernet相比达到精度提升;后者引入新的紧凑骨干架构的CornerNet-Squeeze,主干网络实为hourglass network、mobilenet、squeezenet结构的变体,在实时检测器领域达到速度和精度的双重提升。具体比较可看下图figure1:
CornerNet-Saccade
人类视觉中的 Saccades(扫视运动)是指用于固定不同图像区域的一系列快速眼动。在目标检测算法中,我们广义地使用该术语来表示在推理期间选择性地裁剪(crop)和处理图像区域(顺序地或并行地,像素或特征)。
R-CNN系列论文中的saccades机制为single-type and single-object,也就是产生proposal的时候为单类型(前景类)单目标(每个proposal中仅含一个物体或没有),AutoFocus论文中的saccades机制为multi-type and mixed(产生多种类型的crop区域)
CornerNet-Saccade中的 saccades是single type and multi-object,也就是通过attention map找到合适大小的前景区域,然后crop出来作为下一阶段的精检图片。CornerNet-Saccade 检测图像中可能的目标位置周围的小区域内的目标。它使用缩小后的完整图像来预测注意力图和粗边界框;两者都提出可能的对象位置,然后,CornerNet-Saccade通过检查以高分辨率为中心的区域来检测目标。它还可以通过控制每个图像处理的较大目标位置数来提高效率。具体流程如下图figure2所示,主要分为两个阶段估计目标位置和检测目标:
估计目标位置(Estimating Object Locations)
CornerNet-Saccade第一阶段通过downsized图片预测attention maps和coarse bounding box,以获得图片中物体的位置和粗略尺寸,这种降采样方式利于减少推理时间和便于上下文信息获取。
流程细节为首先将原始图片缩小到两种尺寸:长边为255或192像素,192填充0像素到255,然后并行处理。经过hourglass network(本文采用hourglass-54,由3个hourglass module组成),在hourglass-54的上采样层(具体在哪个hourglass module的上采样层论文中在3.5 Backbone Network部分有所提及,也就是最后一个module的三个上采样层,具体有待后期源码解析)预测3个attention maps(分别接一个3 × 3 Conv-ReLU module和一个1 × 1 Conv-Sigmoid module),分别用于小(小于32)中(32-96之间)大(大于96)物体预测,预测不同大小尺寸便于后面crop的时候控制尺寸(finer尺度预测小物体,coarser尺度预测大物体),训练时使用α = 2的focal loss,设置gt bbox的中点为positive,bbox其余为负样本,测试时大于阈值t=0.3的生成物体中心位置。
检测目标(Detecting Objects)
Crop区域的获取:
CornerNet-Saccade第二阶段为精检测第一阶段在原图(高分辨率下)crop区域的目标。
从Attention maps获取到的中心位置(粗略),可以根据物体尺寸选择放大倍数(小物体放大更多),ss>sm>sl,ss=4,sm=2,sl=1,在每个可能位置(x,y),放大downsized image si倍,i根据物体大小从{s,m,l}中选择,最后将此时的downsized image映射回原图,以(x,y)为中心点取255×255大小为crop区域。
从coarse bounding box获取的位置可以通过边界框尺寸决定放大尺寸,比如边界框的长边在放大后小物体应该达到24,中物体为64,大物体为192。
处理效率提升:1、利用gpu批量生成区域2、原图保存在gpu中,并在gpu中进行resize和crop
最终检测框生成以及冗余框消除:
最终的检测框通过CornerNet-Saccade第二阶段的角点检测机制生成,与cornernet中完全一致(不明确的小伙伴可以查看我另一篇cornernet算法笔记),最后也是通过预测crop区域的corner heatmaps, embeddings and offsets,merge后坐标映射回原图。
算法最后采用soft-nms消除冗余框,soft-nms无法消除crop区域中与边界接触的检测框,如下图figure3(这种检测框框出来的物体是不完整的,并与完整检测框iou较小,因此需要手工消除),可以在程序中直接删除该部分框。
其他:
精度和效率权衡:
根据分数排列第一阶段获取到的物体位置,取前Kmax个区域送入第二阶段精检测网络
抑制冗余目标位置:
当物体接近时,如下图figure4中的红点和蓝点所代表的人,会生成两个crop区域(红框和蓝框),作者通过类nms处理此类情况,首先通过分数排序位置,然后取分数最大值crop区域,消除与该区域iou较大的区域。
骨干网络:
本文提出由3个hourglass module组成的Hourglass-54作为主干网络,相比cornernet的hourglass-104主干网络(2个hourglass module)更轻量。下采样步长为2,在每个下采样层,跳连接,上采样层都有一个残差模块,每个hourglass module在下采样部分缩小三倍尺寸同时增加通道数(384,384,512),module中部的512通道也含有一个残差模块。
训练细节:
在4块1080ti上使用batch size为48进行训练,超参与cornernet相同,loss function优化策略也是adam。
CornerNet-Squeeze
与专注于subset of the pixels以减少处理量的CornerNet-Saccade相比,而CornerNet-Squeeze 探索了一种减少每像素处理量的替代方法。在CornerNet中,大部分计算资源都花在了Hourglass-104上。Hourglass-104 由残差块构成,其由两个3×3卷积层和跳连接(skip connection)组成。尽管Hourglass-104实现了很强的性能,但在参数数量和推理时间方面却很耗时。为了降低Hourglass-104的复杂性,本文将来自SqueezeNet和MobileNets 的想法融入到轻量级hourglass架构中。
主要操作是:受SqueezeNet启发,CornerNet-Squeeze将 residual block 替换为SqueezeNet中的 Fire module,受MobileNet启发,CornerNet-Squeeze将第二层的3x3标准卷积替换为3x3深度可分离卷积(depth-wise separable convolution)
具体如下表table1所示:(由于时间关系,这里对Fire module和depth-wise separable convolution不做详述,可自行查找SqueezeNet和MobileNet相关论文,CornerNet-Squeeze网络架构细节以及参数计算量推算也不展开,博主可能将在后续的源码解析中进行分析)
训练细节:
超参设置与cornernet相同,由于参数量减少,可以增大训练batch size,batch size of 55 on four 1080Ti GPUs (13 images on the master GPU and 14 images per GPU for the rest of the GPUs).
实验
开源代码是基于PyToch1.0.0,在COCO数据集上进行测试。测试硬件环境为:1080ti GPU + Intel Core i7-7700k CPU。
One-stage 算法性能比较如上图figure6,其中log scale博主认为是不同检测器的速度与精度权衡条件,比如CornerNet-Saccade可以为Kmax(crop区域数)
上表table2对比CornerNet和CornerNet-Saccade训练效率,可以看出在gpu的内存使用上节省了将近60%。
上表table3表明attention maps对于预测准确性的重要性,可以看出将attention maps用gt替代,ap值得到很大提升。
上表table4为表明主干网络hourglass-54相比hourglass-104的性能提升,以及它对于attention maps预测的意义。
上表table5是CornerNet-Squeeze与yolov3对比,可以看出无论是python还是效率更高的C版本yolo都弱于CornerNet-Squeeze
上表table6为CornerNet-Squeeze的消融实验。
上表table7中证明无法将本论文中的两种网络机制联合,原因是CornerNet-Squeeze没有足够的能力提供对CornerNet-Saccade贡献巨大的attention maps的预测。
上表table8表明本文中的两种网络架构,CornerNet-Squeeze在精度和速度方面对标YOLOv3完胜,CornerNet-Saccade主要在精度方面对标CornerNet完胜(速度意义不大)。
总结
本论文主要提出两种CornerNet的改进方法,并在速度和精度方面取得较大意义,分别对标之前的CornerNet和YOLOv3(不熟悉CornerNet的同学无法理解本篇博文,建议查看博主另一篇CornerNet算法笔记),与此同时的另一篇基于CornerNet关键点的arXiv论文(2019.04)Centernet(https://arxiv.org/abs/1904.08189)提出Keypoint Triplets思想也对Cornernet进行优化,达到目前单阶段目标检测器最高精度(47.0%)。接下来我将对该论文进行总结。
CornerNet-Lite算法笔记的更多相关文章
- 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)
Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...
- 算法笔记--数位dp
算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...
- 算法笔记--lca倍增算法
算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...
- 算法笔记--STL中的各种遍历及查找(待增)
算法笔记 map: map<string,int> m; map<string,int>::iterator it;//auto it it = m.begin(); whil ...
- 算法笔记--priority_queue
算法笔记 priority_queue<int>que;//默认大顶堆 或者写作:priority_queue<int,vector<int>,less<int&g ...
- 算法笔记--sg函数详解及其模板
算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...
- 算法笔记——C/C++语言基础篇(已完结)
开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...
- 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...
- 算法笔记(c++)--回文
算法笔记(c++)--回文 #include<iostream> #include<algorithm> #include<vector> using namesp ...
随机推荐
- MySQL的分表与分区
MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法. 什么是MySQL分表 从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变.MySQL分表分为垂直分表和 ...
- css实现单行、多行文本超出显示省略号
前言:项目中我们经常遇到这种需求,需要对单行.多行文本超出显示为省略号.这篇文章主要总结了小编解决此问题的方法,有不足之处欢迎大家指正. 单行文本省略 .ellipsis-line { border: ...
- Hadoop-No.9之表和Region
影响性能与数据分布的一个因素是HBase中表的数量以及每个表的Region的数量.如果分配的不合理,集群一个节点活多个节点的负载会出现显著的不均衡. 其中比较注意的几点: - 每个节点包含一个Regi ...
- 访问node后端接口示例(入门)
一.基础安装参考我的另一篇随笔 https://www.cnblogs.com/zhuxingqing/p/11526558.html 另在之前的基础上引入了jquery,方便使用ajax 二.前端代 ...
- Spring 初探(二) AOP 图集
Spring AOP属于第二代AOP.采用Java作为AOP的实现语言(AOL),采用动态代理机制和字节码生成技术实现. 代理设计模式 ISubject 对被访问者或者被访问资源的抽象,某些场景下不使 ...
- 6.Servlet、Filter过滤器以及监听器
Servlet 是运行在Web服务器端的Java程序,它使用Java语言编写,与Java程序的区别是Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持,在Jav ...
- css基础(浮动 清除f浮动)
文档流(标准流) 1.元素自上而下,自左而右 2.块元素,独占一行,行内元素在一行上显示,碰到父级元素的边框换行 浮动left 浮动的框可以向左或是向右移动,直到它的边缘碰到包含框或是另个浮动框 ...
- [CSP-S模拟测试]:D(暴力+剪枝)
题目传送门(内部题47) 输入格式 第一行一个正整数$n$.第二行$n$个正整数,表示序列$A_i$. 输出格式 一行一个正整数,表示答案. 样例 样例输入: 530 60 20 20 20 样例输出 ...
- OkHttp3 拦截器源码分析
OkHttp 拦截器流程源码分析 在这篇博客 OkHttp3 拦截器(Interceptor) ,我们已经介绍了拦截器的作用,拦截器是 OkHttp 提供的对 Http 请求和响应进行统一处理的强大机 ...
- springboot中如何启动tomcat
springboot启动时,会自动识别出当前环境是否是web环境还是非web环境. 默认的web环境的context(DEFAULT_WEB_CONTEXT_CLASS):org.springfram ...