RCNN阅读笔记

起初对于目标检测这方面的任务有些粗粗的了解,之后会有相关方面的任务需求,故仔细阅读相关文件,将自己的理解以及别人所提出的很好的见解记录于此,方便后续回顾.

参考“http://blog.youkuaiyun.com/wopawn/article/details/52133338”

来源:

一方面是近年来物体检测效果提升缓慢,另一方面是在ILSVRC 2012中对ImageNet结果进行重要讨论的过程中,有一个核心问题就是: “To what extent do the CNN classification results on ImageNet generalize to object detection results on the PASCAL VOC Challenge?”,而本文就是将CNN的分类结果很好地用到了PASCAL VOC 的目标检测的任务上面.

目标:

理解分类,检测,分割,姿态



其中分割还包括语义分割和实例分割,区别在于对于“人”,语义分割对所有人做同样的模块分割,而实例分割则对于“不同人”做出分割的不同(标记不同的颜色).

方法:

(一)训练

训练模块由预训练+微调+分类器训练这三个模块组成,下面分三块介绍:

预训练特征提取模型:ILSVRC 2012数据库+图像级的标注(输入图像,输出1000类的One-hot标签)+开源的caffe CNN library.

微调特征提取模型

 1,从VOC数据中提取多个类别独立的region proposals,并warp成同样大小;

            详:selective search方法《Selective Search for Object Recognition》;IOU阈值为0.5,大于则为正样本(正样本包括groundtruth),小于为负 样本; warp:每个Proposal减去均值扩张紧张的边界框并裁成227*227,

 2, 微调模型:CCCCCFF, 输出:21维向量

  详:权值更新方法:SGD; 每次迭代的mini-batch为128(32正(遍历所有类)+96背景(负));

 且将1000类的分类改成21类(VOC类别加背景);学习率:0.001(训练时的1/10)

分类器训练:

 对每个proposal的特征用类别独立的线性SVM进行分类,也即目标个数=线性SVM个数

 对于某一类(eg:dog),训练2值分类器:

 1,将特征提取模型的最后一层去掉,也即对于一张图来说输出4096维的特征;

 2,设置IOU的阈值为0.3(通过网格搜索根据验证集的效果确定的),小于阈值则为某类负样本(dog),正样本为ground truth;

 3,训练该类svm模型并保存该类参数(4096*2)

其中数据量太大的问题,文章采用“standard hard negative mining method”解决,对于N类目标同等处理,同样得到对应类别的参数.

(二)测试

1,对一张多目标图像,提取约 2000 个类别独立的region proposals(SS中的“fast mode”)(主要检测模块之一)

2, 扩张边界框,并将每个region proposal映射成同样大小(227*227),以输入后面相同的特征提取模型,后对每个框减去该框像素均值(预处理);

3,用CNN对每个proposal提取固定长度(4096)的特征主要检测模块之二

4,由3获得的2000*4096维的特征,乘以N个SVM的4096*N的权重矩阵(N为目标类别数,此文为20),得到所有proposals的所有类别预测得分主要检测模块之三

5,对每一类(2000*20中的任一列)通过非极大值抑制剔除重复或不合适的proposals,剩余合适的;

6,对每一类的proposals进行BB(Bounding box)回归修正定位,减小定位误差

细节解析:

1,SS

SS之前的穷举搜索就是以不同大小的窗口扫整个图像,这种做法很费时而使得选择性搜索的产生,大致思路分为:

     图像平滑→整图分割(不同通道分别进行)→相邻的相似区域合并(颜色/纹理/大小等人工特征上的相似)

输入图像利用颜色空间的多样性做处理,使得产生的分割效果较好.

2,如何缩放成227*227的图像块大小?

      周边像素用proposal均值填充并暴力缩放.(此处多种方式理解不细致,需重复学习,有人理解为“作者并不是总是在建议框周围加上像素的平均值作为context,正常情况下是使用建议框周围像素作为context,在遇到原图边界时才使用的image mean来填充;第二个问题是,用于padding的16个像素是指在warp之后的227x227图像中的大小。即在227x227图像中,上下左右都有16个像素是不属于建议框,而属于建议框周边的context。这样,在建议框周围填充的像素大小可以通过227、16和建议框尺寸计算出来。”)

3,特征可视化?


文中将这些特征视为”物体检测器”,输入10million的Region Proposal集合,计算每种6×6特征即“物体检测器”的激活量,之后进行非极大值抑制,最后展示出每种6×6特征即“物体检测器”前几个得分最高的Region Proposal,从而给出了这种6×6的特征图表示了什么纹理、结构。

看到这段解释,感觉对文中的图3做了详细的解释。

4,非极大值抑制?

这里非极大值抑制的目的是剔除重复的proposal,从输入的多个建议框到最后输出建议框所对应的分类属性矩阵(M*20),每一列表示属于某一类的建议框的属性,要把一列中重复的建议框剔除.  从字面上来说,就是取极大值,而排除小的值,也就是其中的proposal具有不同的权重值使得该proposal归属于对应的类别;而在剔除非极大值之前要先确定某两个建议框是否重叠,文中用IoU的定义来判断是否重叠.

这里写图片描述

IoU=(A∩B)/(A∪B) 

对于(M*20)的任一列,将权重从大到小排列,先取最大的权重所在的建议框与剩余的其他建议框计算重叠率,超过一定的重叠阈值则表示两者重复,则剔除权重较低的一个,当剔除完与最大权重重复的框之后开始剔除次大权重的建议框的重复框,直到该列中不存在重复的建议框;依次对每一列做如上操作.

5,bounding box回归?

目标检测的精度包括识别+定位精度,其中定位精度要求预测和实际的检测框之间的IoU尽可能大.

这里写图片描述

P为初始预测框(x,y,w,h),G为真实框,G'为修正后的框,原理就是构造框的4个参数之间变换函数.

所使用的数据为与Ground Truth相交IoU最大的Region Proposal,并且IoU>0.6的Region Proposal。(不同类别单独训练回归函数)

需注意的点:

问:为什么单独训练等同于目标个数的线性SVM,而不是直接使用微调后的输出作判别?

答:微调时和训练SVM时所采用的正负样本阈值不同,且微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;并且微调阶段的负样本是随机抽样的,而SVM的负样本是经过hard negative mining方法筛选的;结果就是在采用SoftMax会使PSACAL VOC 2007测试集上mAP从54.2%降低到50.9%。

问:不同类的CNN参数是否相同?

答:特征提取的参数相同,因某个proposal的特征有可能属于多个类别,也即proposal和特征的提取时间可以分摊到所有类别.

问:微调和SVM训练的正负样本的划分(IOU阈值)为何不同?

答:补充材料

问:为什么微调时和训练SVM时所采用的正负样本阈值【0.5和0.3】不一致?

答:微调阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松:Ground Truth+与Ground Truth相交IoU>0.5的建议框为正样本,否则为负样本; SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。


亮点:

1,卷积神经网络对于从底到上的 region proposals特征的提取对定位/分割目标有强大的作用,相较于传统的人工特征;

2,有监督的提前训练在大型的辅助数据集 (ILSVRC), 加上特定领域小数据集 (PASCAL)的微调对于数据稀缺时的高容量CNN的学习是一个有效的范例.

结论:


当使用pool5层特征的时候,参数量是全部CNN参数量的6%,效果却很不错.

缺陷:

1,每张图要提取2000个候选框进行一系列提特征,分类,回归操作,有很多重复的操作,处理速度慢;

2,训练和测试中的流程都是不连续的,一段一段拼接起来的,复杂且浪费存储空间.

### 关于NULL的理解 在C语言中,`NULL` 是一个特殊的宏定义,其本质是一个值为 `0` 的指针。这里的 `0` 并不是一个普通的整数零,而是一个特定的内存地址——即 **空地址** 或者称为 **零地址**[^1]。 具体来说,在不同的编程环境中,`NULL` 可能有不同的实现方式。例如: - 在 C++ 中,通常会简单地将 `NULL` 定义为 `0`。 - 而在纯 C 环境下,则可能将其定义为 `(void*)0`,这表明它是一个指向 `void*` 类型的特殊指针[^2]。 #### NULL的实际意义 当程序员使用 `NULL` 来初始化或者赋值给某个指针时,实际上是在告诉该指针不指向任何有效的内存位置。这种做法有助于防止程序尝试访问非法或未分配的内存区域从而引发崩溃或其他不可预测的行为。 然而需要注意的是,如果试图解引用一个被设置成 `NULL` 的指针(比如通过此指针对其所假设存在的对象执行操作),大多数现代操作系统都会触发保护机制并抛出异常—这就是所谓的“段错误(segmentation fault)”现象。 下面展示如何安全地处理涉及 `NULL` 的情况的一个例子: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p = NULL; // 正确地声明了一个初始为空(null)状态下的整型指针 if (p != NULL){ printf("%d\n", *p); } else{ puts("Pointer is null, cannot dereference."); } return EXIT_SUCCESS; } ``` 上述代码片段展示了良好的实践方法:总是先检查指针是否非空再对其进行进一步的操作。 ### Fast R-CNN学习资源推荐 对于希望深入研究Fast R-CNN算法及其应用的人来说,可以从以下几个方面入手获取相关资料和笔记: 1. 原论文阅读:“Rich feature hierarchies for accurate object detection and semantic segmentation.” 这篇由Ross Girshick等人发表的文章详细介绍了R-CNN系列模型的基础理论框架以及改进版本Fast/Faster R-CNN的设计思路。 2. GitHub项目探索:许多开发者基于原始研究成果开发出了开源实现库,这些仓库不仅包含了完整的源码还附带详细的文档说明。例如官方caffe实现或者其他社区贡献如PyTorch迁移版等都是非常宝贵的第一手参考资料。 3. 博客文章总结:网络上也有不少个人撰写的教程类博文专门讲解Fast R-CNN的工作原理、训练流程还有调参技巧等内容,适合初学者快速入门的同时也能帮助有一定基础的人巩固知识点。 4. MOOC课程观看:一些知名大学开设的数据科学/机器视觉方向在线教育平台提供了系统的授课视频材料覆盖到目标检测领域内的经典技术包括但不限于Fast R-CNN家族成员们。 5. 技术论坛交流讨论:像Stack Overflow,Cross Validated这样的问答网站聚集了大量的专业人士可以就遇到的具体问题寻求解答;另外Reddit子板块r/MachineLearning也是分享心得体验的好地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值