fast

2.6 Fast R-CNN

為{幸葍}努か 提交于 2019-11-28 14:07:08
目录 2.6 Fast R-CNN 2.6.1、Fast R-CNN 整体架构概览图 2.6.2、Fast R-CNN 架构 2.6.2.1 RoI 池化层 2.6.2.2 多任务损失 参考资料 2.6 Fast R-CNN Fast R-CNN 是 rgb 完成的 R-CNN 家族中的第二篇重要作品,在 R-CNN 以及 SPPNet 的基础上做了许多优化工作,在识别精度以及性能上均有较大提升。 2.6.1、Fast R-CNN 整体架构概览图 Fast R-CNN 的整体检测流程为:首先利用 CNN 网络在输入图像上进行特征提取,生成特征图,然后将区域候选框映射到特征图中,并经过 RoI 池化层,将任意大小的候选区域映射到一个固定大小的输出空间中,并接入全连接层。 在网络的顶层,我们接入两个同级输出层,实现分类与目标检测框的回归问题,具体流程如图 1、2 所示。 【图 1】 【图 2】 2.6.2、Fast R-CNN 架构 Fast R-CNN 是基于 R-CNN 及 SPP-Net 发展而来,因此其设计初衷就是为了改进现有模型中存在的一些缺陷,以寻求更高的精度及性能,因此我们需要首先分析 R-CNN 及 SPP-Net 存在的不足之处。 在 SPP-Net 章节,我们曾提到过 R-CNN 的劣势,现在我们再次分析综合分析其劣势,主要表现在:(1)训练过程是多阶段的

Fast R-CNN算法及具体训练步骤

自古美人都是妖i 提交于 2019-11-28 14:06:51
Fast R-CNN算法及其具体训练步骤 Fast R-CNN算法是R-CNN算法的进一步衍生算法,它通过引入ROI pooling层,避免了R-CNN算法对同一区域多次提取特征的情况从而提高了算法的运行速度,总体流程上虽然仍然无法实现端到端的训练,但是也在R-CNN算法的基础上有了很大的改进。 Fast R-CNN算法在训练时依然无法做到端到端的训练,故训练时依旧需要一些繁琐的步骤,网上很少有详细介绍的,作为初学者一开始很难理解具体应该怎么做。还有对于多目标图片数据集例如VOC数据集,该如何处理不同训练图片不同目标个数的情况,本文稍作介绍。 算法流程: Fast R-CNN算法示意图如下图1所示,检测步骤如下: 输入图像; 通过深度网络中的卷积层(VGG、Alexnet、Resnet等中的卷积层)对图像进行特征提取,得到图片的特征图; 通过选择性搜索算法得到图像的感兴趣区域(通常取2000个); 对得到的感兴趣区域进行ROI pooling(感兴趣区域池化):即通过坐标投影的方法,在特征图上得到输入图像中的感兴趣区域对应的特征区域,并对该区域进行最大值池化,这样就得到了感兴趣区域的特征,并且统一了特征大小,如图2所示; 对ROI pooling层的输出(及感兴趣区域对应的特征图最大值池化后的特征)作为每个感兴趣区域的特征向量; 将感兴趣区域的特征向量与全连接层相连

Fast R-CNN论文详解

我们两清 提交于 2019-11-28 14:06:38
R-CNN 出来以后,首次将卷积神经网络带入目标检测领域。随着SPP-Net等的出现对它的改进,受 SPP-Net 的启发, Fast R-CNN 出现了。 Fast R-CNN和R-CNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在PASCAL VOC 2007上的准确率相差无几,约在66%-67%之间。 一.Fast R-CNN所解决R-CNN的两个问题 1、测试和训练速度慢 R-CNN中用CNN对每一个候选区域反复提取特征,而一张图片的2000个候选区域之间有大量重叠部分,这一设定造成特征提取操作浪费大量计算。 Fast R-CNN将整个图像归一化后直接送入CNN网络,卷积层不进行候选区的特征提取,而是在最后一个池化层加入候选区域坐标信息,进行特征提取的计算。 2、训练所需空间大 R-CNN中目标分类与候选框的回归是独立的两个操作,并且需要大量特征作为训练样本。 Fast R-CNN将目标分类与候选框回归统一到CNN网络中来,不需要额外存储特征。 二、Fast R-cnn框架介绍 相比R-CNN最大的区别,在于RoI池化层和全连接层中目标分类与检测框回归微调的统一。 1、RoI池化层(RoI pooling layer) RoI池化层可以说是SPP(spatial pyramid pooling)的简化版

目标检测之 Fast R-CNN

人盡茶涼 提交于 2019-11-28 14:05:48
论文地址: Fast R-CNN 代码地址: rbgirshick/fast-rcnn Fast R-CNN是在 R-CNN 的基础上进行的改进,大致框架是一致的。总体而言,Fast R-CNN相对于R-CNN而言,主要提出了三个改进策略: 1. 提出了RoIPooling,避免了对提取的region proposals进行缩放到224x224,然后经过pre-trained CNN进行检测的步骤,加速了整个网络的learning与inference过程,这个是巨大的改进,并且RoIPooling是可导的,因此使得整个网络可以实现end-to-end learning,这个可以认为是Fast R-CNN相对于R-CNN最大的改进之处。 2. 采用了Multi-task loss进行边框回归,这个在R-CNN中也有这方面的实验。 3. 利用了截断的奇异值分解(Truncated SVD for faster detection)加速了网络。 下面图1是 Fast R-CNN的总体框图: 图1 Fast R-CNN网络架构 这个图已经表达的很清楚了,但是还是有些细节需要说明一下,如图2所示: 图2 Fast R-CNN 流程图 现在就按照图2的流程进行讲解。首先是读入一张图像,这里有两个分支,一路送入FCN,输出 feature maps,另一路通过selective

目标检测(R-CNN、Fast R-CNN、Fater R-CNN)

十年热恋 提交于 2019-11-28 14:05:35
目标检测(R-CNN、Fast R-CNN、Faster R-CNN) 1、目标检测(object detection) 图像识别是输入一张图像,输出该图像对应的类别。目标检测的输入同样是一张国像,但输出不单单是图像的类别,而是该图像中所含的所有目标物体以及它们的位置,通常使用矩形框来标识物体的位置。 大部分的目标检测方法流程是:生成区域候选框,对这些区域框提取特征(SIFT 特征 、HOG 特征、CNN),使用图像识别方法分类(SVM、CNN),得到所有分类成功的区域后,通过非极大值抑制( Non-maximum suppression )输出结果。 2、候选框(bounding boxes) 区域候选框的生成主要有两种方法,一种是穷举法、一种是选择性搜索。 穷举法 :也叫滑窗法。使用不同大小的窗口在图片上从左到右,从上到下滑动,每次滑动就是一个候选框,由于是全局搜索而且要考虑窗口的长宽比,计算量大、效率低下。 选择搜索 (Selective Search):首先,使用图像分割(边缘等特性)算法,分割出许多小区域;然后,根据这些小区域之间相似性(颜色、纹理等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做 bounding boxes (外切矩形)就生成了候选框。 3、R-CNN:Region-CNN R-CNN 算法原理: Selective

Fast R-CNN论文解读

妖精的绣舞 提交于 2019-11-28 14:05:19
论文链接: https://arxiv.org/abs/1504.08083 代码链接: https://github.com/rbgirshick/fast-rcnn . Abstract 这篇论文提出了一种基于卷积神经网络做目标检测的算法——Fast R-CNN,它是建立在之前R-CNN的基础上使用深度卷积神经网络进行高效的目标检测。Fast R-CNN做了几点创新来提高训练和测试阶段的速度,同时提高了检测的准确率。 Fast R-CNN使用的是VGG16网络,训练速度比R-CNN快了9倍,测试速度快了213倍,并且在PASCAL VOC 2012上实现了更高的map; 与SSPnet相比,Fast R-CNN训练速度快了3倍,测试速度快了10倍,并且准确率更高; 1. Introduction 目前深度神经网络已经极大的提高了图形分类和目标检测的精度,与图像分类相比,目标检测明显更为复杂,现在的方法在训练网络时会分多个阶段,这样会导致训练和运行时间过长。 目前检测有两个最基本的挑战: 如何产生候选框; 候选框只是提供了一个粗略的定位范围,所以需要进一步的修正才可以得到更精确的定位,这意味着我们的方法需要在速度、精度和简单性之间做权衡; 在本片论文中,我们简化了训练过程,提出了以一种单阶段的训练算法——分类和边框回归的loss合并,梯度回传。 1.1 R-CNN and

Fast R-CNN

早过忘川 提交于 2019-11-28 12:56:01
---恢复内容开始--- 与R-CNN的不同: 最后一个卷积层后跟一个ROI pooling(也就是pool5变成ROI pooling),再接全连接层; 使用多任务损失函数,将边框回归直接加到CNN中训练; 放弃SVM,改为softmax; Fast R-CNN是端到端的,解决了R-CNN的速度慢、空间大的缺点。 训练: 使用5个最大池化层和5~13个不等的卷积层的三种网络进行预训练:CaffeNet,VGG_CNN_M_1024,VGG-16,使用之前要先做出如下改动: 用RoI pooling layer取代网络的最后一个池化层 最后一个FC层和softmax被替换成fast R-CNN框架图介绍的两个并列层 输入两组数据到网络:一组图片和每一个图片的一组RoIs(分别由两个任务来负责); 对训练集中的图片,SS取出每个图片对应的一些proposal,对于每一个proposal,如果和ground truth中的proposal中的IOU值>=0.5,就把GT的标签信息给这个proposal,否则就标记为背景。 使用mini-batch=128,25%来自非背景标签的proposal,其余来自标记为背景的proposal,进行微调训练CNN,最后一层的结果包含分类信息和位置修正信息,用多任务的loss,一个是分类的损失函数,一个是位置的损失函数。 测试过程:

目标检测论文解读3——Fast R-CNN

跟風遠走 提交于 2019-11-27 19:28:19
背景    deep ConvNet兴起,VGG16应用在图像分类任务上表现良好,本文用VGG16来解决检测任务。SPP NET存在CNN层不能fine tuning的缺点,且之前的方法训练都是分为多个阶段,特征提取+SVM分类+边框回归,这些问题在Fast R-CNN上都得到了解决。 方法   网络模型采用VGG16结构,跟SPP NET相比有如下改进。    ROI pooling   将最后的max pooling层换成RoI pooling层,可以认为是SPP NET的特殊情况,只有一层金字塔,feature map被分为H*W个bin,作max pooling。    bbox regressor   网络末尾采用两个不同的全连接层,分别输出分类和位置结果,实现了end-to-end的训练过程。    CNNs参数更新   其实SPP NET也并不是不能更新CNNs的参数,只是这样开销太大,这是因为SPP NET先是将一堆图片的ROI求出来,打乱后随机取N张训练,这些ROI可能来自于很多不同的图片,这样如果要进行反向传播,必须保存这些图片训练中各层的feature map,开销巨大;Fast R-CNN采用了分层的思想,只在R=2张原图中取N个ROI,这样只用计算存储两张图片,开销大大降低。 总结    是在 SPP NET的基础上做出的改进,让训练过程变成end-to

链表归并排序

允我心安 提交于 2019-11-27 19:18:55
class Solution { public ListNode sortList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode slow = head, fast = head, prev = head; while (fast != null && fast.next != null) { prev = slow; slow = slow.next; fast = fast.next.next; } prev.next = null; ListNode list1 = sortList(head); ListNode list2 = sortList(slow); return merge(list1, list2); } public ListNode merge(ListNode list1, ListNode list2) { ListNode dummy = new ListNode(-1), curr = dummy; while (list1 != null && list2 != null) { if (list1.val < list2.val) { curr.next = list1; list1 = list1.next; } else {

leetcode 234 回文链表

妖精的绣舞 提交于 2019-11-27 13:01:11
题目 请判断一个链表是否为回文链表。 解题思路 反转链表的后半段。 C++代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool isPalindrome(ListNode* head) { if(head == NULL || head->next == NULL) return true; ListNode* slow = head; ListNode* fast = head; while(fast->next) { slow = slow->next; fast = fast->next; if(fast->next) fast = fast->next; } fast = slow->next; slow->next = NULL; while(fast) { ListNode *p = fast->next; fast->next = slow; slow = fast; fast = p; } fast = slow; slow = head; while(slow && fast)