关注并星标
从此不迷路
计算机视觉研究院
公众号ID|ComputerVisionGzq
学习群|扫码在主页获取加入方式
论文地址:https://arxiv.org/pdf/2005.13243.pdf
源代码:https://gitlab.com/irafm-ai/poly-yolo
计算机视觉研究院专栏
作者:Edison_G
YOLOv3改进版来了!与YOLOv3相比,Poly-YOLO的训练参数只有其60%,但mAP却提高了40%!并提出更轻量的Poly-YOLO Lite。
一、背景
目标检测是一个过程,其中包含感兴趣对象的所有重要区域都被限制而忽略背景。通常,目标以一个框为边界,框用其左上角的空间坐标及其宽度和高度表示。这种方法的缺点是对于形状复杂的物体,边界框还包括背景,由于边界框没有紧紧包裹物体,背景会占据很大一部分区域。这种行为会降低应用在边界框上的分类器的性能,或者可能无法满足精确检测的要求。为了避免这个问题,Faster R-CNN或RetinaNet等经典检测器被修改为Mask R-CNN或RetinaMask的版本。这些方法还可以推断实例分割,即边界框中的每个像素都被分类为对象/背景类。这些方法的局限性在于它们的计算速度,它们无法在非高层硬件上达到实时性能。
我们关注的问题是创建一个具有实例分割和中层显卡实时处理能力的精确检测器。
二、前言
Poly-Yolo实例分割案例
目标检测模型可以分为两组,两级和一级检测器。两级检测器将过程拆分如下。在第一阶段,提出感兴趣的区域(RoI),在随后的阶段,在这些候选的区域内进行边界框回归和分类。一级检测器一次预测边界框及其类别。两级检测器在定位和分类精度方面通常更精确,但在处理方面比一级检测器慢。这两种类型都包含用于特征提取的主干网络和用于分类和回归的头部网络。通常,主干是一些SOTA网络,例如ResNet或ResNext,在ImageNet或OpenImages上进行了预训练。尽管如此,一些方法 也从头开始尝试训练。
今天分享的框架提出了性能更好的YOLOv3新版本,并扩展了名为Poly-YOLO。Poly-YOLO建立在YOLOv3的原始思想的基础上,并消除了它的两个弱点:标签重写和anchor分配不平衡。
Poly-YOLO使用stairstep上采样通过hypercolumn技术聚合轻型SE-Darknet-53主干网中的特征来减少问题,并产生高分辨率的单尺度输出。与YOLOv3相比:Poly-YOLO的可训练参数只有60%,但mAP却提高了40%。更少参数和更低输出分辨率的Poly-YOLO Lite,具有与YOLOv3相同的精度,但体积小三倍,速度快两倍,更适用于嵌入式设备。
今天主要就是说怎么解决Yolov3两大问题。
左图说明了输入图像上的 YOLO 网格,黄点表示检测到的对象的中心。右图说明了检测结果。
第一个问题:标签重写
标签重写是指由于yolo特有的网格负责预测bbox的特点,可能会出现两个物体分配给了同一个anchor,导致仅仅有一个物体被保留负责预测,另一个物体被当做背景忽略了。当输入分辨率越小,物体越密集,物体的wh大小非常接近时候,标签重写现象比较严重。如上图所示,红色表示被重写的bbox,可以看出27个物体有10个被重写了。
具体来说,以416 *416大小的图像为例,在图像分辨率随着卷积下降到13 * 13的特征图大小时,这时候特征图一个像素点的对应是32*32大小的图像patch。而YOLOV3在训练时候,如果出现相同两个目标的中心位于同一个cell,且分配给同一个anchor,那么前面一个目标就会被后面目标重写,也就是说两个目标由于中心距离太近以至于在特征图上将采样成为同一个像素点的时候,这时候其中有个目标会被重写而无法进行到训练当中。
这种现象在coco数据上不明显的原因是bbox分布比较均匀,不同大小物体会分配到不同预测层,标签重写概率比较低。但是在很多实际应用中,比如工业界的特定元件检测时候,物体排布非常紧密,且大小几乎一致,此时就可能会出现标签重写问题了,作者论文指出在Cityscapes数据上该现象也比较明显。
第二个问题:Anchor分配不均衡
yolo系列采用kmean算法聚类得到特定要求的9个anchor,并且以每三个为一组,用于大输出图(检测小物体),中等输出图和小输出图层(检测大物体)的默认anchor。可以看出不同大小的物体会被这三组anchor分配到不同预测层进行预测。
但是这种kmean算法得出的结果是有问题的,在实际项目中也发现了。前面说过大部分特定场景的目标检测数据集,并不是和coco自然场景一样,啥尺度都有,实际项目中大部分物体都是差不多大的,或者说仅仅有特定的几种尺度,此时采用kmean这一套流程就会出现:几乎一样大的物体被强制分到不同层去预测,这个训练方式对网络来说非常奇怪,因为物体和物体之间wh可能就差了一点点,居然强制分层预测,这明显不合理。本文作者生成的仿真数据其实也是这个特点。
作者指出,kmean这种设置,仅仅在:M ∼ U(0, r)情况下采用合理的。其中r是输入图片分辨率,例如416。该式子的意思是物体的大小分布是满足边界为0到r的均匀分布,也就是说在416x416图片上,各种大小尺度的bbox都会存在的情况下,kmean做法是合理的。但是可能大部分场景都是:M ∼ N (0.5r, r),即均值为0.5r,标准差为r的物体分布,如果按照默认的kmean算法对anchor的计算策略,那么由于大部分物体都是中等尺寸物体,会出现其余两个分支没有得到很好训练,或者说根本就没有训练,浪费网络。
三、新框架及解决方法
对于标签重写问题,只能通过要么增加输入图片分辨率大小;要么增加输出特征图大小实现。本文的做法是增加输出特征图大小。
原始的yolov3,输入大小是输出特征图的8/16和32倍,通过上述数据可以发现标签重写比例蛮高的。而通过增加输出特征图大小后可以显著降低重写比例。
对于kmean聚类带来的问题,有两种解决办法:
kmean聚类流程不变,但是要避免出现小物体被分配到小输出特征图上面训练和大物体被分配到大输出特征图上面训练问题,具体就是首先基于网络输出层感受野,定义三个大概范围尺度,然后设置两道阈值,强行将三个尺度离散化分开;然后对bbox进行单独三次聚类,每次聚类都是在前面指定的范围内选择特定的bbox进行,而不是作用于整个数据集。主要是保证kmean仅仅作用于特定bbox大小访问内即可,就可以避免上面问题了。但是缺点也非常明显,如果物体大小都差不多,那么几乎仅仅有一个输出层有物体分配预测,其余两个尺度在那里空跑,浪费资源。
就只有一个输出层,所有物体都是在这个层预测即可。可以避免kmean聚类问题,但是为了防止标签重写,故把输出分辨率调高,此时就完美了。作者实际上采用的是1/4尺度输出,属于高分辨率输出,重写概率很低。
根据上图可以发现:
(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接近。
四、实验及可视化
左:矩形网格,取自YOLOv3。目标边界框以其中心为中心的单元格预测其边界框坐标。 右图:Poly-YOLO中用于检测多边形顶点的基于圆形扇区的网格。 网格的中心与目标边界框的中心重合。 然后每个圆形扇区负责检测特定顶点的极坐标。 不存在顶点的扇区应产生等于零的置信度。
矩形检测和多边形检测对比
THE END
转载请联系本公众号获得授权
计算机视觉研究院学习群等你加入!
计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!
扫码关注
计算机视觉研究院
公众号ID|ComputerVisionGzq
学习群|扫码在主页获取加入方式
往期推荐
NOTES:紧接着缩放操作(Resize)之后,将缩放之后的输入特征图进行边缘填充操作(First_Fill)。输入矩阵大小为 32*32,边缘填充数值为 0,输出矩阵大小为34*34。主要有 Sim_ROM、Sel_Fill、FSM_Timer(FSM + Timer)、Delay_N、Reduce、Extend、AXI4-Stream Data FIFO 的一些 IP 模块。...
过段时间就要秋招了,打算做一个知识汇总,也算是为秋招做准备吧首先fifo是first in first out,先进先出。可以想象成一根管子,一端往里边压入(push)小球,另一边往外边弹出(pop)小球。同步fifo一般有以下几个必备端口信号名称 端口方向 位宽 说明 clk I 1 时钟,读写端口共用 rst_n I 1 复位 winc I 1...
本文实现的是自定义设置字体大小、字体颜色、背景颜色,然后通过一键全部修改整个视图内所有的TextView、EditText、Button的字体大小、字体颜色、背景颜色。实现的逻辑:通过遍历View的方式,判断View是否是TextView、EditText和Button类型,如果是的话,就修改。http://blog.csdn.net/aminfo/article/details/77
Verilog 异步FIFO设计
此处研究AXI到标准握手的桥接器,实现接口转化,例如下图是的,AHB2HANDSHAKE桥是作为AHB slave呈现的,由此可以得出桥接器的输入输出之后是参数描述
安装mysql报错问题处理
转自:http://blog.csdn.net/yangtalent1206/article/details/6422715乒乓操作 “乒乓操作”是一个常常应用于数据流控制的处理技巧,典型的乒乓操作方法如图1所示。 乒乓操作的处理流程为:输入数据流通过“输入数据选择单元”将数据流等时分配到两个数据缓冲区,数据缓冲模块可以为任何存储模块,比较常用的存储单元为双口RAM(D...
FPGA入门学习笔记(二十一)Vivado功能验证FIFO
PLSQL_Developer使用方法及技巧1、PL/SQL  Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码; 设置方法:PL/SQL Developer...
本系统所涉及到的几个主要模块,具体有如下几个模块:A. Simulation Flow:仿真流程B. Initialization:初始化C. Mobility Model:移动模型D. Traffic Model:流量模型E. Propagation Model:信号传输模型F. Multipath Model:多径模型G. SINR Calculation:SINR值计算模型H. Link Level Quality Estimation:链路级质量评价。
题目:http://poj.org/problem?id=1177 分析:(括号匹配)首先把矩形的上边界作为“左括号”边,下边界作为“右括号”边,然后上下排序。假定排完序之后是下面的状态:(())()(()()(())) 考虑“最外侧”的括号的数量。显然上面的那个串是(()) & () & (()()(()))有六个最外侧括号,那么边界数量就是6。排序的复杂度O(nlogn
身处数据爆炸增长的信息时代,各种各样的数据都飞速增长,视频数据也不例外。我们可以使用 python 来提取视频中的音频,而这仅仅需要安装一个体量很小的 python 库,然后执行三行代码!语音数据在数据分析领域极为重要。比如可以分析语义、口音、根据人的情绪等等。可以应用于偏好分析、谎话检测等等。一、提取音频需要用到 python 的 moviepy 库moviepy 的 github 地址:https://github.com/Zulko/moviepy命令行 pip 安装上 moviepy 即可