图片检测问题分为:算法
1.图片分类:是否为汽车(结果只为单个对象)windows
2.分类与定位:是否为汽车 ,汽车位置(结果只为单个对象)网络
3.目标检测: 检测不一样物体 并定位(结果可能含多个对象)dom
分类与定位的表示:函数
分类与定位的输出层可用以下表示: 性能
1.Pc 是否存在测试
2.bx 目标中心的坐标 xatom
3.by 目标中心的坐标 yspa
4.bH 目标高度.net
5.bW 目标宽度
6.C1 是否为分类1
7.C2 是否为分类2
8.C3 是否为分类3
模型训练时,bx、by、bh、bw都由人为肯定其数值。
损失函数:
L(y^,y)=(y^1−y1)2+(y^2−y2)2+⋯+(y^8−y8)2L(y^,y)=(y^1−y1)2+(y^2−y2)2+⋯+(y^8−y8)2
L(y^1,y)=(y^1-y1)2
固然在实际的目标定位应用中,咱们可使用更好的方式是:
比较而言,平方偏差已经可以取得比较好的效果。
除上述的矩形检测外,还能够对目标的关键点特征进行一个检测
其输出为:
1.Pc
2.l1_x,l1_y (记录关键点点特征的位置)
3.l2_x,l2_y
..........
咱们经过标定训练数据集中特征点的位置信息,来对人脸进行不一样位置不一样特征的定位和标记。AR的应用就是基于人脸表情识别来设计的,如脸部扭曲、增长头部配饰等。
在人体姿态检测中,一样能够经过对人体不一样的特征位置关键点的标注,来记录人体的姿态。
目标检测的一种简单算法是滑动窗口检测
首先:搜集一些目标图片和非目标图片做为训练集的样本进行训练获得一个CNN模型 以下图:
注意:训练集图片尺寸较小,尽可能仅包含相应目标
而后从测试图片选择合适的窗口,进行从左到右,从上到下的滑动,对每个窗口使用已经训练好的CNN模型,观察是否有该目标.
若判断有目标,则此窗口即为目标区域;若判断没有目标,则此窗口为非目标区域。
优势:原理简单,且不须要人为选定目标区域(检测出目标的滑动窗即为目标区域)。
缺点:滑动窗口的大小,步长过大选取都会影响到目标检测到的成功率. 因为会对每一个选取的窗口进行CNN网络计算,若是步长小,则会形成计算量大,性能低下.
总而言之,滑动窗口算法不够快,不够灵活
卷积实现滑动窗口
将全链接层转为卷积层:
在上一周课程中,Ng讲授过 1×1 的卷积核至关于在一个三维图像的切片上应用了一个全链接的神经网络。一样,全链接层也能够由 1×1 大小卷积核的卷积层来替代。需注意卷积核的个数与隐层神经元个数相同(即保证输出具备相同的channel)。
最终获得的输出层维度是1 x 1 x 4,表明4类输出值。
咱们以训练好的模型,输入一个16x16x3大小的整幅图片,图中蓝色部分表明滑动窗口的大小。咱们以2为大小的步幅滑动窗口,分别与卷积核进行卷积运算,最后获得4幅10×10×16大小的特征图,然而由于在滑动窗口的操做时,输入部分有大量的重叠,也就是有不少重复的运算,致使在下一层中的特征图值也存在大量的重叠,因此最后获得的第二层激活值(特征图)构成一副12×12×16大小的特征图。对于后面的池化层和全链接层也是一样的过程。
那么由此可知,滑动窗口在整幅图片上进行滑动卷积的操做过程,就等同于在该图片上直接进行卷积运算的过程。因此卷积层实现滑动窗口的这个过程,咱们不须要把输入图片分割成四个子集分别执行前向传播,而是把他们做为一张图片输入到卷积神经网络中进行计算,其中的重叠部分(公共区域)能够共享大量的计算.
值得一提的是,窗口步进长度与选择的MAX POOL大小有关。若是须要步进长度为4,只需设置MAX POOL为4 x 4便可。
依据上面的方法,咱们将整张图片输入到训练好的卷积神经网络中。无需再利用滑动窗口分割图片,只需一次前向传播,咱们就能够同时获得全部图片子集的预测值。
滑动窗口算法所存在的问题,可能没法精准的输出边界框
为解决这个问题,咱们能够采用YOLO(You Only Look Once)算法
YOLO算法:将目标图片划分为N X N个区域,为了简便,接下来的都划分为 3 X3,
而后对每个小区域都采用目标检测与定位的算法,每个小区域的输出和以前所讲的分类与定位的输出是一致的
其中当前区域的Pc=0时,便是检测到的目标中心再也不此区域中,反之,则在此区域 (这里不明白它是怎么判断目标中心在此区域的,若是在某个区域内检测到目标的部分,就能够判断其中心是否在此区域吗,它又如何判断它的完整边界).
YOLO是一次卷积实现,并非在 n×n 网格上进行n^2运算,而是单次卷积实现,算法实现效率高,运行速度快,能够实现实时识别。
bounding boxes 细节:
利用YOLO算法实现目标探测的时候,对于存在目标对象的网格中,定义训练标签Y的时候,边界框的指定参数的不一样对其预测精度有很大的影响。这里给出一个较为合理的约定:(其余定值方式可阅读论文)
Intersection-Over-Union是用来评估其Bounding boxes检测是否准确的,计算公式为:
IoU=I/U
通常在目标检测任务中,约定若是 IoU⩾0.5 ,那么就说明检测正确。固然标准越大,则对目标检测算法越严格。获得的IoU值越大越好。:
YOLO算法中,如果邻近的区域都被判断有同一个目标时,该如何选择,以下:
non-max suppression(非极大值抑制):
1.去掉 Pc<阈值的全部网格
2.对于剩下的,先选取其中Pc最大的,在利用IoU,屏蔽与其交叠较大的网格,重复这个过程,直到结束
以前介绍的都是一个网格只存在一个object的状况,对于一个grid cell存在多个object的状况该如何处理?
引入Anchor boxes
只是在输出中加了个与Anchor box相对应的份量
在进行YOLO算法时,其选取方法与上节的非极大值抑制同样,只是分别对每个Anchor box 进行 NMS.
难点问题:
若是咱们使用了两个Anchor box,可是同一个格子中却有三个对象的状况,此时只能用一些额外的手段来处理;
同一个格子中存在两个对象,但它们的Anchor box 形状相同,此时也须要引入一些专门处理该状况的手段。
可是以上的两种问题出现的可能性不会很大,对目标检测算法不会带来很大的影响。
Anchor box 的选择:
通常人工指定Anchor box 的形状,选择5~10个以覆盖到多种不一样的形状,能够涵盖咱们想要检测的对象的形状;
高级方法:K-means 算法:将不一样对象形状进行聚类,用聚类后的结果来选择一组最具表明性的Anchor box,以此来表明咱们想要检测对象的形状。
此节便是对以前的进行总结,内容以下:
R-CNN:
R-CNN(Regions with convolutional networks),会在咱们的图片中选出一些目标的候选区域,从而避免了传统滑动窗口在大量无对象区域的无用运算。
因此在使用了R-CNN后,咱们不会再针对每一个滑动窗口运算检测算法,而是只选择一些候选区域的窗口,在少数的窗口上运行卷积网络。
具体实现:运用图像分割算法,将图片分割成许多不一样颜色的色块,而后在这些色块上放置窗口,将窗口中的内容输入网络,从而减少须要处理的窗口数量。
Region Proposals共有三种方法:
R-CNN: 滑动窗的形式,一次只对单个区域块进行目标检测,运算速度慢。
Fast R-CNN: 利用卷积实现滑动窗算法,相似第4节作法。
Faster R-CNN: 利用卷积对图片进行分割,进一步提升运行速度。
比较而言,Faster R-CNN的运行速度仍是比YOLO慢一些。
补充:参考自https://blog.csdn.net/red_stone1/article/details/79028058
https://blog.csdn.net/Dby_freedom/article/details/79865515