资讯专栏INFORMATION COLUMN

目标检测经典算法和API详解(笔记)

不知名网友 / 2765人阅读

摘要:知道目标检测的定义。目标检测框的中心点坐标。提取分类的目标检测框架。

文章目录

商品目标检测

1. 目标检测概述

1.1.项目演示介绍

学习目标

  • 了解项目的演示结果

1.1.1 项目演示

项目已经部署上线,Web端+小程序端演示

1.1.2 项目结构

1.1.3 项目安排

  • 第一阶段:算法模型
    。RCNN以及相关算法
    。YOLO与SSD
    。算法接口介绍
  • 第二阶段:数据集处理
    。 数据集标记格式
    。 数据集存储与读取
  • 第三阶段:项目实现
    。 数据接口实现
    。 模型接口实现
    。 训练、设备部署逻辑实现
    。 测试接口
    。 TensorFlow serving部署模型
    。 Web server+TensorFlow serving Client
    。 小程序

1.2 图像识别背景

学习目标

  • 目标
    。了解图像识别的三大任务
    。 图像识别的两种模式

1.2.1 图像识别三大任务

  • 目标识别:或者说分类,定性目标,确定目标是什么(图a)

  • 目标检测定位目标,确定目标是什么以及位置(图b)

  • 目标分割:像素级的对前景与背景进行分类,将背景剔除(图c,图d)

目标检测:技术成熟并且使用更多的场景

目标分割:适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。

1.2.2 图像识别的发展

  • 通用场景
    谷歌、微软、Meta、百度、阿里巴巴在内的科技巨头都花费了大量的人力财力做研究,搭建了很多图像识别的平台。
  • 垂直场景
    。 医疗领域:医疗影像的检测
    。 林木产业:木板树种检测识别

垂直应用场景里的行业特质挖掘和经验积累往往会被忽视,所以在垂直领域的行业中大量的公司正在开发相当多的图像应用。

1.3 什么是目标检测

学习目标

  • 目标
    。 知道目标检测的定义
    。 了解目标检测的技术发展历史

1.3.2 目标检测定义

识别图片中有哪些物体以及物体的位置(坐标位置)


目标检测的位置信息一般由两种格式(以图片左上角为原点(0,0)):

  • 极坐标表示:(xmin, ymin, xmax, ymax)
    。 xmin,ymin:x,y坐标的最小值
    。 xmax,ymax:x,y坐标的最大值
  • 中心点坐标:(x_center, y_center, w, h)
    。 x_center, y_center:目标检测框的中心点坐标
    。 w,h:目标检测框的宽、高

假设这个图像是1000x800,所有这些坐标都是构建在像素层面上:


中心点坐标结果如下:

1.3.2 目标检测的技术发展史

  • 传统目标检测方法(候选区域+手工特征提取+分类器)
    。 HOG+SVM、DPM
  • region proposal+CNN提取分类的目标检测框架
    。 (R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN)
  • 端到端(End-to-End)的目标检测框架
    YOLO、SSD

1.4 目标检测的应用场景

  • 公安行业的应用
    公安行业用户的迫切需求是在海量的视频信息中,发现犯罪嫌疑人的线索。人工智能在视频内容的特征提取、内容理解方面有着天然的优势。可实时分析视频内容,检测运动对象,识别人、车属性信息,并通过网络传递到后端人工智能的中心数据库进行存储。

  • 农作物的应用
    。 农业中农作物表面的病虫害识别也需要用到目标检测技术

  • 医疗影像检测
    人工智能在医学中的应用目前是一个热门的话题,医学影像图像中病变部位检测和识别对于诊断的自动化,提供优质的治疗具有重要的意义。

  • 电商行业的应用
    电商行业中充满无数的商品,利用检测功能查询相关商品,快速找到用户需要的商品类型或者品牌类别,从而提高电商领域的用户满意度

  • 道路检测

  • 动物检测

  • 商品检测

  • 车牌检测

  • 菜品检测

  • 车型检测

1.5. 开发环境搭建

安装GPU版本的Tensorflow

2. 目标检测算法原理

了解目标检测算法分类知道目标检测的常见指标IoU了解目标定位的简单实现方式了解Overfeat模型的移动窗口方法说明R-CNN的完整结构过程了解选择性搜索了解Crop+Warp的作用知道NMS的过程以及作用了解候选区域修正过程说明R-CNN的训练过程说明R-CNN的缺点说明SPPNet的特点说明SPP层的作用了解Fast R-CNN的结构特点说明RoI的特点了解多任务损失了解Faster R-CNN的特点知道RPN的原理以及作用知道YOLO的网络结构知道单元格的意义知道YOLO的损失知道SSD的结构说明Detector & classifier的作用说明SSD的优点知道TensorFlow的SSD接口意义

2.1 目标检测任务描述目标

  • 了解目标检测算法分类
  • 知道目标检测的常见指标IoU
  • 了解目标定位的简单实现方式

2.1.1 目标检测算法分类

  • 两步走的目标检测:先进行区域推荐,而后进行目标分类
    代表:R-CNN、SPP-net、Fast R-CNN、Faster R-CNN

  • 端到端的目标检测:采用一个网络一步到位
    代表:YOLO、SSD

2.1.2 目标检测的任务

2.1.2.1 分类原理回顾

先来回归下分类的原理,这是一个常见的CNN组成图,输入一张图片,经过其中卷积、激活、池化相关层,最后加入全连接层达到分类概率的效果

  • 分类的损失与优化
    在训练的时候需要计算每个样本的损失,那么CNN做分类的时候使用softmax函数计算结果,损失为交叉熵损失
  • 常见的CNN模型

    对于目标检测来说不仅仅是分类这样简单的一个图片输出一个结果,而且还需要输出图片中目标的位置信息,所以从分类到检测,如下图标记了过程:
  • 分类是得到每个类别的概率,比较得到最大概率
    softmax进行计算概率,交叉熵损失衡量
  • 分类+定位 (只有 一个对象的时候)
  • 目标检测

2.1.2.2 检测的任务

  • 分类:
    N个类别
    输入:图片
    输出:类别标签
    评估指标:Accuracy
  • 定位:
    N个类别
    输入:图片
    输出:物体的位置坐标
    主要评估指标:IOU

    其中我们得出来的(x,y,w,h)有一个专业的名词,叫做bounding box(bbox).

2.1.2.3 两种Bounding box名称

在目标检测当中,对bbox主要由两种类别。

  • Ground-truth bounding box:图片当中真实标记的框
  • Predicted bounding box:预测的时候标记的框

    一般在目标检测当中,我们预测的框有可能很多个,真实框GT也有很多个。

2.1.2.4 检测的评价指标

任务description输入输出评价标准
Detection and Localization (检测和定位)在输入图片中找出存在的物体类别和位置(可能存在多种物体)图片(image )类别标签(categories)和 位置(bbox(x,y,w,h))IoU (Intersection over Union) mAP (Mean Average Precision)
  • IoU(交并比)
    两个区域的重叠程度overlap:侯选区域和标定区域的IoU值

2.1.4 目标定位的简单实现

在分类的时候我们直接输出各个类别的概率,如果再加上定位的话,我们可以考虑在网络的最后输出加上位置信息。

2.1.4.1 回归位置

增加一个全连接层,即为FC1、FC2

  • FC1:作为类别的输出

  • FC2:作为这个物体位置数值的输出

    假设有10个类别,输出[p1,p2,p3,…,p10],然后输出这一个对象的四个位置信息[x,y,w,h]。同理知道要网络输出什么,如果衡量整个网络的损失

  • 对于分类的概率,还是使用交叉熵损失

  • 位置信息具体的数值,可使用MSE均方误差损失(L2损失)

如下图所示:为什么输出两个全连接层?

  • 让网络多输出一个全连接层。
  • 第一个全连接层是输出概率值
  • 第二个全连接层是输出四个位置目标(回归算法输出)

2.1.4.2 位置数值的处理

对于输出的位置信息是四个比较大的像素大小值,在回归的时候不适合。目前统一的做法是,每个位置除以图片本身像素大小。

假设以中心坐标方式,那么x = x / x_image, y / y_image, w / x_image, h / y_image,也就是这几个点最后都变成了0~1之间的值(归一化)。

2.2 R-CNN

目标:

  • 了解Overfeat模型的移动窗口方法
  • 说明R-CNN的完整结构过程
  • 了解选择性搜索
  • 了解Crop+Warp的作用
  • 知道NMS的过程以及作用
  • 了解候选区域修正过程
  • 说明R-CNN的训练过程
  • 说明R-CNN的缺点

对于一张图片当中多个目标,多个类别的时候。前面的输出结果是不定的,有可能是以下有四个类别输出这种情况。或者N个结果,这样的话,网络模型输出结构不定

所以需要一些他的方法解决目标检测(多个目标)的问题,试图将一个检测问题简化成分类问题

2.2.1 目标检测-Overfeat模型

2.2.1.1 滑动窗口

目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。如下图所示:

这样就变成每张子图片输出类别以及位置,变成分类问题。但是滑动窗口需要初始设定一个固定大小的窗口,这就遇到了一个问题,有些物体适应的框不一样,所以需要提前设定K个窗口,每个窗口滑动提取M个,总共K x M 个图片,通常会直接将图像变形转换成固定大小的图像,变形图像块被输入 CNN 分类器中,提取特征后,我们使用一些分类器识别类别和该边界框的另一个线性回归器。

2.2.1.2 训练数据集

首先我们会准备所需要的训练集数据,每张图片的若干个子图片以及每张图片的类别位置,如下我们从某张图片中滑动出的若干的图片。

2.2.1.3 Overfeat模型总结

这种方法类似一种暴力穷举的方式,会消耗大量的计算力量,并且由于窗口大小问题可能会造成效果不准确。但是提供了一种解决目标检测问题的思路

  • 滑动窗口:提供K种滑动窗口,每个滑动窗口产生M个子图。
  • 再对每个子图进行分类、回归

2.2.2 目标检测-R-CNN模型

在CVPR 2014年中Ross Girshick提出R-CNN。

2.2.2.1 完整R-CNN结构

不使用暴力方法,而是用候选区域方法(region proposal method),用的是SS(选择性搜索)方法 ,创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型 ,R-CNN在当时以优异的性能令世人瞩目,以R-CNN为基点,后续的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路。

  • 步骤(以AlexNet网络为基准)

    1. 找出图片中可能存在目标的侯选区域region proposal(采用选择性搜索SS的方法)
    2 进行图片大小调整为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成2000×4096维矩阵
    3. 将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000×20维矩阵
    4. 分别对2000×20维矩阵中每一列即每一类进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到该列即该类中得分最高的一些建议框
    5. 修正bbox,对bbox做回归微调

2.2.2.2 候选区域(了解)


选择性搜索(SelectiveSearch,SS)中
,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。

SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。

2.2.2.3 Crop + Warp (了解)

传统的CNN限制了输入必须固定大小,所以在实际使用中往往需要对原图片进行crop或者warp(图片大小的调整)的操作

  • crop:截取原图片的一个固定大小的patch
  • warp:将原图片的ROI缩放到一个固定大小的patch
  • 以上两个步骤可以减少图片的变形(减小市失真),并统一图片的大小

无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。会使用一些方法尽量让图片保持最小的变形。

  • 1.各向异性缩放:即直接缩放到指定大小,这可能会造成不必要的图像失真

  • 2.各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色

2.2.2.4 CNN网络提取特征

  • CNN网络提取特征,得出2000个特征向量
  • 使用AlexNet结构,输入图片要去227*227
  • 提取出的特征会保存在磁盘中
  • 提取出(2000,4096)个特特征

在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据。

2.2.2.5 特征向量训练分类器SVM(二分类)

  • SVM分类对2000个候选区域分类,分类出的是目标和背景,两种类型 。如果第一个SVM是对猫分类,分类出要么是猫,要么是背景。
  • 得出2000*20的得分矩阵
    假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。那么最后需要对这些特征进行分类,R-CNN选用SVM进行二分类。假设检测N个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,如下图所示

  • 每个SVM分类器做的事情
    判断2000个候选区域是某类别,还是背景

2.2.2.6 非极大抑制(NMS)

  • 目的
    筛选候选区域,得到最终候选区域结果
  • 迭代过程
    对于所有的2000个候选区域得分进行概率筛选
    然后对剩余的候选框,每个类别进行IoU(交并比)>= 0.5 筛选

    假设现在滑动窗口有:A、B、C、D、E 5个候选框,
  • 得分(score)是指从SVM种输出的概率
  • 第一轮:假设B是得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,剔除DE,B作为一个预测结果
  • 第二轮:AC中,A的得分最高,与A计算IoU,C的结果>0.5,剔除C,A作为一个结果
    最终结果为在这个5个中检测出了两个目标为A和B

2.2.2.2 修正候选区域

  • 通过线性回归,特征值是候选区域,目标是对应的Ground-Truth。
  • 建立回归方程修正参数
    那么通过 NMS 筛选出来的候选框不一定就非常准确怎么办?R-CNN提供了这样的方法,建立一个bbox regressor
  • 回归用于修正筛选后的候选区域,使之回归于ground-truth,默认认为这两个框之间是线性关系,因为在最后筛选出来的候选区域和ground-truth很接近了

修正过程(线性回归)

  • 给定:anchor A=(A_{x}, A_{y}, A_{w}, A_{h}) 和 GT=[G_{x}, G_{y}, G_{w}, G_{h}]
  • 寻找一种变换F,使得:,其中

2.2.3 R-CNN训练过程

R-CNN的训练过程这些部分,正负样本准备+预训练+微调网络+训练SVM+训练边框回归器

2.2.3.1 正负样本准备

对于训练集中的所有图像,采用selective search方式来获取,最后每个图像得到2000个region proposal。但是每个图像不是所有的候选区域都会拿去训练。保证正负样本比例1:3.

样本描述
正样本某个region proposal和当前图像上的所有ground truth中重叠面积最大的那个的IOU大于等于0.5,则该region proposal作为这个ground truth类别的正样本
负样本某个region proposal和当前图像上的所有ground truth中重叠面积最大的那个的IOU都小于0.5,则该region proposal作为这个ground truth类别的负样本

这样得出若干个候选区域以及对应的标记结果。

2.2.3.2 预训练(pre-training)

CNN模型层数多,模型的容量大,通常会采用2012年的著名网络AlexNet来学习特征,包含5个卷积层和2个全连接层,利用大数据集训练一个分类器,比如著名的ImageNet比赛的数据集,来训练AlexNet,保存其中的模型参数。

2.2.3.3 微调(fine-tuning):等于迁移学习

AlexNet是针对ImageNet训练出来的模型,卷积部分可以作为一个好的特征提取器,后面的全连接层可以理解为一个好的分类器。R-CNN需要在现有的模型上微调卷积参数。

  • 将第一步中得到的样本进行尺寸变换,使得大小一致,然后作为预训练好的网络的输入,继续训练网络(迁移学习)

2.2.3.4 SVM分类器

**针对每个类别训练一个SVM的二分类器。**举例:猫的SVM分类器,输入维度是2000 4096,目标还是之前第一步标记是否属于该类别猫,训练结果是得到SVM的权重矩阵W,W的维度是4096 * 20。

2.2.3.5 bbox回归器训练

只对那些跟ground truth的IoU超过某个阈值且IOU最大的region proposal回归,其余的region proposal不参与。

2.2.4 R-CNN测试过程

输入一张图像,利用selective search得到2000个region proposal。

  • 对所有region proposal变换到固定尺寸并作为已训练好的CNN网络的输入,每个候选框得到的4096维特征

  • 采用已训练好的每个类别的svm分类器对提取到的特征打分,所以SVM的weight matrix是4096 * N,N是类别数,这里一共有20个SVM, 得分矩阵是2000 * 20

  • 采用non-maximun suppression(NMS)去掉候选框

  • 第上一步得到region proposal进行回归。

2.2.5 R-CNN总结

  • 表现
    在VOC2007数据集上的平均精确度达到66%

2.2.5.2 缺点

  • 1、训练阶段多:步骤繁琐: 微调网络+训练SVM+训练边框回归器。

  • 2、训练耗时:占用磁盘空间大:5000张图像产生几百G的特征文件。(VOC数据集的检测结果,因为SVM的存在)

  • 3、处理速度慢: 使用GPU, VGG16模型处理一张图像需要47s。

  • 4、图片形状变化:候选区域要经过crop/warp进行固定大小,无法保证图片不变形

2.2.6 总结与掌握

  • 掌握Overfeat模型思路
    滑动窗口
  • 掌握R-CNN的流程
  • 掌握训练过程
    预训练
    微调
    SVM+bbox regressor训练
  • R-CNN的缺点
  • 占用磁盘空间大
  • 训练耗时
  • 训练阶段多
  • 处理速度慢
  • 图片变形问题
  • R-CNN的问题解决思路:
  • SPPNet:只对一张图片进行全部卷积计算,并且去除Crop和Wrap操作。
  • 映射
    image —>SS —> 候选区域
    image —>CNN —> 特征图
    将候选区域映射到特征图中,得出每个候选区域的特征向量
  • SPP层(又叫金字塔层)
    对M个候选区域,每个都要经过SPP层进行变换
    把每个候选区域进行分块:4 * 4 ;2 * 2 ;1 * 1;
    输出: 每个候选区域的特征向量 都为21 * 256 (不同网络卷积输出的通道数可能不一样)
    这样长度固定了,特征向量也有了

2.2.7 问题?

1、R-CNN实现候选区域的有效算法是?

2、R-CNN算法中如果有得出了2000个候选框,总共有120种类别,请问特征提取之后的SVM分类器应该为多少个?

3、NMS的过程描述?以及作用?

4、请说明候选框的修正过程?

5、请描述微调过程的样本比例选择?

6、请描述R-CNN的训练和测试过程?

2.3 SPPNet

学习目标:

  • 说明SPPNet的特点
  • 说明SPP层的作用

R-CNN的速度慢在哪?

每个候选区域都进行了卷积操作提取特征。

2.3.1 SPPNet

SPPNet主要存在两点改进地方,提出了SPP层

  • 减少卷积计算
  • 防止图片内容变形
R-CNN模型SPPNet模型
1、R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像 2、固定大小的图像塞给CNN 传给后面的层做训练回归分类操作1、SPPNet把全图塞给CNN得到全图的feature map 2、让候选区域与feature map直接映射,得到候选区域的映射特征向量 3、映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层

2.3.1.1 映射

原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域,现在需要将基于原始图片的候选区域映射到feature map中的特征向量。映射过程图参考如下:

整个映射过程有具体的公式,如下
假设(x′,y′)(x′,y′)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:(x,y)=(S∗x′,S∗y′),即

  • 左上角的点:
    x′=[x/S]+1
  • 右下角的点:
    x′=[x/S]−1

其中 SS 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为=16
拓展:如果关注这个公式怎么计算出来,请参考:

2.3.1.2 spatial pyramid pooling

通过spatial pyramid pooling 将任意大小的特征图转换成固定大小的特征向量
示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。接着在这个特征图中找到每一个候选区域映射的区域,spp layer会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如下图:

2.3.2 SPPNet总结

来看下SPPNet的完整结构

  • 优点
    SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间, 后面的Fast R-CNN等也是受SPPNet的启发
  • 缺点
    训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)
    分阶段训练网络:选取候选区域、训练CNN、训练SVM、训练bbox回归器, SPP-Net在fine-tuning阶段无法使用反向传播微调SPP-Net前面的Conv层

2.3.3 总结

  • 掌握SPP的池化作用
  • 掌握SPP的优缺点

2.3.4 问题?

1、SPPNet的映射过程描述?公式?

2、spatial pyramid pooling的过程?

3、SPPNet相对于R-CNN的改进地方?

3.4 Fast R-CNN

  • 目标
    了解Fast R-CNN的结构特点
    说明RoI pooling的特点
    了解多任务损失

SPPNet的性能已经得到很大的改善,但是由于网络之间不统一训练,造成很大的麻烦,所以接下来的Fast R-CNN就是为了解决这样的问题

3.4.1 Fast R-CNN相对于R-CNN改进的部分

  • 改进的地方:
    提出一个RoI pooling,然后整合整个模型,把CNN、SPP变换层、分类器、bbox回归几个模块一起训练
  • 步骤
  • 首先将整个图片输入到一个基础卷积网络,得到整张图的feature map
  • 将region proposal(RoI)映射到feature map中
  • RoI pooling layer提取一个固定长度的特征向量,每个特征会输入到一系列全连接层,得到一个RoI特征向量(此步骤是对每一个候选区域都会进行同样的操作)
    1. 其中一个是传统softmax层进行分类,输出类别有K个类别加上”背景”类
    1. 另一个是bounding box regressor

2.4.1.1 RoI pooling首先RoI pooling只是一个简单版本的SPP,目的是为了减少计算时间并且得出固定长度的向量。

  • RoI池层使用最大池化将任何有效的RoI区域内的特征转换成具有H×W的固定空间范围的小feature map,其中H和W是超参数 它们独立于任何特定的RoI。

    例如:VGG16 的第一个 FC 层的输入是 7 x 7 x 512,其中 512 表示 feature map 的层数。在经过 pooling 操作后,其特征输出维度满足 H x W。假设输出的结果与FC层要求大小不一致,对原本 max pooling 的单位网格进行调整,使得 pooling 的每个网格大小动态调整为 h/H,w/W, 最终得到的特征维度都是 HxWxD。

    它要求 Pooling 后的特征为 7 x 7 x512,如果碰巧 ROI 区域只有 6 x 6 大小怎么办?每个网格的大小取 6/7=0.85 , 6/7=0.85,以长宽为例,按照这样的间隔取网格:[0,0.85,1.7,2.55,3.4,4.25,5.1,5.95],取整后,每个网格对应的起始坐标为:[0,1,2,3,3,4,5]

    为什么要设计单个尺度呢?这要涉及到single scale与multi scale两者的优缺点

  • single scale,直接将image定为某种scale,直接输入网络来训练即可。(Fast R-CNN)

  • multi scal,也就是要生成一个金字塔,然后对于object,在金字塔上找到一个大小比较接近227x227的投影版本

后者比前者更加准确些,没有突更多,但是第一种时间要省很多,所以实际采用的是第一个策略,因此Fast R-CNN要比SPPNet快很多也是因为这里的原因。

2.4.1.3 End-to-End model

从输入端到输出端直接用一个神经网络相连,整体优化目标函数。
接着我们来看为什么后面的整个网络能进行统一训练?
特征提取CNN的训练和SVM分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,去掉了SVM分类这一过程,所有特征都存储在内存中,不占用硬盘空间,形成了End-to-End模型proposal除外,end-to-end在Faster-RCNN中得以完善)

  • 使用了softmax分类
  • RoI pooling能进行反向传播,SPP层不适合(关于感受野的东西,可以自己去了解)

2.4.2 多任务损失-Multi-task loss

两个loss,分别是:

  • 对于分类loss,是一个N+1路的softmax输出,其中的N是类别个数1是背景(region proposal 会被标记为0, 什么都没有),使用交叉熵损失
  • 对于回归loss,是一个4xN路输出的regressor,也就是说对于每个类别都会训练一个多带带的regressor的意思,使用平均绝对误差(MAE)损失即L1损失
  • fine-tuning训练:
    在微调时,调整 CNN+RoI pooling+softmax+bbox regressor网络当中的参数,除了region proposal(采用的还是SS)不能一起训练。

3.4.3 R-CNN、SPPNet、Fast R-CNN效果对比

参数R-CNNSPPNetFast R-CNN
训练时间(h)84259.5
测试时间/图片47.0s2.3s0.32s
mAP66.063.166.9

其中有一项指标为mAP,这是一个对算法评估准确率的指标,mAP衡量的是学出的模型在所有类别上的好坏

2.4.4 Fast R-CNN总结

  • 缺点
    使用Selective Search提取Region Proposals,没有实现真正意义上的端对端,操作也十分耗时

2.4.5 总结

  • 掌握Fast R-CNN的改进
  1. 修改SVM分类为softmax分类,输出N个分类和一个背景
  2. softmax + Rol-Pooling一起训练
  • 掌握RoI pooling的作用
  • 掌握多任务损失结构

1、详细说明RoI pooling过程?

2、Fast R-CNN的损失是怎么样的?

2.5 Faster R-CNN

结构:

  • 区域生成网络(RPN)+ FastRCNN网络
  • 步骤
  1. 输入任意大小的图片,经过CNN网络输出特征图,特征图共享于后面两个步骤
  2. 特征图经过 PRN 生成候选区域
  3. 候选区域于特征图共同输入到Rol pooling ,得到每个候选区域的特征图,然后进行softmax分类和bbox预测
  • RPN网络是什么?生成候选区域是什么?
  1. 3*3的滑动窗口,每个中心会得到9个anchor box 长宽通过尺度和长宽比进行一一对应计算, 得到最原始的anchor box (候选区域)
  2. 需要一个候选区域的校正过程
  3. 即RPN网络训练
    1. 训练样本标记:每个ground-truth box有着最高的IoU的anchor标记为正样本
    2. 剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
    3. 剩下的样本全部忽略(有一些生成的anchor太差了)
    4. 正负样本比例为1:3
  • RPN当中的分类属于二分类

  • RPN Regression修正Bbox的坐标

  • 训练好的网络用于海选Anchor Bbox

  • 学习目标

    1. 了解Faster R-CNN的特点
    2. 知道RPN的原理以及作用

在Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,这个也非常耗时。那我们有没有一个更加高效的方法来求出这些候选框呢?

2.5.1 Faster R-CNN

在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。

Faster R-CNN可以简单地看成是区域生成网络+Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如下:

  • 1、首先向CNN网络(VGG-16)输入任意大小图片
  • 2、Faster RCNN使用一组基础的conv+relu+pooling层提取feature map。该feature map被共享用于后续RPN层和全连接层。
  • 3、Region Proposal Networks。RPN网络用于生成region proposals,该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals,输出其Top-N(默认为300)的区域给RoI pooling
  1. 生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
  • 4、第2步得到的高维特征图和第3步输出的区域建合并输入RoI池化层(类), 该输出到全连接层判定目标类别。
  • 5、利用proposal feature maps计算每个proposal的不同类别概率,同时bounding box regression获得检测框最终的精确位置

2.5.2 RPN原理

RPN网络的主要作用是得出比较准确的候选区域。整个过程分为两步

  • 用n×n(默认3×3=9)的大小窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors)
  • 低维特征向量输入两个并行连接的1 x 1卷积层然后得出两个部分:reg窗口回归层(用于修正位置)和cls窗口分类层(是否为前景或背景概率)

2.5.2.1 anchors

  • 3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors,三种尺度{ 128,256,512 }, 三种长宽比{1:1,1:2,2:1}

举个例子:

2.5.2.2 候选区域的训练

  • 训练样本anchor标记
  1. 每个ground-truth box有着最高的IoU的anchor标记为正样本
  2. 剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
  3. 剩下的样本全部忽略
  4. 正负样本比例为1:3
  • 训练损失
  1. RPN classification (anchor good / bad) ,二分类,是否有物体,是、否
  2. RPN regression (anchor -> proposal) ,回归
  3. 注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价

候选区域的训练是为了让得出来的 正确的候选区域, 并且候选区域经过了回归微调。

在这基础之上做Fast RCNN训练是得到特征向量做分类预测和回归预测。

2.5.3 Faster R-CNN的训练

Faster R-CNN的训练分为两部分,即两个网络的训练。前面已经说明了RPN的训练损失,这里输出结果部分的的损失(这两个网络的损失合并一起训练):

  • Fast R-CNN classification (over classes) ,所有类别分类N+1

  • Fast R-CNN regression (bbox regression)

2.5.4 效果对比

R-CNNFast R-CNNFaster R-CNN
Test time/image50.0s2.0s0.2s
mAP(VOC2007)66.066.966.9

2.5.5 Faster R-CNN总结

  • 优点
  1. 提出RPN网络
  2. 端到端网络模型
  • 缺点
  1. 训练参数过大
  2. 对于真实训练使用来说还是依然过于耗时

可以改进的需求:

  • RPN(Region Proposal Networks) 改进 对于小目标选择利用多尺度特征信息进行RPN
  • 速度提升 如YOLO系列算法,删去了RPN,直接对proposal进行分类回归,极大的提升了网络的速度

2.5.7 问题?

1、Faster RCNN改进之处?

2、如何得到RPN的 anchors?

2.6 YOLO(You only look once)

  • 目标
  1. 知道YOLO的网络结构
  2. 知道单元格的意义
  3. 知道YOLO的损失

在正式介绍YOLO之前,我们来看一张图:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125609.html

相关文章

  • AI学习路线

    摘要:针对公司样本不足,采用小样本技术和深度学习技术结合,是项目落地的解决方案。深度学习作为当前机器学习领域最热门的技术之一,已经在图像处理领域获得了应用,并且展现出巨大的前景。旨在帮助同学们快速上手如何使用库来完整机器学习案例。 阶段一、人工智能基础 - 高等数学必知必会 本阶段主要从数据分析、概率论和线性代数及矩阵和凸优化这四大块讲解基础,旨在训练大家逻辑能力,分析能力。拥有良好的数学基...

    xuweijian 评论0 收藏0
  • Java学习路线总结,搬砖工逆袭Java架构师(全网最强)

    摘要:哪吒社区技能树打卡打卡贴函数式接口简介领域优质创作者哪吒公众号作者架构师奋斗者扫描主页左侧二维码,加入群聊,一起学习一起进步欢迎点赞收藏留言前情提要无意间听到领导们的谈话,现在公司的现状是码农太多,但能独立带队的人太少,简而言之,不缺干 ? 哪吒社区Java技能树打卡 【打卡贴 day2...

    Scorpion 评论0 收藏0
  • Java经典

    摘要:请注意,我们在聊聊单元测试遇到问题多思考多查阅多验证,方能有所得,再勤快点乐于分享,才能写出好文章。单元测试是指对软件中的最小可测试单元进行检查和验证。 JAVA容器-自问自答学HashMap 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础。但一个这么重要的东西,我为什么没有在一开始...

    xcold 评论0 收藏0
  • SegmentFault 技术周刊 Vol.31 - 码农也要学算法

    摘要:记作称为算法的渐进时间复杂度,简称时间复杂度。学习数据结构与算法之链表链表一种常见的数据结构,可以存储有序的元素集合。首先在大的分类上,它们都是散列算法。 showImg(https://segmentfault.com/img/bVSDvj?w=900&h=385); 当人工智能、AlphaGo、无人驾驶、智能投顾等词语不断在人们视野中出现的时候,意味着我们正步入一个算法的时代。计算...

    cgspine 评论0 收藏0
  • 重磅 | 完备的 AI 学习路线,最详细的资源整理!

    摘要:是你学习从入门到专家必备的学习路线和优质学习资源。的数学基础最主要是高等数学线性代数概率论与数理统计三门课程,这三门课程是本科必修的。其作为机器学习的入门和进阶资料非常适合。书籍介绍深度学习通常又被称为花书,深度学习领域最经典的畅销书。 showImg(https://segmentfault.com/img/remote/1460000019011569); 【导读】本文由知名开源平...

    荆兆峰 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<