当前位置: 首页 > 编程日记 > 正文

ATSS : 目标检测的自适应正负anchor选择,很扎实的trick | CVPR 2020


作者 | VincentLee

来源 | 晓飞的算法工程笔记

  • 论文地址:

  • https://arxiv.org/abs/1912.02424

  • 代码地址:

  • https://github.com/sfzhang15/ATSS

在仔细比对了anchor-based和anchor-free目标检测方法后,结合实验结果,论文认为两者的性能差异主要来源于正负样本的定义,假如训练过程中使用相同的正负样本,两者的最终性能将会相差无几。为此,论文提出ATSS( Adaptive Training Sample Selection)方法,基于GT的相关统计特征自动选择正负样本,能够消除anchor-based和anchor-free算法间的性能差异。

论文的主要贡献如下:

  • 指出anchor-free和anchor-based方法的根本差异主要来源于正负样本的选择

  • 提出ATSS( Adaptive Training Sample Selection)方法来根据对象的统计特征自动选择正负样本

  • 证明每个位置设定多个anchor是无用的操作

  • 不引入其它额外的开销,在MS COCO上达到SOTA


Difference Analysis of Anchor-based and Anchor-free Detection

论文选取anchor-based方法RetinaNet和anchor-free方法FCOS进行对比,主要对比正负样本定义和回归开始状态的差异,将RetinaNet的anchor数改为1降低差异性,方便与FCOS比较,后续会测试anchor数带来的作用。

Inconsistency Removal

由于FCOS加入了很多trick,这里将RetinaNet与其进行对齐,包括GroupNorm、GIoU loss、限制正样本必须在GT内、Centerness branch以及添加可学习的标量控制FPN的各层的尺寸。结果如表1,最终的RetinaNet仍然与FCOS有些许的性能差异,但在实现方法上已经基本相同了。

Essential Difference

在经过上面的对齐后,仅剩两个差异的地方:(i) 分类分支上的正负样本定义 (ii) 回归分支上的bbox精调初始状态(start from anchor box or anchor point)。

  • Classification

RetinaNet使用IoU阈值(,)来区分正负anchor bbox,处于中间的全部忽略。FCOS使用空间尺寸和尺寸限制来区分正负anchor point,正样本首先必须在GT box内,其次需要是GT尺寸对应的层,其余均为负样本。

  • Regression

RetinaNet预测4个偏移值对anchor box进行调整输出,而FCOS则预测4个相对于anchor point值对anchor box进行调整输出。

  • Conclusion

对上面的差异进行交叉实验,发现相同的正负样本定义下的RetinaNet和FCOS性能几乎一样,不同的定义方法性能差异较大,而回归初始状态对性能影响不大。所以,基本可以确定正负样本的确定方法是影响性能的重要一环。

Adaptive Training Sample Selection

Description

论文提出ATSS方法,该方法根据目标的相关统计特征自动进行正负样本的选择,具体逻辑如算法1所示。对于每个GT box ,首先在每个特征层找到中心点最近的个候选anchor boxes(非预测结果),计算候选box与GT间的IoU ,计算IoU的均值和标准差,得到IoU阈值,最后选择阈值大于的box作为最后的输出。如果anchor box对应多个GT,则选择IoU最大的GT。

ATSS的思想主要考虑了下面几个方向:

  • Selecting candidates based on the center distance between anchor box and object

在RetinaNet中,anchor box与GT中心点越近一般IoU越高,而在FCOS中,中心点越近一般预测的质量越高

  • Using the sum of mean and standard deviation as the IoU threshold

均值表示预设的anchor与GT的匹配程度,均值高则应当提高阈值来调整正样本,均值低则应当降低阈值来调整正样本。标准差表示适合GT的FPN层数,标准差高则表示高质量的anchor box集中在一个层中,应将阈值加上标准差来过滤其他层的anchor box,低则表示多个层都适合该GT,将阈值加上标准差来选择合适的层的anchor box,均值和标准差结合作为IoU阈值能够很好地自动选择对应的特征层上合适的anchor box。

  • Limiting the positive samples’ center to object

若anchor box的中心点不在GT区域内,则其会使用非GT区域的特征进行预测,这不利于训练,应该排除。

  • Maintaining fairness between different objects

根据统计原理,大约16%的anchor box会落在,尽管候选框的IoU不是标准正态分布,但统计下来每个GT大约有个正样本,与其大小和长宽比无关,而RetinaNet和FCOS则是偏向大目标有更多的正样本,导致训练不公平。

  • Keeping almost hyperparameter-free

ATSS仅有一个超参数,后面的使用会表明ATSS的性能对不敏感,所以ATSS几乎是hyperparameter-free的。

Verification

将ATSS应用到RetinaNet和FCOS上测试效果:

  • 将RetinaNet中的正负样本替换为ATSS,AP提升了2.9%,这样的性能提升几乎是没有任何额外消耗的

  • 在FCOS上的应用主要用两种:lite版本采用ATSS的思想,从选取GT内的anchor point改为选取每层离GT最近的top 个候选anchor point,提升了0.8%AP;full版本将FCOS的anchor point改为长宽为的anchor box来根据ATSS选择正负样本,但仍然使用原始的回归方法,提升了1.4%AP。两种方法找到的anchor point在空间位置上大致相同,但是在FPN层上的选择不太一样。从结果来看,自适应的选择方法比固定的方法更有效

Analysis

参数k在区间几乎是一样的,过大的设置会到导致过多的低质量候选anchor,而过小的设置则会导致过少的正样本,而且统计结果也不稳定。总体而言,参数是相对鲁棒的,可以认为ATSS是hyperparameter-free。

在FCOS的full版本中使用了的anchor box,论文对不同的尺寸进行了对比,如表5所示,也在基础上对不同的长宽比进行了对比,如表6所示。从结果来看,性能几乎对尺寸和长宽比无关,相对鲁棒。

Discussion

前面的RetinaNet实验只用了一个anchor box,论文补充测试了不同anchor数下的性能,实验中的Imprs为表1中的提升手段。从结果来看,在每个位置设定多个anchor box是无用的操作,关键在于选择合适的正样本。

Comparison

实现的是FCOS版本的ATSS,在相同的主干网络下,ATSS方法能够大幅增加准确率,十分有效。

结论

论文指出one-stage anchor-based和center-based anchor-free检测算法间的差异主要来自于正负样本的选择,基于此提出ATSS(Adaptive Training Sample Selection)方法,该方法能够自动根据GT的相关统计特征选择合适的anchor box作为正样本,在不带来额外计算量和参数的情况下,能够大幅提升模型的性能,十分有用。

【end】◆精彩推荐◆2020 AI 开发者万人大会将于6月26日通过线上直播形式,让开发者们一站式学习了解当下 AI 的前沿技术研究、核心技术与应用以及企业案例的实践经验,同时还可以在线参加精彩多样的开发者沙龙与编程项目。参与前瞻系列活动、在线直播互动,不仅可以与上万名开发者们一起交流,还有机会赢取直播专属好礼,与技术大咖连麦。今日福利:评论区留言入选,都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。快来动动手指,写下你想说的话吧~
推荐阅读百万人学AI:CSDN重磅共建人工智能技术新生态对标Pytorch,清华团队推出自研AI框架“计图”医疗保健、零售、金融、制造业……一文带你看懂大数据对工业领域的影响!如何开发日均吸引100万活跃用户的DApp?先收藏再看!Kubernetes这么火你还不知道是啥?赶紧来看看吧~微信iOS版正式支持深色模式;谷歌宣布彻底取消I/O开发者大会;Visual Studio 2019 16.5发布
你点的每个“在看”,我都认真当成了AI

相关文章:

GCC编译选项--创建与使用库

系统函数库使用 linux系统函数库位于/usr/lib和/lib目录下 #include <math.h> #cc test.c -lm -o test 动态库创建 1).编译时指定-fPIC 通知gcc产生可以重定位的与位置无关的目标代码 2).链接时指定-shared 使gcc编译器生成动态链接库 动态库使用 通过设置环境…

不错的×××实验

(virtual private network 虚拟专网)&#xff0c;利用公用网络&#xff0c;按照相同的策略和规则&#xff0c;建立内部私有连接。 广泛的讲&#xff0c;***体系结构分为&#xff1a;站点到站点的***和远程访问*** 站点到站点的***&#xff1a;在这种情况下&#xff0c;同一个机…

达观数据于敬:个性化推荐系统实践

达观数据于敬&#xff1a;个性化推荐系统实践 在DT(data technology)时代&#xff0c;网上购物、观看视频、聆听音乐、阅读新闻等各个领域无不充斥着各种推荐&#xff0c;个性化推荐已经完全融入人们的日常生活当中。个性化推荐根据用户的历史行为数据进行深层兴趣点挖掘&#…

C语言Free时报错HEAP CORRUPTION DETECTED

char *k1; k1 (char *) malloc(4*sizeof(char)); v1 (char *) malloc(4*sizeof(char)); strcpy(k1,"abcd"); free(k1); 在linux下不会报错&#xff0c;但是在VC环境会报错&#xff1a;HEAP CORRUPTION DETECTED 出现这个错误的原因一般都是操作new申请的内存溢…

DivCSS网页布局中CSS无效的十个常见原因

在学习DivCSS网页布局的知识&#xff0c;可是W3C validation有时难以操作&#xff0c;但用它你可以查看由版面设计引起的差错。验证程序抛出大量差错和警告&#xff0c;说明你的XHTML尚未完善&#xff0c;可能无法在不同浏览器上保持一致功能。下面十个细微的失效问题难住了大批…

如何创建计算机视觉场景训练数据

作者 | 刘明宽 数据科学部门负责人&#xff0c;澳鹏&#xff08;Appen&#xff09;美国 曾任eBay首席研究科学家&#xff08;数据科学总监&#xff09;对于一些精度要求不太高&#xff0c;或者不太复杂的计算机视觉应用场景&#xff0c;利用一些现有的开源数据集如ImageNet/Coc…

express中的bin/www文件详解

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env node 表明是node执行文件,在做repl工具时候的会用的 "#!"是标识符/usr/bin是环境变量的绝对路径/env 如果是直接#!/usr/bin node ,则执行这个文件的时候,会从/usr/bin中找node命令,如果没有,则…

深度分析typedef--定义自己的数据类型

最近在看redis源码的时候看到Ae.h的时候看到如下源码: /* Types and data structures */ typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask); typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *client…

Go对Python产生的冲击

作者 | yuliao来源 | 懒编程&#xff08;ID: hackpython&#xff09;Go 的流行让以 Python 为主流语言的开发者&#xff08;比如我&#xff09;产生了一定的危机感。上一次有这种危机感还是做 Android 开发的时候&#xff0c;当时用 Java 做 Android 开发&#xff0c;Google 强…

更新ADT到Android L的方法

android ADT无法更新到20&#xff1f; 哈哈&#xff0c;有办法&#xff0c;windows 进入host 写入例如以下所有&#xff0c;是的所有。然后在到sdk manager中方可更新 #Google Services START #Googleapis↓ 61.19.1.54 mt0.googleapis.com 61.19.1.54 mt1.googleapis.com 61…

php.ini安全配置详细解释

PHP本身再老版本有一些问题&#xff0c;比如在 php4.3.10和php5.0.3以前有一些比较严重的bug&#xff0c;所以推荐使用新版。另外&#xff0c;目前闹的轰轰烈烈的SQL   Injection也是在PHP上有很多利用方式&#xff0c;所以要保证  安全&#xff0c;PHP代码编写是一方面&am…

5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?

作者 | 马超来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;3月19日&#xff0c;默安科技CTO魏兴国发微博称&#xff0c;微博数据泄露了不少用户的手机号&#xff0c;当中涉及不少微博认证的明星和企业家。亦有网友在他的微博评论区表示&#xff1a;“有超过5.38亿…

GDB使用总结

经典编译参数&#xff1a; # cc -g -o xx xx.c 或者 # cc xx.c -g -o xx 如果调试不是进程总的程序 可以直接 #gdb 程序名即可 # i 打印行号 #break 行号 #r 重新开始调试 利用set args 命令就可以修改发送给程序的参数&#xff0c;而使用show args 命令…

Spring概述

Spring 是什么Spring是一个开源的轻量级Java SE&#xff08;Java 标准版本号&#xff09;/Java EE&#xff08;Java 企业版本号&#xff09;开发应用框架&#xff0c;其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中&#xf…

Nginx模块开发

最简单的Nginx模块开发&#xff0c;虽然简单&#xff0c;但是是最重要的第一步。 主要是看&#xff1a;http://blog.codinglabs.org/articles/intro-of-nginx-module-development.html 1.准备模块文件 在nginx-1.4.2安装目录新建一个自己的模块的目录 # mkdir myModule 再新…

程序猿惯用口头禅与内心真实 OS,快来看看你中招没?

作者 | 他二哥来源 | 腾讯技术工程滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS【end】◆精彩推荐◆推荐阅读百万人学AI&#xff1a;CSDN…

每日学习笔记(1)

1&#xff0c;python2.4不支持下面这种异常处理语法 try: except: finally: 只有2.5以上才行&#xff0c;为此只能改成下述写法,damn fuck python 2.4... try: try: except: finally: 2,python实现单例模式的一种方法: class MyCl…

linux svn使用方法

1 安装 svn sudo apt-get install subversion 2 查看svn版本号 svn version 3 下载源代码 下面以举例 svn co svn://192.168.5.88/ erppurchase -username hming -password hming /var/www/test 4更新代码 cd /var/www/test/ svn up 当前目录下所有的文件都更新 svn up -r 200…

64% 的企业未实现智能化,5成公司算法工程师团队规模小于 10人,AI 工程师的机遇在哪里?...

整理 | 夕颜责编 | 唐小引出品 | CSDN&#xff08;ID:CSDNnews&#xff09;当前&#xff0c;人工智能技术已应用于各行各业&#xff0c;落地成为大家关注的核心问题。在经历了 2019 年的行业低谷期之后&#xff0c;无论是行业巨头还是新兴独角兽&#xff0c;都开始审视 AI 能够…

指针的本质--u_char*指针在Nginx源码中的应用及原因

GNU下的void *p相当于char *p 也就是移动一个字节。 下面的代码是Nginx中内存池的结构体代码&#xff0c;其中last和end是表示内存地址的。 last是u_char*指针类型也就是unsigned char typedef struct {u_char *last;u_char *end;ngx_pool_t …

原来这就是乡下人

来源&#xff1a;http://user.qzone.qq.com/313998514/blog/1215427152#!app2&viaQZ.HashRefresh&poscatalog_private 今天早晨一早就去做家教了, 原因是我的学生要去香港去学习七天, 明天就要走了, 所以为了赶时间, 今天的课就提到早晨来上. 这些都很正常, 早晨6:17我…

如何查看Apache的连接数和当前连接数

查看Apache的连接数和当前的连接数以及IP访问次数&#xff0c;下面有个不错的示例&#xff0c;大家可以参考下&#xff0c;希望对大家解决问题有所帮助查看了连接数和当前的连接数 复制代码 代码如下:netstat -ant | grep $ip:80 | wc -l netstat -ant | grep $ip:80 | grep ES…

linux环境insight安装与使用

去官网下载&#xff1a;ftp://sourceware.org/pub/insight/releases 安装步骤 # wget ftp://sourceware.org/pub/insight/releases/insight-6.8-1a.tar.bz2 # tar xvf insight-6.8-1a.tar.bz2 # cd ./ # ./configure --prefix/usr/local/insight # make 注意第一次make…

磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷

磁盘加密软件TrueCrypt知识大全&#xff08;二&#xff09;之创建文件型加密卷 1、在“TrueCrypt”窗口中选择“创建加密卷&#xff08;C&#xff09;”按钮&#xff0c;在向导中选择“创建文件型加密卷”&#xff0c;然后一直下一步。 2、在TrueCrypt加密卷创建向导中单击“选…

你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!...

作者 | Anzhela Sychyk译者 | 风车云马 责编 | 徐威龙出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;如今有关人工智能的炒作多得令人眼花缭乱。各个行业都极力采用这种技术&#xff0c;以获得相对于其他企业的竞争优势——降低运营成本&#xff0c;并改善客户体验。…

struts2学习笔记--线程安全问题小结

在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行&#xff0c;而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的&#xff0c;而且其他的变量的值也和预期的是一样的&#x…

函数指针--Nginx和Redis中两种回调函数写法

1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connection_handler_pt)(int c); //仿redis风格 typedef void redisCommandProc(int c); typedef struct { int a; //结构内定义函数指针变量pshow voi…

人生苦短,不光要用Python,还要在VSCode里用

作者 | imbennyguo出品 | CSDN博客在程序员圈子里&#xff0c;Visual Studio Code&#xff08;以下简称VSCode&#xff09;可以说是目前最火的代码编辑器之一了。它是微软出品的一款可扩展的轻量级开源编辑器&#xff0c;并且支持全平台系统。这些特性使得VSCode颇受欢迎&#…

从XXX 产品的失败谈起

从XXX 产品的失败谈起 从去年年中公司开始秘密研究一项高级产品&#xff0c;以替换陈旧体系下的老款产品&#xff0c;为此&#xff0c;创建了一个产品开发部 门&#xff0c;由七八个富有本行业开发经验的全职成员构成&#xff0c;经过一年多的努力&#xff0c;即将投入市场了&…

C++ 经常使用类 string类

6.3.2使用string对象 string word"I love China" *链接字符串* string descriptionadjective " " word; _Note_: 不能连接两个字符串字面量&#xff0c;以下的语句是错误的 string test "I have" "a dream"; 6.3.3訪问字符串中的字…