Faster RCNN源码解读(1)-NMS非极大值抑制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Faster RCNN源码解读(1)-NMS非极大值抑制相关的知识,希望对你有一定的参考价值。

参考技术A 参考:
非极大值抑制(Non-Maximum Suppression,NMS)
py_cpu_nms.py

从0开始的CNN学习之路

目录

前言

一、传统机器视觉

二、RCNN整体流程

三、selective search

四、NMS(非极大值抑制)

总结


前言

本系列文章主要内容从RCNN开始引入,重点介绍RCNN其中的思想,主要包括region proposals,NMS,以及soft-NMS,后续文章会逐渐涉及到Fast-RCNN,Faster-RCNN以及yolo系列等经典目标检测算法


一、传统机器视觉

传统机器视觉中,都是通过复杂的数学方法来人为提取特征的,其中较为重要的方法有SIFT/Fast/Hog/Surf/Orb等,这些方法包含了金字塔,角点等经典方法,一定要掌握到位

在通过上述方法提取完特征后,我们将用RANSAC算法来找出有用特征,并将其送入SVM(支持向量机)中来进行分类或者回归,或者也可以用neural network来进行分类或者回归

在这里额外提一句,在CNN中,FC层(全连接层)就是一个经典的neural network(NN网络)

以上即为传统机器视觉进行目标检测的大体流程

二、RCNN整体流程

RCNN从input开始,获得region proposals,再讲得到的proposal放入CNN中提取feature map(特征图),最终将map放入SVM中进行分类 

其中,RCNN做出的最大突破便是使用CNN提取特征,不同于传统机器视觉中的人为提取特征

在这里额外提一句,region proposal是two stage算法独有的中间结果,如yolo一类的one stage算法是没有的

现在的CNN算法里面,是不用SVM进行分类或者回归的,因为其违背了CNN的特性,CNN中的FC层是可以进行分类或者回归的,这一点在上面也提到过 

目标检测算法即是分类算法(cls),也是回归算法(bbox)

region proposal并不是bbox,这点要注意

三、selective search

selective search是一种非监督方法,目的是用来寻找region proposal的

核心思想是通过pixel(像素)的相似程度,将图像分成块,并将相似块进行合并/细分(类似相似度分割),然后再将其resize成同样大小,最终取大概2000个块,即为region proposal

至于为什么必须resize成相同大小,这是因为我们需要将其放入CNN中,而CNN中的FC层则要求其输入必须是相同大小,否则会导致输出的feature vector长度不相等

至于为什么取2000个,这是因为当初RCNN的作者取的就是2000个,可能他们觉得2000个在ImageNe数据集上效果比较好吧....

至于resize会不会损失图片的特征信息,答案是肯定的,但这样会提升模型的鲁棒性,因此我们是希望其会改变的

四、NMS(非极大值抑制)

上面我们讲到,经过selective search算法后,我们提取了大约2000个proposal,现在假设我们这张图片中有四个真实目标,那么我们最终要得到的结果就是4个bbox,也就是说我们需要将其余的1996个proposal给过滤掉,而这个过滤的方法,就是NMS

首先,第一步,我们需要先设置一个阈值Thre=0.8,其次我们的2000个proposal送入CNN后会变成2000个feature vector,最终会得出2000个bbox,这些bbox都会有一个score,即预测概率,如果bbox的score小于阈值Thre,则被滤掉,反之则进入下一个环节,假设我们进入下一个环节的有200个proposal

那么,第二步,我们将这200个bbox按照score从大到小排序,取出其中最大的bbox(P1),将其分别与别的bbox计算iou,并设置阈值Nt,如果iou大于Nt,则将此bbox滤出,重复此操作将所有proposal遍历一遍后,将除了(P1)的其余bbox重复上述操作,直至将所有bbox遍历完,则完成操作,剩余的框便是我们需要的bbox

soft---NMS

但是上述NMS算法有一个缺点,假如让两个目标重叠度较高的话,那其中一个目标的bbox必定会滤除,所以我们想出了一种新的方法---soft-NMS

soft---NMS的思想很简单,即重新构造bbox的score,具体方法如上图绿框所示,其中函数f()为高斯核,所以当iou大,则f就越小,si就越小,但是如果si如果为真实目标的bbox的score的话,那么si的值必定很大,故可以抵消高斯核的负影响,然后我们再设置一个阈值,当更新后的si小于阈值,则被滤除

以上便为soft---NMS的大体过程,总结下来便是:在原版NMS算法暴力使用iou滤除的基础上引入了bbox的score属性,通过利用正目标的si过大可抵消高斯核的负影响的特性,来滤除别的bbox,同时也避免了多个目标重叠度较高导致的问题

此处也多说几点:

1.NMS算法中,算法轮了几轮,则最终会保留几个框

2.NMS算法是不管类别的,不管你是什么cls的bbox,他都会一起进行过滤

3.iou:顾名思义,iou就是把预测框与真实框的相交的面积除以相并的面积

iou的计算方法为:交集/并集

4.NMS算法后续也有很多种创新,具体分为两个方向发展,分别是精准和快速两个方向

下图为NMS发展的其中几种算法,感兴趣的同学可以去了解一下


总结

本系列文章会以RCC,Fast-RCNN,Faster-RCNN,yolo系列的顺序,尽可能通俗易懂的带大家理解CV方向卷积神经网络的原理,对大家的知识要求储备不是特别高,新入门的小白也是可以享用的,其中一些专业名词我也会专门标注出来,请大家放心

(PS:这学期作者要考英语四级,所以更新时间可能不是很规律,但是绝对不会断更的,请大家放心!!!)

以上是关于Faster RCNN源码解读(1)-NMS非极大值抑制的主要内容,如果未能解决你的问题,请参考以下文章

从0开始的CNN学习之路

从0开始的CNN学习之路

Py-faster-rcnn/lib/nms/nms_kernel.cu的学习笔记

Faster_RCNN 1.准备工作

faster rcnn源码解析

非极大值抑制算法(NMS)的python实现