CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020
论文对CornerNet进行了性能优化,提出了CornerNet-Saccade和CornerNet-Squeeze两个优化的CornerNet变种,优化的手段具有很高的针对性和局限性,不过依然有很多可以学习的地方
来源:晓飞的算法工程笔记 公众号
论文: CornerNet-Lite: Efficient Keypoint-BasedObject Detection
Introduction
CornerNet作为Keypoint-based目标检测算法中的经典方法,虽然有着不错的准确率,但其推理很慢,大约需要1.1s/张。虽然可以简单地缩小输入图片的尺寸来加速推理,但这会极大地降低其准确率,性能比YOLOv3要差很多。为此,论文提出了两种轻量级的CornerNet变种:
- CornerNet-Saccade:该变种主要通过降低需要处理的像素数量来达到加速的目的,首先通过缩小的图片来获取初步的目标位置,然后根据目标位置截取附近小范围的图片区域来进行目标的检测,准确率和速度分别可达到43.2%AP以及190ms/张。
- CornerNet-Squeeze:该变种主要通过降低每个像素的处理次数来达到加速的目的,将SqueezeNet和MobileNets的思想融入hourglass提出新的主干网络,准确率和速度分别可达到34.4%AP以及30ms/张。
论文也尝试了将两种变种进行结合,但发现性能反而更差了,主要由于CornerNet-Saccade需要强大的主干网络来生成足够准确的特征图,而CornerNet-Squeeze则是减弱了主干网络的表达能力进行加速,所以两者的结合没有达到更好的效果。
CornerNet-Saccade
CornerNet-Saccade在可能出现目标的位置的小区域内进行目标检测,首先通过缩小的完整图片预测attention特征图,获得初步的预测框位置以及尺寸,然后在高分辨率图片上截取以该位置为中心的图片区域进行目标检测。
Estimating Object Locations
CornerNet-Saccade首先获取可能出现目标的初步位置及其尺寸:
- 将输入的图片缩小至长边为255像素和192像素两种尺寸,小图进行零填充,使其能同时输入到网络中进行计算。
- 对于缩小的图片,预测3个attention特征图,分别用于小目标(长边<32像素)、中目标(32像素<=长边<=96像素)和大目标(长边>96像素)的位置预测,这样的区分能够帮助判断是否需要对其位置区域进行放大,对于小目标需要放大更大,下一部分会提到。
- Attention特征图来源于hourglass上采样部分的不同模块,尺寸较大的模块特征图输出用于更小的目标检测(主干网络结构后面会介绍),对每个模块输出的特征图使用\(3\times 3\)Conv-ReLU模块接\(1\times 1\)Conv-Sigmoid模块生成Attention特征图。
在测试阶段,我们仅处理置信度大于阈值\(t=0.3\)预测位置,而在训练阶段,将GT的中心在对应特征图上的位置设为正样本,其它设为负样本,使用\(\alpha=2\)的focal loss进行训练。
Detecting Objects
基于初步的预测框位置和尺寸,CornerNet-Saccade对缩小的原图进行放大后截取以该位置为中心的\(255\times 255\)的区域进行目标检测。放大主要是为了保证目标足够清晰,根据预测框的初步尺寸对缩小的原图先进行放大,放大比例为\(s_s=4>s_m=2>s_l=1\)。后续对截取区域的检测使用同样的hourglass网络,最后合并所有的检测结果进行Soft-NMS过滤。检测网络的训练和预测方法跟原版CornerNet一样,结合角点热图、embeddings向量以及偏移值。
这里有一些如图3所示的特殊情况需要特别处理:
- 如果检测结果出现在截取区域的边缘,需要将其去掉,因为该截图区域很可能至包含了目标的一部分。
- 如果目标挨得很近,两者的截取区域会高度重叠,网络很可能产生高度重叠的重复结果。为此,采用类似NMS方法来处理各尺寸预测结果中过近的预测位置,从而提高效率。
另外,为了让检测过程更加高效,论文也进行了以下细节的实现:
- 批量进行截取区域的获取
- 将原图保存在GPU内存中,并且直接在GPU进行原图的放大以及截取
- 批量进行截取区域的检测
Backbone Network
论文设计新的主干网络Hourglass-54,比原CornerNet使用的Hourglass-104包含更少参数且层数更少。Hourglass-54总层数为54层,包含3个hourglass模块,在第一个模块前先下采样两次。每个模块下采样三次并逐步增加维度(384, 384, 512),每个模块中间包含一个512维的残差模块,每个上采样层后面接一个残差模块。
CornerNet-Squeeze
在CornerNet中,大多数的计算时间花在主干网络Hourglass-104的推理。为此,CornerNet-Squeeze结合SqueezeNet和MobileNet来减少Hourglass-104的复杂度,设计了一个新的轻量级hourglass网络。
SqueezeNet的核心在于fire模块,首先通过包含\(1\times 1\)卷积的squeeze层降低输入特征的维度,然后通过包含\(1\times 1\)卷积和\(3\times 3\)卷积的expand层提取特征。MobileNet则采用\(3\times 3\)深度分离卷积替换标准的\(3\times 3\)卷积,能够有效地减少网络的参数。
新的模块如表1所示,除了替换残差模块,新主干网络还做了以下的修改:
- 为了降低hourglass模块的最大特征图,在第一个hourglass模块前增加一个下采样模层。对应地,去除每个hourglass模块的一个下采样层。
- 将预测模块的\(3\times 3\)卷积替换为\(1\times 1\)卷积。
- 将最近的相邻上采样层替换为\(4\times 4\)的反卷积。
Experiments
CornerNet-Saccade对比实验。
CornerNet-Squeeze对比实验。
目标检测的性能对比。
Conclusion
论文对CornerNet进行了性能优化,提出了CornerNet-Saccade和CornerNet-Squeeze两个优化的CornerNet变种,优化的手段具有很高的针对性和局限性,不过依然有很多可以学习的地方。
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】
CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020的更多相关文章
- SSH服务端配置、优化加速、安全防护
CentOS7自带的SSH服务是OpenSSH中的一个独立守护进程SSHD.由于使用telnet在网络中是明文传输所以用其管理服务器是非常不安全的不安全,SSH协议族可以用来对服务器的管理以及在计算机 ...
- Gradient Boosting, Decision Trees and XGBoost with CUDA ——GPU加速5-6倍
xgboost的可以参考:https://xgboost.readthedocs.io/en/latest/gpu/index.html 整体看加速5-6倍的样子. Gradient Boosting ...
- PHP优化加速之Opcache使用总结
PHP优化加速之Opcache使用总结: Opcache是一种通过将解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码,从 ...
- 如何将Numpy加速700倍?用 CuPy 呀
如何将Numpy加速700倍?用 CuPy 呀 作为 Python 语言的一个扩展程序库,Numpy 支持大量的维度数组与矩阵运算,为 Python 社区带来了很多帮助.借助于 Numpy,数据科学家 ...
- PHP使用Zend Opcache之优化加速和缓存清理总结
简介 字节码缓存不是php的新特性,有很多独立性的扩展可以实现缓存,比如PHP Cache(APC),eAccelerator,ionCube和XCache等等.但是到目前为止,这些独立的扩展并没有集 ...
- Hadoop如何将TB级大文件的上传性能优化上百倍?
这篇文章,我们来看看,Hadoop的HDFS分布式文件系统的文件上传的性能优化. 首先,我们还是通过一张图来回顾一下文件上传的大概的原理. 由上图所示,文件上传的原理,其实说出来也简单. 比如有个TB ...
- hdu-4471-Homework-矩阵快速幂+优化加速
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4471 题目意思: 求f(n). 当n为特殊点nk时 解题思路: 当x不为特殊点时,直接用基本的矩阵快 ...
- 去重算法,简单粗暴&优化版
Remove Repeat 一.去重原理 1.进行排序 2.判断是否满足 '两个字符串相同' 的条件,相同则累加重复次数,并使用continue继续下一次循环 3.当条件不满足时,将该字符串和累计数加 ...
- python 多协程异步IO爬取网页加速3倍。
from urllib import request import gevent,time from gevent import monkey#该模块让当前程序所有io操作单独标记,进行异步操作. m ...
- Gradient Centralization: 简单的梯度中心化,一行代码加速训练并提升泛化能力 | ECCV 2020 Oral
梯度中心化GC对权值梯度进行零均值化,能够使得网络的训练更加稳定,并且能提高网络的泛化能力,算法思路简单,论文的理论分析十分充分,能够很好地解释GC的作用原理 来源:晓飞的算法工程笔记 公众号 论 ...
随机推荐
- Linux下SQLPLUS替代工具rlwrap安装使用
rlwrap工具可以解决linux下sqlplus 提供浏览历史命令行的功能,和删除先前输入错误的字母等问题 1.安装 需要readline包 这个安装光盘就有 [root@asm RedHat]# ...
- Java集合框架学习(六) LinkedList详解
LinkedList介绍 ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同. LinkedList是采用链表的方式来实现 ...
- C++ 时间复杂度
看到网上一些资料的案例不全,所以自己开个来复习. O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<-<O(2^n)< ...
- 【Android逆向】某小说网站签名破解
1. 豌豆荚下载v5.4的版本 2. 参考前面两篇文章进行反编译和重打包后,安装到手机发现会有验签失败的报错 抓取log 03-29 16:15:37.545 25910 26539 D KM-NAT ...
- BUUCTF [强网杯 2019]随便注 1
1. 拿到题目,先输入一个1'试一下是否存在注入点 报错 error 1064 : You have an error in your SQL syntax; check the manual tha ...
- Lua学习笔记之迭代器、table、模块和包、元表和协程
迭代器 迭代器是一种对象,它能够来遍历标准库模板容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址,在Lua中迭代器是一种支持指针类型的结构,他可以遍历集合的每一个元素. 泛型for迭代器 泛 ...
- 【Azure 服务总线】向服务总线发送消息时,返回错误代码Error code : 50009
问题描述 使用Java SDK向服务总线(Service Bus)发送消息时,返回这个错误: org.springframework.jms.UncategorizedJmsException: Un ...
- 【Azure 应用服务】Python3.7项目在引用pandas 模块后,部署报错
问题描述 参考"快速入门:在 Linux 上的 Azure 应用服务中创建 Python 应用" 文档,在App Service For Linux环境中部署Python应用,在添 ...
- 【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
问题描述 在Azure活动目录中的应用注册,给应用添加API权限时,SecurityEvents.Read.All和IdentityRiskEvent两个权限,在Microsoft graph中找不到 ...
- 基于 Nebula Graph 构建图学习能力
本文首发于 Nebula Graph Community 公众号 经常看技术文章的小伙伴可能会留意到除了正在阅读的那篇文章,在文章页面的正文下方或者右侧区域会有若干同主题.同作者的文章等你阅读:经常逛 ...