(五)比赛中的CV算法(下2)YOLO算法和one-stage检测器

2023-05-16

此时此刻恰如彼时彼刻,一位大佬在阅读了Faster R-CNN 中PRN设计的思想后直接拍桌怒起:既然RPN能直接根据深度特征提取出可能存在物体的ROI,生成提议区域,那我干脆就用网络直接回归出bbox的坐标不就得了,一步到位岂不是美滋滋?(两阶段的方法相当于先通过RPN大致定位bbox,再在后续的bbox回归中获取更精准的定位框,one-stage的方法直接在特征图上进行bbox的回归)这就是YOLO的设计思想。YOLO是you only look once的缩写,“只看一眼”也昭示着这是一个一阶段的端到端网络,不需要中间的区域提议阶段!

  • YOLO

    作为one-stage模型的开山之作,yolo直接砍掉了RPN,通过连续的几个卷积层直接回归出bbox坐标和对应的分类。首先一起看看yolo的pipeline:

     相比之前介绍的R-CNN家族,是不是感觉一下清爽了不少?从设计结构来说,整个算法的运行就只有3步:

  1. 缩放图片至ConvNet的输入大小

  2. 卷卷卷...

  3. 得到每个框的分类和置信度

  4. 运行NMS去除重复的目标框

有些同学肯定会疑惑,凭什么则这样就能得到回归坐标和分类呢?请牢记一点:网络只不过是会在训练过程中会学会一个映射!那么关键就在于我们应该如何提供“监督”来让网络学习这个映射。不过,还是要称赞一下如此简单明了的设计简直满足了所有美好的想像,如此的Unified、elegant!

请看YOLO的设计思想:

划分格点随后每个格点负责预测置信度和预测框位置,最后综合上一步的两个数据得到检测结果

根据上图,我们分析一下YOLO的检测过程:

  1. 首先还是通过密集采样的思想,把图像分成SxS大小的一堆格点,训练时每个单元格将会负责检测那些中心落在对应格点中的目标,即GT的中心落在哪个格子,那个格子就负责预测(初看yolo的教程的同学都很有可能有这样的问题,训练的时候你有训练标记,能够知道每个目标的中心在哪里;可是在推理预测的时候怎么目标中心在哪呢?答案是不用管!我们会把每个格点都当作目标中心,一会还会提到这个问题)。

  2. 由前面简介所述,yolo直接回归得到bbox角点和分类,那么对于bbox的预测,假设每个格点会预测N个检测框(不同的规格和尺度,类似于之前介绍的anchor的概念,也是先验的、用于缩小搜索空间的方法),还会得到这个框的置信度(定位是否准确?框内存在物体的概率?总之是这两者的加权值),此置信度在训练时通过生成的边界框与GT的IOU来表示,如果预测得到的边界框不存在物体则此项为零(网络认为这里没有目标那么也没必要计算IOU了)。这一步骤中得到也就是上图中的Bounding boxes+confidence。

  3. 我们还需要为每个格点生成的检测框预测其属于C个类别的概率值(当然也可以训练一个softmax分类器来计算每个类的概率,不过既然网络可以直接学会一个图像到分类概率的映射,我们干脆就直接让网络输出对应预测框属于每个类的概率吧!读者也可以思考对比一下两者的优劣),有些网络会分为C+1个类因为它们把背景也作为一种分类,不过我们前面已经在bbox的预测中增加了置信度这个指标,那么当预测框中没有目标的时候此项为0,这样就不需要一个额外的分类了。这步对应上图2中的生成class probability map。

那么,根据上面的介绍,我们最后总共需要网络输出SxSx(5*N+C)个值,yolo的paper选择的值是s=7,n=2,C=20,即把原图划分为7x7的网格,每个格点预测两种不同大小的预测框,总共检测20种目标,5是框的置信度和中心坐标、框的长宽。因此网络最后会输出7x7x(5*2+20)个值。此处mark,稍后再提如何进行后处理。*

讲完了整体设计思想,你应该能明白为什么我们把每个格点都作为可能的目标中心了:因为每个格点最后都会产生5*N+C个值!即使在实际推理的时候这个格点里面没有目标存在也没事,算就完事了!最后在得到预测值的时候,没有目标存在的格点要么bbox的置信度会很低或者为零(表示这个框里啥也没有),要么就是这个bbox属于每个类的概率都很低,在之后的NMS阶段将会被删去。因此注意训练和推理时的区别,我们只是假设每个格点都有物体,最后是否真的有物体,就看输出得到的置信度和分类分数有多高了,笔者称之为”将计就计“!

看完了网络的设计思想,终于可以看看网络的结构了:

 前面就是一堆卷积层+池化层构成的block,不断地缩小feature map的尺寸(细心的你会发现,虽然feature map横向尺寸变小但是通道数是在增加的,think about it)。倒数第三个block结束后,这里的特征已经非常“高级”了,与是把它们接入全连接层充分利用特征之间的关系,随后连接到一个7x7x30的张量,每个值就代表着我们的需要的那些输出。

ok,此处呼应上面忽略的后处理mark,来讲讲后处理:首先从对所有预测框进行筛选,设定一个阈值把那些“假”预测框筛选掉(也就是对我们假定有目标中心的那些格点进行筛选,具体怎么做?用得到的bbox置信度乘以那个bbox对应的C个类别概率!);剩下的就是预测的比较准、类别置信度高的bbox了,再对这些bbox运行NMS,得到最后的预测结果。

一顿操作猛如虎,YOLO将bbox回归和分类任务并行完成且一步到位,将Faster R-CNN中的RPN也直接给“融合”进来,进一步减小了时间开销,在Pascal VOC2007和2012上得到了63.4的mAP和45FPS的速度,成功实现了实时检测!不用想也知道之后one-stage的模型就开始井喷了。

YOLO的作者还对比Faster R-CNN进行了非常严谨的误差分析:

 对比可以发现,YOLO出错的地方大多是Localization错误,即bbox的回归框不准确,每个格点只生成了两个b预测框并且两个预测框预测的是同一个种类;而Faster R-CNN在这方面要好很多,毕竟它有两次修正回归框的机会,先提出候选区域再在其上进行bbox回归。

此处呼应前文 Fast R-CNN处的前景背景分析mark:

不过有得必有失,Faster R-CNN在背景分类上出现了很多错误,而YOLO将背景错判为目标的概率只有4.75%,这就很有意思了。从它们俩的结构差别我们应该也能推断处一些端倪:Faster R-CNN在进行分类的时候只利用了RPN生成的ROI上的特征,而YOLO从头到尾都是ConvNet的结构,在高层feature map上接近全局的连接获得了更大的感受野,因此也充分利用了全局的特征,不容易将背景分为目标。

由于YOLO没有resion proposal阶段,因此基本没有机会修正正负样本不均衡的问题只能通过一些启发式的技巧最大程度降低负样本过量的影响,而Faster R-CNN在RPN提出候选区域后就能根据生成的候选框与GT的IOU来筛选正负样本使得正负比例约为1:3(作者经过测验发现这是一个比较好的值)。

YOLO还有一个缺点就是对于小物体的检测很容易忽略,7x7的格点对于小目标来说还是太大并且YOLO没有机会修正检测框。


下期将会对当前学习的R-CNN家族和YOLO这两个经典算法进行总结并对loss function和网络的设计进行分析,务必持续关注哦!

如果觉得笔者写的还可以,点个赞关注一下吧~

之后cv算法是实际使用和部署将会同步推送(第六部分,如装甲板识别和能量机关、跟踪算法的具体应用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(五)比赛中的CV算法(下2)YOLO算法和one-stage检测器 的相关文章

  • maven 常用镜像仓库

    maven 常用镜像仓库 lt mirror gt lt id gt alimaven lt id gt lt mirrorOf gt central lt mirrorOf gt lt name gt aliyun maven lt na

随机推荐