前言
自从 3 年前的一次心血来潮,坚持到今日,一路走来阅历了很多,也学到很多。特别是当遇到一个自己完全不了解,且有必定深度范畴应该如何下手。今后有机会和咱们共享一下自学机器学习的阅历,期望让咱们能够防止一些学习上弯路。深度学习,也学了,也用了,多少也算是对深度学习有了一些了解、特别是深度学习在计算机视觉范畴的运用有了必定了解。不过感觉自己虽然学习了,但对许多知识点了解不够深化,仍是停留在表面。最近自己时间比较多,所以一是想深化研究一下,二是想把这些零散知识点衔接起来。整理出一套材料
- 深度学习结构剖析
- 方针检测
- 语义切割
这两年的作业首要仍是会集在方针识别和语义切割这 2 个计算机视觉的使命上。所以共享中首要这两条主线进行打开介绍深度学习在计算机视觉上运用。
关于方针检测使命会有些一些共性问题,咱们随后会看一看不同网络针对这些问题是如何给出自己的答案的
- 正负样本不均衡问题
- 不同尺度方针识别
- 如何有效界说一个丢失函数
one stage detection
什么是 one-stage 方针检测
之前共享过一篇关于 YOLOv1 的文章,方针检测系列—深度解读 YOLOv1 (1) 其实 YOLO 系列模型从 v1 到 v5 都特点 one stage 方针检测模型,今日要介绍的 SSD 也属于 one stage 方针检测的模型。好那么,什么是 one stage 呢? 所谓 one-stage 也便是模型只对输入图画进行一次调查(检测),便能够给出了猜测结果(检测出事先界说好的类别以及其方位),其实这儿 one stage 是相关于之前 two stage 模型而说的。two stage 是对图画调查两次,榜首次调查图画后,给出了许多其间或许包含方针的候选框(区域),接下来在第2次调查,是在这些候选区域上进行方针检测,而且对候选框进行调整以精确地表明出方针方位和巨细。
one-stage 方针检测一般流程
在开端介绍 SSD 之前,就需要先清楚什么是 one-stage 方针检测的一般流程。one stage 方针检测是先把图画以网格方式划分为若干区域。每个小区域一般称为网格(grid cell),每个区域担任检测方针,在 YOLOv1 中,每个网格担任检测那些中心点落在该网格区域内的方针。在 SSD 以及 YOLOv2 今后版本,他们都引入锚框(anchor box)的概念,每个网格会生成一系列锚框(anchor box),然后基于这些锚框来生成猜测框来担任检测方针,模型要学习的是猜测框相关于锚框的偏移量。
SSD(Single Stage Detection)
首要咱们在一阶段方针检测网络中没有运用候选框生成,而是运用。在 SSD 中便是将图片划分红网格,然后每一个网格创建一些锚框,这些锚框会给出一个其所属类别的猜测,类别数中除了数据集提供类别外还包含了布景这个类别,例如 VOC 是 20 个类别,那么每个锚框担任是从 21 类别(将布景算为一个类别)
结合上图咱们来看一看 SSD ,经过一系列卷积操作后,得到了 mnpm \times n \times p 特征图,其间 p 是通道数,例如 8×8 和 4×4 特征图,然后在这些特征图上运用 3×3 的卷积。关于每一个方位,拿到 k 个鸿沟框,这些鸿沟框具有不同巨细和宽高比,这样做的目的让鸿沟能够适应各种不同宽高比的方针。然后每一个鸿沟框会具有类别(这儿类别包含布景)的得分以及鸿沟框相关于初始给定鸿沟框的偏移量,也便是会有 (c+4)kmn 个鸿沟框。
SSD 结构图
在网络结构上,SSD 和 YOLOv1 虽然都是 one-stage detector 的确有着显着的差异。YOLOv1 主干网络是一个自界说的网路结构,而且最终两层是全衔接,随后 reshape 成想要的输出形状。而 SSD 是在 VGG16 基础上进行了改造,而且最终都是卷积层,并没有用到全衔接层。
如上图,在 VGG16 的第 5 模块将其 Pooling 层替替换为 3×3 卷积层,然后再经过一个 Atrous/Dilated Conv 层后进行一系列卷积操作得到不同尺度的特征图。
为了有更精确的检测,输出不同尺度的特征图还要经过一个 33 的卷积再进行物体检测,如上图。
这儿以 Conv4_3 为例,其尺度是 3838512,对其运用 33 的卷积输出猜测。每个网格有 4 个鸿沟框,每个鸿沟框即将猜测(类+4)个类别。因此在 Conv4_3 中,输出是 38384(c+4)。假定数据集为 VOC,有 20 个类别,再加上 1 个布景类,那么输出便是 38384(21+4)=144,400,鸿沟框数量便是 38384=5776。以此类推
- Conv7: 19196 = 2166 鸿沟框 (这儿关于网格方位 6 鸿沟框)
- Conv8_2: 10106 = 600 鸿沟框 (这儿关于网格方位 6 鸿沟框)
- Conv9_2: 556 = 150 鸿沟框 (这儿关于网格方位 6 鸿沟框)
- Conv10_2: 334 = 36 鸿沟框 (这儿关于网格方位 4 鸿沟框)
- Conv11_2: 114 = 4 鸿沟框 (这儿关于网格方位 4 鸿沟框)
现在咱们把一切不同特征层的鸿沟框加起来,共得到了 5776+2166+600+150+36+4=8732 个鸿沟框。前面说的 YOLOv1 ,将图画划分为 77 的网格,每个网格有 2 个鸿沟框,一共得到 772=98 个鸿沟框,这与拥有 8732个鸿沟框的 SSD 相比,YOLOv1 鸿沟框要少的多。
丢失函数
丢失函数由两部分组成,别离 LconfL_{conf} 和 LlocL_{loc},其间 N 是匹配上的默许的鸿沟框。
- 这儿 N 是匹配上鸿沟框的数量,也便是正例样本数量
- \alpha 是一个权重值,这儿 \alpha 取值为 1
分类丢失函数
关于分类丢失函数这儿运用 softmax 丢失函数
- 这儿榜首部分 −∑i∈PosNxijPlog(CiP)-\sum_{i \in Pos}^N x_{ij}^P \log(\hat{C_i}^P) 正样本类别丢失
- 第二部分 ∑i∈NegN(Ci0)\sum_{i \in Neg}^N (\hat{C_i}^0) 是负样本的类别丢失
- CiP\hat{C_i}^P 表明第 ii 个默许框猜测为pp 类别的概率,因为第 ii 个默许框对应 GT 鸿沟框所框住的方针类别为 pp
- xijpx_{ij}^p 当第 i 个默许框与第jj个 GT 鸿沟框框进行匹配,这儿 PP 表明 GT 的第 P 类别也便是第 ii 个默许框对应到 jj GT 鸿沟框的 PP 类别概率
这儿 xijx_{ij} 表明表明鸿沟框和实在框的 IoU 大于 0.5 才会列入计算。
再是实践猜测时分,不是直接猜测鸿沟框,而是猜测鸿沟框相关于锚框的偏移量,在练习时分也是要学到让猜测鸿沟框相关于锚框的偏移量挨近实在框(GT)相关于锚框的偏移量。
在上图中,坐落右上角图中,用绿色框表明实在框,在图画中,一般以左上角点作为原点,然后 x 和 y 表明方针中心点,w 和 h 表明方针宽和高。接下来在左下角图中,橘黄色框表明一个锚框,经过 IoU 计算这个锚框和实在框比较挨近,如果用 y′,x′y^{\prime},x^{\prime} 表明锚框中心点,h′,w′h^{\prime},w^{\prime} 表明锚框高和宽,要学习的是锚框相关于实在框偏移量也便是x,y\Delta x ,\Delta y
其实持续来看右下角图,并不是直接猜测 x,y\Delta x ,\Delta y ,而是 x/w′,y/h′\Delta x/w^{\prime} ,\Delta y/h^{\prime} 对 x,y\Delta x ,\Delta y 进行了归一化的处理,同关于宽高是猜测 log(w/w′)\log(w/w^{\prime}) 和log(h/h′)\log(h/h^{\prime}) 其实这样做的长处便是将这些值归一化到 0 到 1 之间,便于学习和猜测。
smooth L1 丢失函数
这儿从姓名上来看
在 Fast RCNN 和 SSD 关于鸿沟框方位回归都用到了 Smooth L1 这个丢失函数,这个丢失函数具有 L1 和 L2 长处,也便是首要 Smooth L1 要比 L1 收敛快,可是相关于 L2 函数对离群点又不那么灵敏,梯度变化相对更小。
但L2范数的缺点是当存在离群点的时分,这些点会占loss的首要组成部分。比如说实在值为1,猜测10次,有一次猜测值为1000,其他次的猜测值为1左右,明显loss 值首要由 1000 这个离群点占得比重比较大。所以 FastRCNN 选用稍微缓和一点绝对丢失函数(smooth L1丢失),是跟着差错线性增长,而不是平方增长,经过上图能够看出 L1 、L2 和 Smooth L1 三者之间的关系。
我正在参加技术社区创作者签约计划招募活动,点击链接报名投稿。