目标提取深度神经网络分析权衡 trade offs
- RCNN: 直接使用object proposal 方法得到image crops 送入神经网络中,但是crops 的大小不一样,因此使用 ROI Pooling,这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,这个ROI pooling 类似普通的pooling, 但是图像大小不固定。比如某个ROI区域坐标为 (x1,y1,x2,y2) ,那么输入size为 (y2−y1)∗(x2−x1) ,如果pooling的输出size为 pooled_height∗pooled_width ,那么每个网格的size为 (y2−y1)pooled_height∗(x2−x1)/pooled_width. 但是这些 crops 之间要重复计算特征。 (代码见roi_pooling_layer.cpp中的Forward_cpu,对于backward 见下图)
- Fast RCNN: 解决RCNN中重复计算的问题,将整幅图像(push the entire image once through a feature extractor) 送入一个特征提取器中,对object proposals 在得到的feature上进行crop。 因此share the feature extraction.
但是RCNN 和 Fast RCNN都依赖于 额外的object proposal 方法。接下来,就有各种大牛提出的使用神经网络进行object proposal 的方法,然后对这些proposals(论文中叫anchors)进行分类和回归shift to fit the GT(通常通过最小化分类和回归结合的损失函数),对于一个anchor a, 首先找最好匹配的ground truth box, 如果找到了,则为‘positive anchor’,我们赋予对应的class label, encode 这个box
。如果没有找到匹配的,这个anchor的label set to 0.
if an anchor is encoding as
, the loss of the anchor is:
第一部分loss 是 regression of localization 的 loss, 第二部分loss 是 classification 的loss。
通俗地讲,SSD,YOLO,Faster RCNN等都是在原图上预先画了很多个框框,然后判断这些框框是不是前景.这和传统的滑窗有点像,anchor代表了不同size和比例的滑窗.但feature map的感受野更大一点,特征提取的也更好.
- SSD:这个方法中使用了multibox 和 RPN(faster rcnn)进行 box proposal。faster R-CNN是通过改变Anchor的大小来实现scalable的,SSD是改变Feature map大小来实现的。 将输出一系列 或者 4×4 之后的一个个 格子;而 default box 就是每一个格子上,一系列固定大小的 box,即图中虚线所形成的一系列 boxes。产生一系列 固定大小(fixed-size) 的 bounding boxes,以及每一个 box 中包含物体实例的可能性。
损失函数:这个与Faster R-CNN中的RPN是一样的,不过RPN是预测box里面有object或者没有,所以,没有分类,SSD直接用的softmax分类。location的损失,还是一样,都是用predict box和default box/Anchor的差 与 ground truth box和default box/Anchor的差 进行对比,求损失。


YOLO 和 SSD

- Faster RCNN: detection happens in two stages. the first one is region proposal network(RPN). the second stage, the box proposals are used to crop features from the conv5 to feed to the remainder nets(fc6 and fc7) in order to predict the class and box refinement. (each anchors obtained by RPN, would be duplicated computated. so the running time depends on the number of regions proposed by RPN).
RPN 详解:
论文中将 conv5 得到的feature map手动划分为n*n的矩形框(从SSD 学习得到)(论文中设为n=3,3虽然很小,但是在高层feature map的size也很小,因此矩形框可以感知很大范围)。 准备后续选取proposals,对每个矩形窗口的中心点当做一个基准点, 然后绕着这个基准点选取k(k=9)个不同scale , aspect ratio 的anchor(论文中3个scale,3个aspect ratio)对于每个anchor在后面使用softmax进行二分类, 有两个score输出用来表示是一个物体的概率和不是一个物体的概率, 然后再接上一个bounding box 的regressor。

但是RPN也有缺点,最大的问题就是对小物体检测效果很差,假设输入为512*512,经过网络后得到的feature map是32*32,那么feature map上的一个点就要负责周围至少是16*16的一个区域的特征表达,那对于在原图上很小的物体它的特征就难以得到充分的表示,因此检测效果比较差。但是 SSD相当好一些,因为它可以理解有multi-scale 的RPN。而最后一层的feature map往往都比较抽象,对于小物体不能很好地表达特征,而SSD允许从CNN各个level的feature map预测检测结果,这样就能很好地适应不同scale的物体,对于小物体可以由更底层的feature map做预测。这就是SSD和RPN最大的不同,其他地方几乎一样。
rpn二分类,是在conv4 这一层feature map上再进行1x1的卷积生成512-d或256-d的向量判断当前9个anchor是不是有Object.
SSD细分类,然后会在多层feature map上面预测,预测预先确定好了'anchor'是什么Object.弥补了yolo只在最后一层分成7x7的框,捡了许多漏检的.
RPN的loss函数可以表示为:

在训练时,要选择正负样本,不然负样本过多,对正样本的预测准确率很低。多任务训练,提出来不同的方法:
1)alternating training训练时,先独立训练RPN,然后用RPN的网络权重对Fast RCNN网络进行初始化,并用RPN输出的proposal作为Fast RCNN的输入,不断迭代这个过程。
2) approximate joint training: 将RPN与 Fast RCNN 融入一起训练。 ignore the derivative of the proposal boxes
3) Non- approximate training: 对立与上一种方法。不ignore。

- YOLO: Faster RCNN需要对anchor box进行判断是否是物体,然后再进行物体识别,分成了两步。
YOLO(You Only Look Once)则把物体框的选择与识别进行了结合,一步输出,即变成”You Only Look Once”。 加快速度的YOLO带来了一定的局限性,由于出事图片需要被缩放到固定大小,可能对不同缩放比例的物体覆盖不全,每一个单元格只能用来选择一个物体框,并只预测一个类别,所以当多个物体中心落入一个单元格使,YOLO无法识别到小物体。 - 把缩放成统一大小的图片分割成S×S的单元格
- 每一个单元格负责输出B个矩形框,每一个框带四个位置信息(x, y, w, h),与一个该框是物体的概率,用Pr(Object)或者C(Confidence)表示
- 每一个单元格再负责输出C个类别的概率,用Pr(Class∣Object)表示
- 最终输出层应有S×S×(B∗5+C)个单元
- R-FCN
Faster RCNN 中最后fc6 和 fc7 的特征计算是重复计算,在R-FCN提出了一种提高的方法。将Crop放在网络的最后相当于网络中没有fully connect layer,所有都是用convolutional layer 实现。
目标提取深度神经网络分析权衡 trade offs的更多相关文章
- (转载)微软数据挖掘算法:Microsoft 神经网络分析算法(10)
前言 有段时间没有进行我们的微软数据挖掘算法系列了,最近手头有点忙,鉴于上一篇的神经网络分析算法原理篇后,本篇将是一个实操篇,当然前面我们总结了其它的微软一系列算法,为了方便大家阅读,我特地整理了一篇 ...
- (转载)微软数据挖掘算法:Microsoft 神经网络分析算法原理篇(9)
前言 本篇文章继续我们的微软挖掘系列算法总结,前几篇文章已经将相关的主要算法做了详细的介绍,我为了展示方便,特地的整理了一个目录提纲篇:大数据时代:深入浅出微软数据挖掘算法总结连载,有兴趣的童鞋可以点 ...
- 深度神经网络结构以及Pre-Training的理解
Logistic回归.传统多层神经网络 1.1 线性回归.线性神经网络.Logistic/Softmax回归 线性回归是用于数据拟合的常规手段,其任务是优化目标函数:$h(\theta )=\thet ...
- 目标检测——深度学习下的小目标检测(检测难的原因和Tricks)
小目标难检测原因 主要原因 (1)小目标在原图中尺寸比较小,通用目标检测模型中,一般的基础骨干神经网络(VGG系列和Resnet系列)都有几次下采样处理,导致小目标在特征图的尺寸基本上只有个位数的像素 ...
- 以resnet作为前置网络的ssd目标提取检测
http://blog.csdn.net/zhangjunbob/article/details/53119959
- 转pytorch中训练深度神经网络模型的关键知识点
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_42279044/articl ...
- Scriptable Render Pipeline
Scriptable Render Pipeline SRP的核心是一堆API集合,使得整个渲染过程及相关配置暴露给用户,使得用户可以精确地控制项目的渲染流程. SRP API为原有的Unity构件提 ...
- 深度学习 + OpenCV,Python实现实时视频目标检测
使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加入原有的目标检测功能. 在本文中我们将学习如何扩展原有的目标检测项 ...
- Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用
摘要 近年来,深度学习方法在物体跟踪领域有不少成功应用,并逐渐在性能上超越传统方法.本文先对现有基于深度学习的目标跟踪算法进行了分类梳理,后续会分篇对各个算法进行详细描述. 看上方给出的3张图片,它们 ...
随机推荐
- codeforces279B
Books CodeForces - 279B When Valera has got some free time, he goes to the library to read some book ...
- php-编译模块1
在路径中找到phpize 在需要编译的模块文件夹中执行 如: /usr/bin/phpize Configuring for: PHP Api Version: 20131106 Zend Modul ...
- NOIP 2018 游记(退役了!)
一片空白 在霉的不能再霉的18年11月,Noip2018上,倒霉的我也是贼有意思,感冒加身,D2发烧,数组开小…我还能说什么MMP,身体和考试能力真的很重要. ……(省略无数字的心理活动,有空补上~) ...
- WordPress发送注册用户设置密码邮件提示:您的密码重设链接无效,请在下方请求新链接
1.修改WP根目录下的 wp-login.php文件将 $message .= '<' . network_site_url("wp-login.php?action=rp&k ...
- LightOJ - 1356 Prime Independence (二分图 最大独立集 素数打表)
题意: 给你一个集合,让你从这个集合中挑选出几个数,使得这几个数中任意两个数相除后的值不能为素数 即挑选出来的这几个数不能互相冲突 最大独立集 = 所有点数 - 最大匹配数 呵..呵...原先用的二维 ...
- tjoi2018D2T2(luogu4590) 游园会 (状压dp)
题解劝退系列 设长的那个串是A,短的那个串是B. 那我们在如果已经知道某个A的时候,A[1..i]和B[1..j]的最长公共子序列$f[i][j]=max\{f[i-1][j],f[i][j-1],f ...
- A1085. Perfect Sequence
Given a sequence of positive integers and another positive integer p. The sequence is said to be a & ...
- Boost filessystem...
CMakeList.txt: cmake_minimum_required(VERSION 3.8) project(Demo) ) set(SOURCE_FILES main.cpp) //需要添加 ...
- 使用gdb+core查看错误信息
core的使用Linux下core文件调试方法 ulimit -c xxx可以设置core文件的大小 proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式. ...
- 接口interface、实现接口implements
接口实现类的多重继承,即一个类有多个父类. interface定义接口: interface 接口名 [extends 父接口名列表]{ 变量: 方法: } implements实现接口: class ...
