教程总体简介:要求 目标 1.1 项目演示 学习目标 1.1 图像识别背景 1.2 什么是目标检测 1.2.1 目标检测定义 1.2.1.1 物体 1.3 目标检测应用场景 1.3.1 行业 1.3.2 应用类别 1.4 开发环境搭建 目标检测概述 3.1 目标检测任务描述 3.1.4 目标定位的简单实现 项目实现 4.9 Web Server + TensorFlow Serving Client 4.9.1 环境安装 4.9.1 Web Server 4.10 服务器部署+小程序 4.10.2 小程序 目标检测算法原理 3.2 R-CNN 3.2.1 目标检测-Overfeat模型 3.2.7 问题? 3.3 SPPNet 3.5 Faster R-CNN 3.5.2 RPN原理 3.5.4 效果对比 3.6 YOLO(You only look once) 3.6.1 YOLO 这些候选框与我们前面R-CNN系列算法中有哪些不同? 3.6.2 单元格(grid cell) 3.6.3 非最大抑制(NMS) 3.6.4 训练 3.7 SSD(Single Shot MultiBox Detector) 3.7.1 SSD 问题:SSD中的多个Detector & classifier有什么作用? 3.7.2 训练与测试流程 3.8 TensorFlowSSD接口 3.8.1 接口文件 数据集处理 2.2 目标数据集标记 2.3 数据集格式转换 2.3.2 TFRecords文件 2.3.3 案例:VOC2007数据集转换 2.4 slim库介绍 2.4.2 导入以及API介绍 4.1 项目结构介绍 4.1.2 项目代码训练架构设计 4.2 数据模块接口 4.2.1 功能需求 4.2.3 商品数据模块代码编写 4.4 预处理 4.4.2 数据增强 4.5 多GPU训练 4.5.1 训练步骤以及设备部署需求 4.5.2 运行过程与代码编写 主函数训练逻辑 一、选择设备初始配置初始部署设备信息 Create global_step. 选择全局步长变量所在的设备 获取类 获取网络参数 初始化网络 获取形状 获取default anchors 默认只返回一个样本 进行数据的批处理以及获取到队列当中(获取多个数据) 要获取批处理:[image, gclasses, glocalisations, gscores] 单列表? Tensor 列表 重叠的列表进行转换成单列表 r包含着多个样本 计算所有GPU / CPU设备的平均损失和每个变量的梯度总和 获取训练的OP以及摘要OP pre-trained模型路径. 开始训练 4.6 测试
完整笔记资料代码:https://gitee.com/yinuo112/AI/tree/master/深度学习/嘿马深度学...
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
目标检测算法原理
了解目标检测算法分类
知道目标检测的常见指标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接口意义
3.7 SSD(Single Shot MultiBox Detector)
学习目标
目标
- 知道SSD的结构
- 说明Detector & classifier的作用
- 说明SSD的优点
应用
- 无
3.7.1 SSD
3.7.1.1 简介
SSD算法源于2016年发表的算法论文,论文网址:[
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所有特征点上是使用不同的prior boxes
3.7.1.4 Detector & classifier
Detector & classifier的三个部分:
- 1.default boxes: 默认候选框
- 2.localization:4个位置偏移
- 3.confidence:21个类别置信度(要区分出背景)
3.7.1.4.1 default boxes
default boxex类似于RPN当中的滑动窗口生成的候选框,SSD中也是对特征图中的每一个像素生成若干个框。
只不过SSD当中的默认框有生成的公式
以下为了解内容,记住几个参数即可:
- ratio:长宽比
- 默认框的大小计算参数:s_min:最底层的特征图计算参数,s_max最顶层的特征图计算参数
3.7.1.4.2 localization与confidence
这两者的意义如下,主要作用用来过滤,训练
经过这一次过滤操作,会将候选框筛选出数量较少的prior boxes。
关于三种boxes的解释区别:
- gournd truth boxes:训练集中,标注好的待检测类别的的位置,即真实的位置,目标的左下角和右上角坐标
- default boxes:在feature map上每一个点上生成的某一类别图片的位置。feature map每个点生成4或6个box(数量是事先指定的),格式为转换过后的(x, y, w, h)
- prior boxes:经过置信度阈值筛选后,剩下的可能性高的boxes。这个box才是会被真正去做回归
也就是说SSD中提供事先计算好的候选框这样的机制,只不过不需要再像RPN那种筛选调整,而是直接经过prior boxes之后做回归操作(因为confidence中提供了21个类别概率可以筛选出背景)
问题:SSD中的多个Detector & classifier有什么作用?
SSD的核心是在不同尺度的特征图上来进行Detector & classifier 容易使得SSD观察到更小的物体
3.7.2 训练与测试流程
3.7.2.1 train流程
- 输入->输出->结果与ground truth标记样本回归损失计算->反向传播, 更新权值
1. 样本标记:
利用anchor与对应的ground truth进行标记正负样本,每次并不训练8732张计算好的default boxes, 先进行置信度筛选,并且训练指定的正样本和负样本, 如下规则
正样本
- 1.与GT重合最高的boxes, 其输出对应label设为对应物体.
- 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的格式转换过程
3.8 TensorFlowSSD接口
学习目标
目标
- 知道TensorFlow的SSD接口意义
应用
- 无
3.8.1 接口文件
TensorFlow在github上面已经做了接口的封装,只不过过没有提供在官网的接口当中,是官方案例当中提供的Python文件,需要自行去下载,参考:[
我们下载到项目当中如下:
3.8.1.1 网络配置
3.8.2 接口介绍
3.8.2.1 模型搭建处理:
ssd_net.net:网络结构定义函数
- 输出:predictions, localisations, logits, end_points,分别表示bbox分类预测值(经过softmax)、bbox位移预测值、bbox分类预测值(未经过softmax)、模型节点
获取默认anchor:
- ssd_net.anchors:所有阶段特征图的default boxes生成, 得到每层特征图的预设框(x, y, w, h)(公式计算得来)
Default boxes的对应Ground Truth标记处理:使 Ground Truth 数量与预测结果一一对应
- ssd_net.bboxes_encode(glabels, gbboxes, ssd_anchors),grounding truth处理函数,利用gt与每层生成的anchor进行标记得分,返回gclasses, glocalisations, gscores
3.8.2.2 定义网络的损失:
ssd_net.losses:
- 网络的输出预测结果与Ground Truth之间损失计算
总结
作业
目标检测算法原理
了解目标检测算法分类
知道目标检测的常见指标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 目标检测数据集
学习目标
目标
- 了解常用目标检测数据集
- 了解数据集构成
应用
- 无
2.1.1 常用目标检测数据集
- pascal Visual Object Classes
VOC数据集是目标检测经常用的一个数据集,从05年到12年都会举办比赛(比赛有task: Classification、Detection、Segmentation、PersonLayout),主要由VOC2007和VOC2012两个数据集
注:
官网地址:[
下载地址:[
- Open Images Dataset V4
2018年发布了包含在 190 万张图片上针对 600 个类别的 1540 万个边框盒,这也是现有最大的具有对象位置注释的数据集。这些边框盒大部分都是由专业注释人员手动绘制的,确保了它们的准确性和一致性。
谷歌的数据集类目较多涵盖范围广,但是文件过多,处理起来比较麻烦,所以选择目前使用较多并且已经成熟的pascavoc数据集
2.1.2 pascal voc数据集介绍
通常使用较多的为VOC2007数据集,总共9963张图片,需要判定的总物体类别数量为20个对象类别是:
- 人:人
- 动物:鸟,猫,牛,狗,马,羊
- 车辆:飞机,自行车,船,公共汽车,汽车,摩托车,火车
- 室内:瓶子,椅子,餐桌,盆栽,沙发,电视/显示器
- 文件结构
文件内容
- Annotations: 图像中的目标标注信息xml格式
- JPEGImages:所有图片(VOC2007中总共有9963张,训练有5011张,测试有4952张)
2.1.3 XML
以下是一个标准的物体检测标记结果格式,这就是用于训练的物体标记结果。其中有几个重点内容是后续在处理图像标记结果需要关注的。
size:
- 图片尺寸大小,宽、高、通道数
object:
- name:被标记物体的名称
- bndbox:标记物体的框大小
如下例子:为000001.jpg这张图片,其中有两个物体被标记
<annotation>
<folder>VOC2007</folder>
<filename>000001.jpg</filename># 文件名
<source># 文件来源
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>341012865</flickrid>
</source>
<owner>
<flickrid>Fried Camels</flickrid>
<name>Jinky the Fruit Bat</name>
</owner>
<size># 文件尺寸,包括宽、高、通道数
<width>353</width>
<height>500</height>
<depth>3</depth>
</size>
<segmented>0</segmented># 是否用于目标分割
<object># 真实标记的物体
<name>dog</name># 目标类别名称
<pose>Left</pose>
<truncated>1</truncated># 是否截断,这个目标因为各种原因没有被框完整(被截断了),比如说一辆车有一部分在画外面
<difficult>0</difficult># 表明这个待检测目标很难识别,有可能是虽然视觉上很清楚,但是没有上下文的话还是很难确认它属于哪个分类,标为difficult的目标在测试评估中一般会被忽略
<bndbox># bounding-box
<xmin>48</xmin>
<ymin>240</ymin>
<xmax>195</xmax>
<ymax>371</ymax>
</bndbox>
</object>
<object># 真实标记的第二个物体
<name>person</name>
<pose>Left</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>8</xmin>
<ymin>12</ymin>
<xmax>352</xmax>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。