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

2012-张同学

发表文章数:31

首页 » 数据科学库 » 正文

商品目标检测

1. 目标检测概述

1.1.项目演示介绍

学习目标

  • 了解项目的演示结果

1.1.1 项目演示

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

1.1.2 项目结构

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

1.1.3 项目安排

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

1.2 图像识别背景

学习目标

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

1.2.1 图像识别三大任务

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

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

  • 目标分割:像素级的对前景与背景进行分类,将背景剔除(图c,图d)
    目标检测经典算法和API详解(笔记)

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

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

1.2.2 图像识别的发展

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

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

1.3 什么是目标检测

学习目标

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

1.3.2 目标检测定义

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

目标检测经典算法和API详解(笔记)
目标检测的位置信息一般由两种格式(以图片左上角为原点(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:目标检测框的宽、高

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

目标检测经典算法和API详解(笔记)
中心点坐标结果如下:
目标检测经典算法和API详解(笔记)

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 目标检测的应用场景

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

  • 农作物的应用
    。 农业中农作物表面的病虫害识别也需要用到目标检测技术
    目标检测经典算法和API详解(笔记)

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

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

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

  • 动物检测

  • 商品检测

  • 车牌检测

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

  • 车型检测

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
    目标检测经典算法和API详解(笔记)

2.1.2 目标检测的任务

2.1.2.1 分类原理回顾

先来回归下分类的原理,这是一个常见的CNN组成图,输入一张图片,经过其中卷积、激活、池化相关层,最后加入全连接层达到分类概率的效果
目标检测经典算法和API详解(笔记)

  • 分类的损失与优化
    在训练的时候需要计算每个样本的损失,那么CNN做分类的时候使用softmax函数计算结果,损失为交叉熵损失
    目标检测经典算法和API详解(笔记)
  • 常见的CNN模型
    目标检测经典算法和API详解(笔记)
    对于目标检测来说不仅仅是分类这样简单的一个图片输出一个结果,而且还需要输出图片中目标的位置信息,所以从分类到检测,如下图标记了过程:
  • 分类是得到每个类别的概率,比较得到最大概率
    softmax进行计算概率,交叉熵损失衡量
    目标检测经典算法和API详解(笔记)
  • 分类+定位 (只有 一个对象的时候)
    目标检测经典算法和API详解(笔记)
  • 目标检测

2.1.2.2 检测的任务

  • 分类:
    N个类别
    输入:图片
    输出:类别标签
    评估指标:Accuracy
    目标检测经典算法和API详解(笔记)
  • 定位:
    N个类别
    输入:图片
    输出:物体的位置坐标
    主要评估指标:IOU
    目标检测经典算法和API详解(笔记)
    其中我们得出来的(x,y,w,h)有一个专业的名词,叫做bounding box(bbox).

2.1.2.3 两种Bounding box名称

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

  • Ground-truth bounding box:图片当中真实标记的框
  • Predicted bounding box:预测的时候标记的框
    目标检测经典算法和API详解(笔记)
    一般在目标检测当中,我们预测的框有可能很多个,真实框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值
    目标检测经典算法和API详解(笔记)

2.1.4 目标定位的简单实现

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

2.1.4.1 回归位置

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

  • FC1:作为类别的输出

  • FC2:作为这个物体位置数值的输出
    目标检测经典算法和API详解(笔记)
    假设有10个类别,输出[p1,p2,p3,…,p10],然后输出这一个对象的四个位置信息[x,y,w,h]。同理知道要网络输出什么,如果衡量整个网络的损失

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

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

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

  • 让网络多输出一个全连接层。
  • 第一个全连接层是输出概率值
  • 第二个全连接层是输出四个位置目标(回归算法输出)
    目标检测经典算法和API详解(笔记)

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个结果,这样的话,网络模型输出结构不定
目标检测经典算法和API详解(笔记)
所以需要一些他的方法解决目标检测(多个目标)的问题,试图将一个检测问题简化成分类问题

2.2.1 目标检测-Overfeat模型

2.2.1.1 滑动窗口

目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。如下图所示:
目标检测经典算法和API详解(笔记)
这样就变成每张子图片输出类别以及位置,变成分类问题。但是滑动窗口需要初始设定一个固定大小的窗口,这就遇到了一个问题,有些物体适应的框不一样,所以需要提前设定K个窗口,每个窗口滑动提取M个,总共K x M 个图片,通常会直接将图像变形转换成固定大小的图像,变形图像块被输入 CNN 分类器中,提取特征后,我们使用一些分类器识别类别和该边界框的另一个线性回归器。
目标检测经典算法和API详解(笔记)

2.2.1.2 训练数据集

首先我们会准备所需要的训练集数据,每张图片的若干个子图片以及每张图片的类别位置,如下我们从某张图片中滑动出的若干的图片。
目标检测经典算法和API详解(笔记)

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模型都是照着这个物体检测思路。
目标检测经典算法和API详解(笔记)

  • 步骤(以AlexNet网络为基准)
    目标检测经典算法和API详解(笔记)
    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 候选区域(了解)

目标检测经典算法和API详解(笔记)
选择性搜索(SelectiveSearch,SS)中
,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。
目标检测经典算法和API详解(笔记)
SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。

2.2.2.3 Crop + Warp (了解)

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

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

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

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

  • 2.各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色
    目标检测经典算法和API详解(笔记)

2.2.2.4 CNN网络提取特征

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

在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据。
目标检测经典算法和API详解(笔记)

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]的得分矩阵,如下图所示

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

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

2.2.2.6 非极大抑制(NMS)

  • 目的
    筛选候选区域,得到最终候选区域结果
  • 迭代过程
    对于所有的2000个候选区域得分进行概率筛选
    然后对剩余的候选框,每个类别进行IoU(交并比)>= 0.5 筛选
    目标检测经典算法和API详解(笔记)
    假设现在滑动窗口有: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很接近了

修正过程(线性回归)
目标检测经典算法和API详解(笔记)

  • 给定:anchor A=(A_{x}, A_{y}, A_{w}, A_{h}) 和 GT=[G_{x}, G_{y}, G_{w}, G_{h}]
  • 寻找一种变换F,使得:目标检测经典算法和API详解(笔记),其中
    目标检测经典算法和API详解(笔记)目标检测经典算法和API详解(笔记)

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总结

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

  • 表现
    在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的速度慢在哪?
目标检测经典算法和API详解(笔记)
每个候选区域都进行了卷积操作提取特征。

2.3.1 SPPNet

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

  • 减少卷积计算
  • 防止图片内容变形
    目标检测经典算法和API详解(笔记)
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中的特征向量。映射过程图参考如下:
目标检测经典算法和API详解(笔记)
整个映射过程有具体的公式,如下
假设(x′,y′)(x′,y′)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:(x,y)=(S∗x′,S∗y′),即

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

未经允许不得转载:作者:2012-张同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《目标检测经典算法和API详解(笔记)》 发布于2021-11-27

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录