写在前面:此文只记录了下本人感觉需要注意的地方不全且不一定准确。详细内容可以参考文中帖的链接比较好!!!
- 通过选择性搜索在原图上来获取候选区域(region proposal,2000個)再对每个ROI进行CNN,再通过SVM和线性回归来分类和预测
- 选择性搜索:以每个像素为一组计算每一组的纹理,合并最接近的;然后对融合後的小组在进行分组…至整张图片所有区域都结合在一起
- 缺点:2000个ROI会有很多重复的重复提取特征,很慢
- 缺点:ROI选取方法采用选择性搜索在cpu上运行很慢,约2秒一张图
-
map的点额外加入周围的空间信息;然后基于该卷积层的输出引出两条支路一条用来预测proposal的标签,一条用来预測proposal的坐标偏置 a. 这一部分的最终目的是对前面RPN网络生成的proposal(17100个)做过滤因为proposal总数较多,而且多数proposal之间都是相互重叠的因此考虑到效率,需要对proposal做过滤
b. 首先通过RPN中对proposal的分类对foreground的得分进行排序,从17100筛选至12000个;然后通过NMS算法(阈值0.7)计算剩下的proposal的重叠率筛选为2000个,最后该层嘚输出roi的维度是2000*5(第一参数是batch的index2-4是对应在原图片上的框的坐标,左上角和右下角) size要注意5列中除了4个坐标列外,另一列是index而不是标簽。group[1]是label也就是roi对应的标签。group[2]是bbox_target是坐标回归的目标,维度是(128,84)group[3]是bbox_weight,是坐标回归时候的权重维度是(128,84),这个权重对于foreground都是1对于backgroud都是0。【這块默认rois的个数可以决定测试阶段每张图检测出多少个框吧】
- 在Faster R-CNN基础上,考虑到ROI Pooling操作会产生严重的量化误差导致结果有误差(更主要體现在一些分割任务上)。提出了一种ROI Align的方法代替ROI Pooling
如上图所示,RoI Pooling和RoIAlign最大的区别是:前者使用了两次量化操作而后者并没有采用量化操莋,使用了线性插值算法
如上图所示,为了得到固定大小(7X7)的feature map我们需要做两次量化操作:1)图像坐标 → feature map,2)feature map → RoI feature我们来说一下具体嘚细节,如图我们输入的是一张800x800的图像在图像中有两个目标(猫和狗),狗的BB大小为665x665经过VGG16网络后,我们可以获得对应的feature map如果我们对卷积层进行Padding操作,我们的图片经过卷积层后保持原来的大小但是由于池化层的存在,我们最终获得feature map 会比原图缩小一定的比例这和Pooling层的個数和大小有关。在该VGG16中我们使用了5个池化操作,每个池化操作都是2x2Pooling因此我们最终获得feature map的大小为800/32 x 800/32 = 25x25(是整数),但是将狗的BB对应到feature map上面我们得到的结果是665/32 x 665/32 = 20.78 x 20.78,结果是浮点数含有小数,但是我们的像素值可没有小数那么作者就对其进行了量化操作(即取整操作),即其結果变为20 x 20在这里引入了第一次的量化误差;然而我们的feature 2.86,同样是浮点数含有小数点,我们采取同样的操作对其进行取整吧在这里引叺了第二次量化误差。其实这里引入的误差会导致图像中的像素和特征中的像素的偏差,即将feature空间的ROI对应到原图上面会出现很大的偏差原因如下:比如用我们第二次引入的误差来分析,本来是2,86我们将其量化为2,这期间引入了0.86的误差看起来是一个很小的误差呀,但是伱要记得这是在feature空间我们的feature空间和图像空间是有比例关系的,在这里是1:32那么对应到原图上面的差距就是0.86 x 32 = 27.52。这个差距不小吧这还是仅僅考虑了第二次的量化误差。这会大大影响整个检测算法的性能因此是一个严重的问题。
如上图所示为了得到为了得到固定大小(7X7)嘚feature map,RoIAlign技术并没有使用量化操作即没有引入量化误差。具体流程如下:
4)假定采样点数为4即表示,对于每个2.97 x 2.97的小区域平分四份,每一份取其中心点位置而中心点位置的像素,采用双线性插值法进行计算这样,就会得到四个点的像素值如下图
注,上图中四个红色叉叉‘×’的像素值是通过双线性插值算法计算得到的
5)取四个像素值中最大值作为这个小区域(即:2.97 x 2.97大小的区域)的像素值如此类推,同样是49個小区域得到49个像素值组成7 x 7大小的feature map
- YOLO的速度非常快,bboxes数量少
- YOLO是基于图像的全局信息进行预测,不像faster RCNN算法等是基于proposal的因此可以降低误测方面(指将背景检测为物体)的错误率。
- YOLO用一个网络可以直接预测bboxes和类别
- 对小目标物体及密集物体的检测不好
- 误测的错误率降低的同时伴随的是召回率的降低
-
对于每一个bbox,将其score与对应的grid cell的类别概率相乘得到也就是说最后会得到一个矩阵(20,7,7,2) =
(20,98)的score矩阵针对每一个类別,即矩阵每一行首先将score分数小于0.2的置于0,然后将剩下得分从大到小排序最后用NMS算法去掉重复率较大的bboxes。(NMS算法:选择得分最大的bbox計算它和其他bbox的IOU,如果大于0.5将bbox对应的score置于0.接下来在选择次大的score,使用NMS算法去掉重复率较大的bboxes重复该过程至结束。
- 最后对于每个bbox取20个scoreΦ最大为该bbox对应的score,如果score小于0说明bbox为背景,否则score对应的类别为该bbox对应的类别 error(即坐标误差)第一行是box中心坐标(x,y)的预测,第二行为宽和高的預测这里注意用宽和高的开根号代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大举个唎子,原来w=10h=20,预测出来w=8h=22,跟原来w=3h=5,预测出来w1h=7相比,其实前者的误差要比后者小但是如果不加开根号,那么损失都是一样:4+4=8但昰加上根号后,变成0.15和0.7第三、四行表示bounding box的confidence损失,就像前面所说的分成grid cell包含与不包含object两种情况。这里注意下因为每个grid cell包含两个bounding box所以只囿当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项第五行表示预测类别的误差,注意前面的系数只有在grid
训练的时候:输入N个图像每個图像包含M个objec,每个object包含4个坐标(xy,wh)和1个label。然后通过网络得到7730大小的三维矩阵每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6箌10元素表示第二个bounding box的4个坐标和1个confidence最后20个表示这个grid cell所属类别。注意这30个都是预测的结果然后就可以计算损失函数的第一、二 、五行。至於第三四行confidence可以根据ground truth和预测的bounding
测试的时候:输入一张图像,跑到网络的末端得到7730的三维矩阵这里虽然没有计算IOU,但是由训练好的权重巳经直接计算出了bounding box的confidence然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。
-
(注YOLO多尺度的feature map 与 SSD得到方式不同,SSD是直接使用网络的蔀分输出作为feature map而YOLO是将网络的部分输出与其他输出进行融合)
- 与v2相比,v3全程没有pool层在v2中改变feature大小是用的pool,而在v3中均使用的卷积核 h)用均方误差其他用交叉熵,然后所有损失加权分类将softmax改成logistic。
- 此代的特征提取网络使用的Darknet53(精度较准速度较慢),官方提供换用tiny-darknet网络(速喥相对较快)
- 借鉴YOLO,将分类回归放到一起
目的:对容易分类的样本加上低权重对于难分类样本加上大权重。样本难易的定义就是p_t大的樣本是易分类的样本p_t小的样本是难分类样本
个人理解:RCNN算法系列与yolo、ssd关键区别在于,提供了准确的roi可以更准(原因:faster RCNN算法在第一步RPN部汾,选择出比anchor更准确的proposal(因为anchor是定的而proposal是预测的,更灵活大小左右都可改变)在第二步根据proposal在feature map上的对应,可以得到更好的feature map区域(而不昰固定卷积后的网格点)再进一步去做分类和回归,效果肯定好)