这一节,我们直接进入到RCNN的学习中。这一系列主要包括RCNN, fast-RCNN和faster-RCNN模型的理解。
本文已同步至订阅号:麻瓜智能,欢迎订阅。
本文主要参考文献:
Girshick, R. , et al. "Rich feature hierarchies for object detection and semantic segmentation." 2014 IEEE Conference on Computer Vision and Pattern Recognition IEEE, 2014.
第一 什么是目标检测
之前博客里面有写到人脸检测,感兴趣可以参考:《》。这种方法是在整幅图里面找到人脸,并知道人脸在哪。信息爆炸时代,尤其是现在AI横行的时代,检测人脸已经不能满足我们的需求。我们还想要知道一幅图中有没有猪脸,马脸,鱼脸,马屁股,车轱辘,如果有的话,它在哪.应为我们实在太懒了,我们想让设备告诉我是什么,它在哪,而不是我手动画圈.
第二 RCNN是什么
RCNN的拓补图,借用文中的图.
RCNN主要分为四个部分:
- 输入图像
- 提取目标候选区域(每幅图产生2000个候选目标区域)
- 对每个候选区域用CNN做特征提取(固定长度的特征向量,文中采用4096长度的向量)
- 对提取好的特征,用SVM做分类(参考我的另外一篇博客《》)
- 文中用到了目前为止一直在用的技术,fine-tuning,尤其是在训练样本不充足的情况下,这种方式很有用。
现在对(2)(3)(4)中每一步做说明
步骤(2)
怎么提取候选区域
这里面用到了两个技术:selective search和区域扩展。
Selective search
这种方法主要是用来产生候选区域的。怎么选择呢?
- 先用某种方法,对图像进行分割,分割的结果就是产生很多很多的大的小的区域,保存到R中;
- 对于这些大的小的区域,进行如下的操作
(2.1)计算每个相邻邻域对(ri,rj),计算其相似度,把所有这些相似度保存到一个集合S里面
(2.2)找到S中最大的那个相似度,把R中对应的这两个邻域块ri和rj合并,得到rt,也就是R中用rt代替了ri和rj;
(2.3)在S中把ri 和rj有关的相似度都删掉;
(2.4)计算rt和它的邻域的相似度,并把相似度保存到S中;
(2.5)重复步骤(2)知道S为空
相似性度量方法可参考推荐博客:
https://www.cnblogs.com/zyly/p/9259392.html
区域扩展:为啥要进行区域扩展呢?因为,对于CNN网络来说,它需要的输入图像大小是固定为某个值的,所以,如果想用CNN提取候选区域的特征向量,就得把候选区域的尺寸扩展到CNN需要的大小(比如227*227)。怎么扩展呢?
用原文的图来说明:
如图所示,(A)是原始图像,(B)是把候选区扩展成正方形(227*227),然后把候选区之外的部分用灰色填充,然后对于灰色的地方,用原图中对应位置的像素值进行填充(C)只用灰度值填充(D)直接放大到正方形大小。在上面的图中可以看到有黑色的框框标注的地方,这是在227*227的图上,在底部增加了padding,原文中padding的大小是16个像素,如果原图中对应位置有像素值,就是原图填充,如果没有对应的原图像素值,就用灰度填充。
步骤(3)
如何用CNN提取候选区域的特征向量。
这个其实也不需要说太多,CNN的一个主要作用就是提取图像的高级特征。现成的有很多的网络可以实现特征的提取。
步骤(4)
用SVM对特征向量做分类,这一部分可以参考我的另外一篇博客《支持向量机与支持向量回归(support vector machine and support vector regression)》
第三 RCNN的关键技术
在参考论文中,作者也提出了一些关键技术,现在对其做说明。关于候选区域的处理已经在上面的内容中做了介绍,不再陈述。
(3.1)bounding box regression
为什么要做边框回归呢?
在上面第二节中,对每一个候选区域进行特征提取(用CNN),再对特征做分类,假设就是我们需要的类别。有可能存在一个问题,被确定类别的候选框跟这个类别真实的边框还有一些差距,导致用IOU指标去评价的时候,不能很好的处理。如果能够学习得到一组参数,使得那些被选中的候选框更接近真实的就完美了。所以就有了bound ing box回归。
怎么做呢?
好吧,还是推荐一篇博客吧。
https://blog.csdn.net/zijin0802034/article/details/77685438/