论文名称:Poly-YOLO: higher speed, more precise detection and instance segmentation for YOLOv3

论文地址:https://arxiv.org/abs/2005.13243v2

github: https://gitlab.com/irafm-ai/poly-yolo

本文很有意思,实用性很强,是本人比较推荐的论文。因为各大算法评价性能都是在比赛数据上测试的,但是在实际项目数据上可能就不太好用了,主要原因是实际项目数据有自己的特点,如果完全照搬,效果可能不那么好。本文所提出的改进版本yolo就是在特定场景下所提出的改进算法,分析问题的思路非常好,值得学习。

1 yolov3存在的问题

(1) 标签被重写问题

标签重写是指由于yolo特有的网格负责预测bbox的特点,可能会出现两个物体分配给了同一个anchor,导致仅仅有一个物体被保留负责预测,另一个物体被当做背景忽略了。当输入分辨率越小,物体越密集,物体的wh大小非常接近时候,标签重写现象比较严重。如上图所示,红色表示被重写的bbox,可以看出27个物体有10个被重写了。

具体来说,以416 *416大小的图像为例,在图像分辨率随着卷积下降到13 * 13的特征图大小时,这时候特征图一个像素点的对应是32*32大小的图像patch。而YOLOV3在训练时候,如果出现相同两个目标的中心位于同一个cell,且分配给同一个anchor,那么前面一个目标就会被后面目标重写,也就是说两个目标由于中心距离太近以至于在特征图上将采样成为同一个像素点的时候,这时候其中有个目标会被重写而无法进行到训练当中。

这种现象在coco数据上不明显的原因是bbox分布比较均匀,不同大小物体会分配到不同预测层,标签重写概率比较低。但是在很多实际应用中,比如工业界的特定元件检测时候,物体排布非常紧密,且大小几乎一致,此时就可能会出现标签重写问题了,作者论文指出在Cityscapes数据上该现象也比较明显。

(2) kmean计算anchor存在的问题

yolo系列采用kmean算法聚类得到特定要求的9个anchor,并且以每三个为一组,用于大输出图(检测小物体),中等输出图和小输出图层(检测大物体)的默认anchor。可以看出不同大小的物体会被这三组anchor分配到不同预测层进行预测。

但是这种kmean算法得出的结果是有问题的,在实际项目中也发现了。前面说过大部分特定场景的目标检测数据集,并不是和coco自然场景一样,啥尺度都有,实际项目中大部分物体都是差不多大的,或者说仅仅有特定的几种尺度,此时采用kmean这一套流程就会出现:几乎一样大的物体被强制分到不同层去预测,这个训练方式对网络来说非常奇怪,因为物体和物体之间wh可能就差了一点点,居然强制分层预测,这明显不合理。本文作者生成的仿真数据其实也是这个特点。

作者论文指出,kmean这种设置,仅仅在:  情况下采用合理的。其中r是输入图片分辨率,例如416。该式子的意思是物体的大小分布是满足边界为0到r的均匀分布,也就是说在416x416图片上,各种大小尺度的bbox都会存在的情况下,kmean做法是合理的。但是可能大部分场景都是:  即均值为0.5r,标准差为r的物体分布,如果按照默认的kmean算法对anchor的计算策略,那么由于大部分物体都是中等尺寸物体,会出现其余两个分支没有得到很好训练,或者说根本就没有训练,浪费网络。

(3) 仿真分析

为了说明上面问题,作者假设两个box:m1和m2;前者与放置在高速公路上的摄像头的车牌检测任务相连接,模拟全部是小物体检测任务,后者与放置在车门前的摄像头的人检测任务相连接,模拟全部是大物体检测任务。对于这样的任务,我们可以获得大约  ,因为这些牌将会覆盖小的区域,而  因为人类将会覆盖大的区域。

对于M1场景,基本都是小物体,采用kmean会强制区分不同大小物体分配到三个层预测,那么就会出现小物体被分配到小输出特征图上面训练,那么首先标签重写问题会出现;并且小输出特征图检测小物体是比较困难的,可能会丢失。 对于M2场景,基本都是大物体,会出现大物体被分配到大输出特征图上面训练,那么会出现由于物体过大在浅层特征图上检测效果比较差,也就是常说的语义信息不够。

不仅仅有上面存在的问题,我们通常知道物体在哪个尺度检测,应该要和网络的输出感受野相匹配才是最佳的,无数论文已经验证了这个道理,例如s3fd等等。前面说的大输出特征图检测小物体,小输出特征图检测大物体,也是基于感受野的原则来定义的。作者分析了yolov3三个输出层的感受野大概是(85 × 85, 181 × 181, 365 × 365)。在物体大小都差不多情况下,强行采用kmean策略分配anchor,明显就已经不符合感受野的设定了,效果肯定不是最好的。

作者支持yolov3中反应的high APsmall,但是中等尺度和大输出物体检测性能不佳,可能就是由于上面出现的问题导致的。

2 解决办法

对于标签重新问题,没有啥特别好的办法,只能通过要么增加输入图片分辨率大小;要么增加输出特征图大小实现。本文的做法是增加输出特征图大小。

原始的yolov3,输入大小是输出特征图的8/16和32倍,通过上述数据可以发现标签重写比例蛮高的。而通过增加输出特征图大小后可以显著降低重写比例。

而对于kmean聚类带来的问题,有两种解决办法:

(1) kmean聚类流程不变,但是要避免出现小物体被分配到小输出特征图上面训练和大物体被分配到大输出特征图上面训练问题,具体就是首先基于网络输出层感受野,定义三个大概范围尺度,然后设置两道阈值,强行将三个尺度离散化分开;然后对bbox进行单独三次聚类,每次聚类都是在前面指定的范围内选择特定的bbox进行,而不是作用于整个数据集。主要是保证kmean仅仅作用于特定bbox大小访问内即可,就可以避免上面问题了。但是缺点也非常明显,如果物体大小都差不多,那么几乎仅仅有一个输出层有物体分配预测,其余两个尺度在那里空跑,浪费资源。

(2) 就只有一个输出层,所有物体都是在这个层预测即可。可以避免kmean聚类问题,但是为了防止标签重写,故把输出分辨率调高,此时就完美了。作者实际上采用的是1/4尺度输出,属于高分辨率输出,重写概率很低。

3 poly-yolo

基于前面的思想,作者设计的网络如下:

一些细微的网络改动就不说了,作者开源了代码,可以直接看出来。

(1) 网络方面,为了减少参数量,首先减少了通道数目,同时为了提高性能,引入了SE单元来加强特征

(2) 和yolov3的最大区别是输出层是一个,但是也采用了多尺度融合方式

(3) neck部分提出了hypercolumn+stairstep上采样操作

其示意图如下所示:

左边是标准的hypercolumn操作,右边是作者提出的。实验表明右边的方式更好,因为loss更低。

通过上述参数设置,作者设计的neck和head较轻,共有37.1M的参数,显著低于YOLOv3的61.5M,Poly-YOLO比YOLOv3的精度更高,在可训练参数减少40%的情况下,mAP精度大概也提高了40%。。同时为了进一步提速,作者还设计了lite版本,参数仅仅16.5M,精度和yolov3差不多

作者还强调了,本文设计的仅仅是一种思想,如果采用最新的骨架网络替换,应该可以得到一个更加高效,精度更高的poly yolov3版本。

对于采用poly yolov3进行实例分割,本文不打算分析,因为我关心的是论文所提出的两个问题以及解决办法而已。性能如下:

总结下:yolov3由于特殊的网格预测模式,当物体比较密集且大小差不多时候,会存在大量的标签重写现象;并且在该场景下基于kmean计算得到的anchor会出现物体预测尺度和感受野不符的问题,导致整个优化过程不是最优的。针对上述问题,作者提出采用单尺度预测,且维持高输出分辨率特征图的策略来解决上述问题。为了加速和进一步提高性能,采用了se单元、hypercolumn+stairstep上采样特征聚合方式来加强特征提取能力。从而实现了在参数大幅减少情况下,mAP提升解决40%。可以说本文是为了特定场景应用所提出的改进,不一定适合coco这种自然场景物体分布均匀的场景

特定场景下Yolo改进算法:Poly-Yolo相关推荐

  1. 旅行场景下的推荐算法探索

    今天给大家分享阿里巴巴集团高级算法温鸿所做的分享<旅行场景下的推荐算法探索.pdf>,关注推荐算法及其实践的伙伴们别错过啦!(到省时查报告小程序中搜索"推荐".&quo ...

  2. [Camera Drv]开video dynamic framerate,特定场景下video encode时会闪屏 - MTK物联网在线解答 - 技术论坛

    [Camera Drv]开video dynamic frame rate,特定场景下video encode时会闪屏 1. 开 video dynamic frame rate ,环境 BV 在 d ...

  3. 特定场景下取代if-else和switch的方式

    look-up表代替if-else 比如某平台的信用分数评级: 超过700-950,信用极好, 650-700信用优秀, 600-650信用良好, 550-600信用中等, 350-550信用较差. ...

  4. 单目标识别下的以中心点定位为目标值的yolo改进算法措施

    目前我们需要绘制一个矩形框来标注我们的目标 但实质上,我们需要的只是一个目标的中心点 在算法上,有没有可能,它自动创建多种标注拓展 然后以这些标注拓展通过某种算法形成新的标注 以这些新的标注计算综合指 ...

  5. 关于如何解决特定场景下WPF4.0中“XamlWriter.Save序列化限制”问题的一种思路

    问题背景      笔者最近使用ArcGIS Server WPF API 开发一个能够实现所见即所得的基于Xaml的图层符号编辑功能.这个功能主要目的能够让用户以Xaml的形式来定义图层符号,并能够 ...

  6. 特定场景下SQL的优化

    1.大表的数据修改最好分批处理. 1000万行的记录表中删除更新100万行记录,一次只删除或更新5000行数据.每批处理完成后,暂停几秒中,进行同步处理. 2.如何修改大表的表结构. 对表的列的字段类 ...

  7. 腾讯广告:广告场景下有哪些视觉算法应用?

    AI算法特别是深度学习近年发展迅猛,应用范围大幅提高,为各领域提供了智能解决方案.在2019腾讯广告算法大赛的总决赛现场,腾讯广告高级应用研究员石瑞超为大家带来题为<广告场景下的视觉算法应用&g ...

  8. 神策数据成林松:数据智能在业务场景下的应用(附 PPT 下载)

     在神策 2020 数据驱动用户大会「上海站」现场,神策数据业务咨询师成林松分享了<数据智能在业务场景下的应用>的演讲.(文末附 PPT 下载地址) 本文根据其演讲内容整理,数据均为虚拟. ...

  9. 【迁移学习】隐私保护下的迁移算法

    作者:李新春 -------- 计算机软件新技术国家重点实验室 伪文艺程序员 既可提刀立码,行遍天下 又可调参炼丹,卧于隆中 本文概要 本文介绍一种特殊场景下的迁移算法:隐私保护下的迁移算法.首先,本 ...

最新文章

  1. 数据挖掘实战:带你做客户价值分析(附代码)
  2. Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析
  3. Google机器人眼里的百度
  4. 科技谋定功能性农业-农业大健康:中科微研携手从玉农业
  5. c#垂直投影法_投影学
  6. 热模块替换html,热模块替换启用,但不能正常工作http:// localhost:3000/__ webpack_hmr...
  7. How to Register COM in VS
  8. 2021牛客OI赛前集训营-交替【生成函数】
  9. 用conda安装虚拟的R环境
  10. servlet3.0异步处理
  11. linux巡检脚本生成word,Linux 编写安全巡检脚本
  12. c语言给一个函数添加功能,【C语言】请编写实现以下功能函数:实现对一个8bit数据(unsigned char)的指定位(例如第8位)的置0或置1操作,并保持其他位不变...
  13. NIO server client
  14. 大唐杯 5G协议与信令 任务六、任务七(24:30-35:00)
  15. Windows的Git Bash使用tree命令
  16. 智慧化工厂安全风险生产预警系统软件
  17. 利用二维数组(double[])实现一个矩阵类:Matrix。要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为valu
  18. AVPlayer详解系列(一)参数设置
  19. 计算机丢失uxthemedll,win10系统开机显示uxtheme.dll丢失的处理办法
  20. 带式输送机传动系统设计全套课程设计

热门文章

  1. Python字符串中含有某子字符串的个数
  2. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array
  3. pom.xml中spring-boot-starter-test包的使用
  4. java.lang.instrument 学习(一)
  5. linux 物理内存 分配,[linux物理内存分配]Linux系统下如何查看物理内存占用率
  6. 国际顶级学术会议SIGIR 2020开幕在即,重量级嘉宾带你窥探信息检索前沿
  7. 斯坦福马腾宇:用显式正则器提升深度神经网络的泛化能力
  8. Tensorflow CIFAR-10训练例子报错解决
  9. 一图读懂《“十四五”软件和信息技术服务业发展规划》
  10. AI模型加速进入万亿级时代,中国AI算力独占全球三成