当前位置: 首页 > news >正文

【深度学习】嘿马深度学习笔记第13篇:卷积神经网络,学习目标【附代码文档】

本教程的知识点为:深度学习介绍 1.1 深度学习与机器学习的区别 TensorFlow介绍 2.4 张量 2.4.1 张量(Tensor) 2.4.1.1 张量的类型 TensorFlow介绍 1.2 神经网络基础 1.2.1 Logistic回归 1.2.1.1 Logistic回归 TensorFlow介绍 总结 每日作业 神经网络与tf.keras 1.3 神经网络基础 神经网络与tf.keras 1.3 Tensorflow实现神经网络 1.3.1 TensorFlow keras介绍 1.3.2 案例:实现多层神经网络进行时装分类 神经网络与tf.keras 1.4 深层神经网络 为什么使用深层网络 1.4.1 深层神经网络表示 卷积神经网络 3.1 卷积神经网络(CNN)原理 为什么需要卷积神经网络 原因之一:图像特征数量对神经网络效果压力 卷积神经网络 3.1 卷积神经网络(CNN)原理 为什么需要卷积神经网络 原因之一:图像特征数量对神经网络效果压力 卷积神经网络 2.2案例:CIFAR100类别分类 2.2.1 CIFAR100数据集介绍 2.2.2 API 使用 卷积神经网络 2.4 BN与神经网络调优 2.4.1 神经网络调优 2.4.1.1 调参技巧 卷积神经网络 2.4 经典分类网络结构 2.4.1 LeNet-5解析 2.4.1.1 网络结构 卷积神经网络 2.5 CNN网络实战技巧 2.5.1 迁移学习(Transfer Learning) 2.5.1.1 介绍 卷积神经网络 总结 每日作业 商品物体检测项目介绍 1.1 项目演示 商品物体检测项目介绍 3.4 Fast R-CNN 3.4.1 Fast R-CNN 3.4.1.1 RoI pooling YOLO与SSD 4.3 案例:SSD进行物体检测 4.3.1 案例效果 4.3.2 案例需求 商品检测数据集训练 5.2 标注数据读取与存储 5.2.1 案例:xml读取本地文件存储到pkl 5.2.1.1 解析结构

完整笔记资料代码:https://gitee.com/yinuo112/AI/tree/master/深度学习/嘿马深度学习笔记/note.md

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

卷积神经网络

总结

每日作业

商品物体检测项目介绍

1.1 项目演示

学习目标

  • 目标

  • 了解项目的演示结果

  • 应用

1.1.1 项目演示

项目已经部署上线,Web端演示

1.1.2 项目结构

业务逻辑

1.1.3 项目知识点

  • 神经网络
  • 卷积网络
  • TensorFlowAPI操作

  • RCNN以及相关算法

  • YOLO与SSD

  • 算法接口介绍

  • 数据集标记格式

  • 数据集存储与读取

  • 数据接口实现

  • 模型接口实现

  • 训练、设备部署逻辑实现
  • 测试接口
  • TensorFlow serving部署模型
  • Web server+TensorFlow serving Client

1.2 开发环境搭建

学习目标

  • 目标

  • 应用

  • 开发环境搭建

1.2.1 安装

1.2.1.1 虚拟环境安装

我们这里选择virtualenv,可以选择anaconda安装(查阅资料解决安装)

linux下先安装:

sudo apt-get update
sudo apt-get install python3-dev python3-pip

mac先安装:

使用 Homebrew 软件包管理器进行安装:
brew update
brew install python  # Python 3
  • 1、现在虚拟环境管理工具, 环境隔离(python3版本))
sudo pip3 install -U virtualenv
  • 2、配置参数,创建一个virtualenv的文件夹
export WORKON_HOME=$HOME/virtualenv
source /usr/local/bin/virtualenvwrapper.sh
  • 3、新建虚拟环境
mkvirtualenv + -p  /user/bin/python(python版本所在位置) + test(虚拟环境名称)
  • 4、进入虚拟环境
workon tf

1.2.1.2 安装环境包

安装 TensorFlow在64 位系统上测试这些系统支持 TensorFlow:

  • Ubuntu 16.04 或更高版本
  • Windows 7 或更高版本
  • macOS 10.12.6 (Sierra) 或更高版本(不支持 GPU)

进入虚拟环境当中再安装。刚开始的环境比较简单,只要下载tensorflow即可

  • 环境包:
pip install tensorflow==1.12

注:如果需要下载GPU版本的(TensorFlow只提供windows和linux版本的,没有Macos版本的)参考官网[

1、虚拟机下linux也是用不了GPU版本TensorFlow

2、本机单独的windows和本机单独的unbuntu可以使用GPU版本TensorFlow,需要安装相关驱动

1.2.1.3 pycharm安装

  • 1、免费版本:可以去选择社区版本:[
  • 2、专业收费版本:老师们可以用教育邮箱申请专业版

3.2 目标检测任务描述

学习目标

  • 目标

  • 了解目标检测算法分类

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

  • 应用

3.2.1 目标检测算法分类

  • 两步走的目标检测:先进行区域推荐,而后进行目标分类

  • 代表:R-CNN、SPP-net、Fast R-CNN、Faster R-CNN

  • 端到端的目标检测:采用一个网络一步到位

  • 代表:YOLO、SSD

3.2.2 目标检测的任务

3.2.2.1 分类原理回顾

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

  • 分类的损失与优化

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

  • 常见CNN模型

对于目标检测来说不仅仅是分类这样简单的一个图片输出一个结果,而且还需要输出图片中目标的位置信息,所以从分类到检测,如下图标记了过程:

  • 分类

  • 分类+定位(只有一个对象的时候)

  • 目标检测

3.2.2.2 检测的任务
  • 分类:

  • N个类别

  • 输入:图片
  • 输出:类别标签
  • 评估指标:Accuracy

  • 定位:

  • N个类别

  • 输入:图片
  • 输出:物体的位置坐标
  • 主要评估指标:IOU

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

3.2.2.4 检测的评价指标
任务description输入输出评价标准
Detection and Localization (检测和定位)在输入图片中找出存在的物体类别和位置(可能存在多种物体)图片(image )类别标签(categories)和 位置(bbox(x,y,w,h))IoU (Intersection over Union) mAP (Mean Average Precision)
  • IoU(交并比)

  • 两个区域的重叠程度overlap:侯选区域和标定区域的IoU值

3.2.2.3 两种Bounding box名称

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

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

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

3.2.4 目标定位的简单实现思路

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

3.2.4.1 回归位置

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

  • FC1:作为类别的输出

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

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

  • 对于分类的概率,还是使用交叉熵损失
  • 位置信息具体的数值,可使用MSE均方误差损失(L2损失)

如下图所示

3.2.5 总结

  • 掌握目标检测的算法分类
  • 掌握分类,分类与定位,目标检测的区别
  • 掌握分类与定位的简单方法、损失衡量

商品物体检测项目介绍

3.3 R-CNN

学习目标

  • 目标

  • 了解Overfeat模型的移动窗口方法

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

  • 应用

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

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

3.3.1 目标检测-Overfeat模型

3.3.1.1 滑动窗口

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

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

那这种方法是怎么去利用数据训练的?

3.3.1.2 训练数据集

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

3.3.1.3 Overfeat模型总结

这种方法类似一种暴力穷举的方式,会消耗大量的计算力量,并且由于窗口大小问题可能会造成效果不准确

。但是提供了一种解决目标检测问题的思路

3.3.2 目标检测-R-CNN模型

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

3.3.2.1 完整R-CNN结构

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

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

  • 1.找出图片中可能存在目标的侯选区域region proposal

  • 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做回归微调
3.3.2.2 候选区域(了解)

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

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

3.3.2.3 Crop+Warp(了解)

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

  • crop:截取原图片的一个固定大小的patch
  • warp:将原图片的ROI缩放到一个固定大小的patch

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

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

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

3.3.2.4 CNN网络提取特征

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

提取的这些特征将会保存在磁盘当中(这些提取的特征才是真正的要训练的数据

3.3.2.5 特征向量训练分类器SVM

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

  • 每个SVM分类器做的事情

  • 判断2000个候选区域是某类别,还是背景

3.3.2.6 非最大抑制(NMS)
  • 目的

  • 筛选候选区域,得到最终候选区域结果

  • 迭代过程

  • 对于所有的2000个候选区域得分进行概率筛选

  • 然后对剩余的候选框,每个类别进行IoU(交并比)>= 0.5 筛选

假设现在滑动窗口有:A、B、C、D、E 5个候选框,

  • 第一轮:假设B是得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,剔除DE,B作为一个预测结果
  • 第二轮:AC中,A的得分最高,与A计算IoU,C的结果>0.5,剔除C,A作为一个结果

最终结果为在这个5个中检测出了两个目标为A和B

3.3.2.7 修正候选区域

那么通过非最大一直筛选出来的候选框不一定就非常准确怎么办?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,使得:F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'}),其中(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h})

3.3.3 R-CNN训练过程

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

3.3.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类别的负样本

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

3.3.3.2 预训练(pre-training)

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

3.3.3.3 微调(fine-tuning)

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

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

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

3.3.3.5 bbox回归器训练

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

3.3.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进行回归。

3.3.5 R-CNN总结

3.3.5.1 流程总结

  • 表现

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

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

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

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

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

3.3.6 总结

  • 掌握Overfeat模型思路

  • 滑动窗口

  • 掌握R-CNN的流程

  • 掌握训练过程

  • 预训练

  • 微调
  • SVM+bbox regressor训练

  • 了解R-CNN的缺点

  • 训练耗时

  • 训练阶段多
  • 处理速度慢
  • 图片变形问题

3.3.7 问题?

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

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

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

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

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

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

3.3.8 SPPNet

学习目标

  • 目标

  • 说明SPPNet的特点

  • 说明SPP层的作用

  • 应用

R-CNN的速度慢在哪?

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

3.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层
3.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

其中 S 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为=16

拓展:如果关注这个公式怎么计算出来,请参考:[

3.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的特征向量,接着给全连接层做进一步处理,如下图:

3.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层

3.3.3 总结

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

3.3.4 问题?

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

2、spatial pyramid pooling的过程?

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

http://www.dtcms.com/a/109469.html

相关文章:

  • 2025软件供应链安全指南︱构筑企业安全积极防御体系实践
  • U盘实现——BOT 常用命令
  • 无线通信技术(三):5G NR通信频带划分与应用场景
  • Spring Boot后端开发全攻略:核心概念与实战指南
  • python大数据相关职位,还需要学习java哪些知识
  • 股权转让怎么交税?
  • 【动态规划】线性dp——LIS和LCS
  • 网站提示“不安全“怎么办?原因分析与解决方法
  • sqlalchemy详细介绍以及使用方法
  • 防爆对讲机VS非防爆对讲机,如何选择?
  • 将现有 REST API 转换为 MCP Server工具 -higress
  • element-plus中,表单校验的使用
  • HCIP-8 ospf静默接口,ospf树
  • 用Python和Pygame创造粉色粒子爱心:3D渲染的艺术
  • 《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例
  • VTK 各个点颜色的设置
  • 289.将所有数字用字符替换
  • 栈容器的应用
  • 代码随想录|动态规划|17一和零
  • DAY 35 leetcode 202--哈希表.快乐数
  • QT 非空指针 软件奔溃
  • 检索增强生成(RAG) 优化策略
  • LLM架构解析:长短期记忆网络(LSTM)(第三部分)—— 从基础原理到实践应用的深度探索
  • MyBatis:开源、轻量级的数据持久化框架
  • 游戏引擎学习第201天
  • Muduo网络库实现 [九] - EventLoopThread模块
  • 康谋分享 | 仿真驱动、数据自造:巧用合成数据重构智能座舱
  • 去中心化交易所(DEX)
  • Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发
  • 【GCC警告报错4】warning: format not a string literal and no format arguments