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

商品目标检测

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的维度是409620。

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, 得分矩阵是200020

  • 采用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的缺点
    训练耗时
    训练阶段多
    处理速度慢
    图片变形问题

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

おすすめ

転載: blog.csdn.net/weixin_54546190/article/details/121574877