【深度学习】嘿马深度学习笔记第11篇:卷积神经网络,总结【附代码文档】
🏆🏆🏆教程全知识点简介:1.深度学习概述包括深度学习与机器学习区别、深度学习应用场景、深度学习框架介绍、项目演示、开发环境搭建(pycharm安装)。2. TensorFlow基础涵盖TF数据流图、TensorFlow实现加法运算、图与TensorBoard(图结构、图相关操作、默认图、创建图、OP)、张量(张量概念、张量的阶、张量数学运算)、变量OP(创建变量)、增加其他功能(命名空间、模型保存与加载、命令行参数使用)、逻辑回归案例。3. 神经网络基础包括playground使用、多个神经元效果演示、深层神经网络。4. 神经网络与tf.keras。5. 梯度下降算法改进涵盖指数加权平均、动量梯度下降法、RMSProp算法、Adam算法、TensorFlow Adam算法API、学习率衰减、标准化输入、神经网络调优、批标准化。6. 卷积神经网络包括CNN原理、CIFAR类别分类(API使用、步骤分析代码实现缩减版LeNet)、卷积神经网络学习特征可视化。7. 经典分类网络结构涵盖LeNet解析、AlexNet、卷积网络结构优化、Inception结构、pre_trained模型VGG预测(VGG模型使用、步骤代码)。8. CNN网络实战技巧。9. 迁移学习案例包括基于VGG的五种图片类别识别迁移学习(数据集迁移需求、思路步骤、训练时读取本地图片类别、特征图平均值输出替代全连接层)。10. 目标检测包括目标检测任务描述、目标定位实现思路、产品物体检测项目介绍、R-CNN(Overfeat模型、SPPNet)、Faster R-CNN(RPN原理)、YOLO(单元格grid cell、非最大抑制NMS、训练)、SSD。11. 产品检测数据集训练涵盖标注数据读取存储(xml读取本地文件存储pkl、解析结构、one_hot编码函数)、训练(案例训练结果、多GPU训练代码修改)、本地预测测试(预测代码)、模型导出(keras模型TensorFlow导出)。12. 模型部署包括Web与模型服务对接逻辑、Docker部署环境、TF Serving与Web开启服务(安装Tensorflow Serving、commodity模型服务运行)、TensorFlow Client对接模型服务、Web Server开启。
📚📚👉👉👉本站这篇博客: https://blog.csdn.net/yinuo_432/article/details/150215471 中查看
📚📚👉👉👉本站这篇博客: https://blog.csdn.net/yinuo_432/article/details/150215471 中查看
✨ 本教程项目亮点
🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考
🎯🎯🎯全教程总章节

🚀🚀🚀本篇主要内容
卷积神经网络
总结
每日
卷积神经网络
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版本的)参考官网https://www.tensorflow.org/install/gpu?hl=zh-cn,
1、虚拟机下linux也是用不了GPU版本TensorFlow
2、本机单独的windows和本机单独的unbuntu可以使用GPU版本TensorFlow,需要安装相关驱动
1.2.1.3 pycharm安装
- 1、免费版本:可以去选择社区版本:https://www.jetbrains.com/pycharm/
- 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
和
- 寻找一种变换F,使得:
,其中

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
拓展:如果关注这个公式怎么计算出来,请参考:http://kaiminghe.com/iccv15tutorial/iccv2015_tutorial_convolutional_feature_maps_kaiminghe.pdf
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的改进地方?
🚀✨ (未完待续)项目系列下一章
📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。
更多推荐


所有评论(0)