🏆🏆🏆教程全知识点简介: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 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

产品物体检测项目介绍

3.4 Fast R-CNN

学习目标

  • 目标

  • 了解Fast R-CNN的结构特点

  • 说明RoI pooling的特点
  • 了解多任务损失

  • 应用

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

3.4.1 Fast R-CNN

改进的地方:

  • 提出一个RoI pooling,然后整合整个模型,把CNN、SPP变换层、分类器、bbox回归几个模块一起训练

  • 步骤

  • 首先将整个图片输入到一个基础卷积网络,得到整张图的feature map

  • 将region proposal(RoI)映射到feature map中
  • RoI pooling layer提取一个固定长度的特征向量,每个特征会输入到一系列全连接层,得到一个RoI特征向量(此步骤是对每一个候选区域都会进行同样的操作)
    • 其中一个是传统softmax层进行分类,输出类别有K个类别加上”背景”类
    • 另一个是bounding box regressor
3.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快很多也是因为这里的原因。

3.4.1.3 End-to-End model

Click 文档

从输入端到输出端直接用一个神经网络相连,整体优化目标函数。

接着 来看为什么后面的整个网络能进行统一训练?

PyQuery 文档

特征提取CNN的训练和SVM分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,去掉了SVM分类这一过程,所有特征都存储在内存中,不占用硬盘空间,形成了End-to-End模型(proposal除外,end-to-end在Faster-RCNN中得以完善)

  • 使用了softmax分类
  • RoI pooling能进行反向传播,SPP层不适合

3.4.2 多任务损失-Multi-task loss

两个loss,分别是:

  • 对于分类loss,是一个N+1路的softmax输出,其中的N是类别个数,1是背景,使用交叉熵损失
  • 对于回归loss,是一个4xN路输出的regressor,也就是说对于每个类别都会训练一个单独的regressor的意思,使用平均绝对误差(MAE)损失即L1损失

invoke 文档

  • fine-tuning训练:

  • 在微调时,调整 CNN+RoI pooling+softmax+bbox regressor网络当中的参数

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衡量的是学出的模型在所有类别上的好坏

Tkinter 文档

3.4.4 Fast R-CNN总结

  • 缺点

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

3.4.5 总结

  • 掌握Fast R-CNN的改进
  • 掌握RoI pooling的作用
  • 掌握多任务损失结构

3.4.6 问题?

1、详细说明RoI pooling过程?

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

3.5 Faster R-CNN

学习目标

  • 目标

  • 了解Faster R-CNN的特点

  • 知道RPN的原理以及作用

  • 应用

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

3.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
  • 生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals

  • 4、第2步得到的高维特征图和第3步输出的区域建合并输入RoI池化层(类), 该输出到全连接层判定目标类别。

  • 5、利用proposal feature maps计算每个proposal的不同类别概率,同时bounding box regression获得检测框最终的精确位置

3.5.2 RPN原理

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

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

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

举个例子:

3.5.2.2 候选区域的训练
  • 训练样本anchor标记

  • 1.每个ground-truth box有着最高的IoU的anchor标记为正样本

  • 2.剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
  • 3.剩下的样本全部忽略
  • 正负样本比例为1:3

  • 训练损失

  • RPN classification (anchor good / bad) ,二分类,是否有物体,是、否

  • RPN regression (anchor -> proposal) ,回归
  • 注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价

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

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

3.5.3 Faster R-CNN的训练

Python 官方文档

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

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

  • Fast R-CNN regression (bbox regression)

3.5.4 效果对比

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

3.5.5 Faster R-CNN总结

  • 优点

  • 提出RPN网络

  • 端到端网络模型

  • 缺点

  • 训练参数过大

  • 对于真实训练使用来说还是依然过于耗时

Python-dotenv 文档

可以改进的需求:

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

aioredis 文档

3.5.6 总结

  • Faster R-CNN的特点
  • RPN的原理

3.5.7 问题?

1、Faster RCNN改进之处?

2、如何得到RPN的 anchors?

总结

sys 文档

每日

产品物体检测项目介绍

Learn Python the Hard Way

YOLO与SSD

3.6 YOLO(You only look once)

学习目标

  • 目标

  • 知道YOLO的网络结构

  • 知道单元格的意义
  • 知道YOLO的损失

  • 应用

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

可以看出YOLO的最大特点是速度快。

3.6.1 YOLO

3.6.1.1 结构

一个网络搞定一切,GoogleNet + 4个卷积+2个全连接层

3.6.1.2 流程理解
  • 1、原始图片resize到448x448,经过前面卷积网络之后,将图片输出成了一个7 7 30的结构

以图示的方式演示

2、默认7 7个单元格,这里用3 3的单元格图演示

3、每个单元格预测两个bbox框

4、进行NMS筛选,筛选概率以及IoU

3.6.2 单元格(grid cell)

最后网络输出的7 7 30的特征图怎么理解?7 * 7=49个像素值,理解成49个单元格,每个单元格可以代表原图的一个方块。单元格需要做的两件事:

  • 1.每个单元格负责预测一个物体类别,并且直接预测物体的概率值

  • 2.每个单元格预测两个(默认)bbox位置,两个bbox置信度(confidence) 7 7 2=98个bbox

  • 30=(4+1+4+1+20), 4个坐标信息,1个置信度(confidence)代表一个bbox的结果, 20代表 20类的预测概率结果

3.6.2.1 网格输出筛选

一个网格会预测两个Bbox,在训练时 只有一个Bbox专门负责(一个Object 一个Bbox)

怎么进行筛选?

  • 通过置信度大小比较

每个bounding box都对应一个confidence score

  • 如果grid cell里面没有object,confidence就是0
  • 如果有,则confidence score等于 预测的box和ground truth的IOU乘积

注:所以如何判断一个grid cell中是否包含object呢?如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。

这个概率可以理解为不属于任何一个bbox,而是属于这个单元格所预测的类别

  • 不同于faster rcnn中的anchors,yolo的框坐标是由网络得出,而faster-rcnn是人为设定一个值,然后利用RPN网络对其优化到一个更准的坐标和是否背景类别

wxPython 文档

3.6.3 非最大抑制(NMS)

每个Bbox的Class-Specific Confidence Score以后,设置阈值,滤掉概率的低的bbox,对每个类别过滤IoU,就得到最终的检测结果

3.6.4 训练

Peewee ORM

  • 预测框对应的目标值标记

  • confidence:格子内是否有目标

  • 20类概率:标记每个单元格的目标类别

怎么理解这个过程?同样以分类那种形式来对应,假设以一个单元格的预测值为结果,如下图

  • 损失

  • 三部分损失 bbox损失+confidence损失+classfication损失

3.6.5 与Faster R-CNN比较

Faster R-CNN利用RPN网络与真实值调整了候选区域,然后再进行候选区域和卷积特征结果映射的特征向量的处理来通过与真实值优化网络预测结果。而这两步在YOLO当中合并成了一个步骤,直接网络输出预测结果进行优化。

所以经常也会称之为YOLO算法为直接回归法代表。YOLO的特点就是快

3.6.6 YOLO总结

  • 优点

  • 速度快

  • 缺点

  • 准确率会打折扣

  • YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框

tqdm 文档

3.6.7 总结

  • YOLO的网络结构
  • 输出结果的意义

  • 7 7 30(用于20类分类)

3.7 SSD(Single Shot MultiBox Detector)

学习目标

  • 目标

  • 知道SSD的结构

  • 说明Detector & classifier的作用
  • 说明SSD的优点

  • 应用

3.7.1 SSD

3.7.1.1 简介

SSD算法源于2016年发表的算法论文,论文网址:https://arxiv.org/abs/1512.02325

SSD的特点在于:

  • SSD结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN一样比较精准。

  • SSD的核心是在不同尺度的特征特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。

3.7.1.2 结构

以VGG-16为基础,使用VGG的前五个卷积,后面增加从CONV6开始的5个卷积结构,输入图片要求300*300。

3.7.1.3 流程

SSD中引入了Defalut Box,实际上与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是在不同尺度feature map所有特征点上使用PriorBox层

3.7.1.4 Detector & classifier

Detector & classifier的三个部分:

  • 1.PriorBox层:生成default boxes,默认候选框

  • 2.Conv3 x 3:生成localization, 4个位置偏移

  • 3.Conv3 x 3:confidence,21个类别置信度(要区分出背景)

Python 语言参考

3.7.1.4.1 PriorBox层-default boxes

default boxex类似于RPN当中的滑动窗口生成的候选框,SSD中也是对特征图中的每一个像素生成若干个框。

  • 特点分析:

  • priorbox:相当于faster rcnn里的anchors,预设一些box,网络根据box,通过分类和回归给出被检测到物体的类别和位置。每个window都会被分类,并回归到一个更准的位置和尺寸上

  • 各个feature map层经过priorBox层生成prior box

asyncpg 文档

根据输入的不同aspect ratio 和 scale 以及 num_prior来返回特定的default box,default box 的数目是feature map的height x width x num_prior。

以下为了解内容,记住几个参数即可:

prior_box:打印出来的形状为:
Tensor("concat_2:0", shape=(?, 7308, 8), dtype=float32)

variance: bounding regression中的权重。网络输出[dxmin,dymin,dxmax,dymax],即对应利用如下方法进行针对prior box的位置回归:
decode_bbox->set_xmin(
     prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width);
 decode_bbox->set_ymin(
     prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height);
 decode_bbox->set_xmax(
     prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width);
 decode_bbox->set_ymax(
     prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height);


 layer {
  name: "conv6_2_mbox_priorbox"
  type: "PriorBox"
  bottom: "conv6_2"
  bottom: "data"
  top: "conv6_2_mbox_priorbox"
  prior_box_param {
    min_size: 111.0
    max_size: 162.0
    aspect_ratio: 2.0
    aspect_ratio: 3.0
    flip: true
    clip: false
    variance: 0.10000000149
    variance: 0.10000000149
    variance: 0.20000000298
    variance: 0.20000000298
    step: 32.0
    offset: 0.5
}

email-validator 文档

3.7.1.4.2 localization与confidence

这两者的意义如下,主要作用用来过滤,训练

模型中打印出最后的三个部分结果:

Tensor("Reshape_42:0", shape=(?, 7308, 4), dtype=float32) Tensor("truediv:0", shape=(?, 7308, 21), dtype=float32) Tensor("concat_2:0", shape=(?, 7308, 8), dtype=float32)

Python.org 初学者指南

问题:SSD中的多个Detector & classifier有什么作用?

SSD的核心是在不同尺度的特征图上来进行Detector & classifier 容易使得SSD观察到更小的物体

3.7.2 训练与测试流程

3.7.2.1 train流程
  • 输入->输出->结果与ground truth标记样本回归损失计算->反向传播, 更新权值
1. 样本标记:

先将prior box与ground truth box做匹配进行标记正负样本,每次并不训练8732张计算好的default boxes, 先进行置信度筛选,并且训练指定的正样本和负样本, 如下规则

  • 正样本

  • 1.与GT重合最高的boxes, 其输出对应label设为对应物体.

CatBoost 文档

  • 2.物体GT与anchor iou满足大于0.5

  • 负样本:其它的样本标记为负样本

在训练时, default boxes按照正负样本控制positive:negative=1:3

3. 损失

网络输出预测的predict box与ground truth回归变换之间的损失计算, 置信度是采用 Softmax Loss(Faster R-CNN是log loss),位置回归则是采用 Smooth L1 loss (与Faster R-CNN一样)

3.7.2.2 test流程
  • 输入->输出->nms->输出

3.7.3 比较

从图中看出SSD算法有较高的准确率和性能,兼顾了速度和精度

3.7.4 总结

  • SSD的结构
  • Detector & classifier的组成部分以及作用
  • SSD的训练样本标记
  • GT与default boxes的格式转换过程

SSD网络接口实现


🚀✨ (未完待续)项目系列下一章

📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐