yolo算法目标检测

目标检测

图片分类定位问题

定义:

将图片中的对象检测识别出来,并用边框圈出对象在图片中位置的过程即为图片对象的分类与定位。

解决思路:

在这里插入图片描述

​ 如果要检测图片中的一辆汽车,并用红色的方框标注出它在图片的位置,那么,将图片利用卷积神经网络和softmax分类找到图片中的汽车;然后再确定图片左上角和右下角的坐标值(0,0),(1,1),接着在汽车的中心位置确定一个点,设该点的坐标为(bx,by),方框的高和宽为bw和bh。则,bx,by,bh,bw四个将作为卷积神经网络的输出一起输出出来。这样即可检测定位图片中的汽车。

​ 对于这张图片,我们设置四个分类:行人,汽车,摩托车,背景。那么,在softmax层输出的形式即为:
y = [ P c b x b y b w b h c 1 c 2 c 3 ] y= \left[ \begin{matrix} Pc\\ bx\\ by\\ bw\\ bh\\ c1\\ c2\\ c3 \end{matrix} \right]
​ 其中,Pc为0表示图片中无对象,只有背景,若Pc=1,则表示有行人,汽车或者摩托车。(bx,by)为对象中心点坐标,bw,by为边框的宽度和高度;c1=1,c2=1,c3=1,则表示检测对象中含行人,汽车,摩托车,如果为0则表示没有。

​ 那么,对于上述图片,由于只有一个对象,故c1,c2,c3中只有一个为1,则输出的y应该为:
y = [ 1 b x b y b w b h 0 1 0 ] y= \left[ \begin{matrix} 1\\ bx\\ by\\ bw\\ bh\\ 0\\ 1\\ 0 \end{matrix} \right]
​ 那么,损失函数为:
L y , y = ( y 1 y 1 ) 2 + ( y 2 y 2 ) 2 + . . . . . . + ( y 8 y 8 ) 2 L(y^*,y)=(y1^*-y1)^2+(y2^*-y2)^2+......+(y8^*-y8)^2
​ 所以,如果y1=1,则代表Pc=1;而如果y1=0,则Pc=0,后面的参数不用去管了,只要保证Pc的准确度即可,所以,Pc用逻辑回归即可。

特征点检测

我们要检测人脸的表情,是微笑,是难过还是无表情等,就需要对人脸进行特征点检测,例如:

在这里插入图片描述

对于一张人脸,想要识别的更精准,就相应的要多在脸上取点。这里,取脸部特征点64个,依次为:
( l 1 x l 1 y ) , ( l 2 x , l 2 y ) , ( l 3 x , l 3 y ) , . . . . . . , ( l 6 4 x , l 6 4 y ) (l_1x,l_1y),(l_2x,l_2y),(l_3x,l_3y),......,(l_64x,l_64y)
所以,具体做法是把图片输入至卷积神经网络,输出1+642个参数,其中,第一个参数为:
l 0 l_0
表示图片中有无人脸,有即为1,没有则为0,剩余的64
2个参数即为脸部的64个特征点参数。

基于滑动窗口的目标检测算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6ubcPUK-1578218376675)(E:\吴恩达深度学习笔记\目标检测\4.bmp)]

​ 基于滑动窗口的目标检测算法就是自己设定一个合适大小的滑动窗口,以固定的步幅依次剪切图片。首先设置好训练集标签,即剪切的图片如果有汽车,y=1,如果没有汽车,y=0。有了这个训练集标签后,即可开始将剪切好的图片输入到神经网络训练了。

​ 这种方法的缺点为:计算成本高。那么该如何解决这个问题呢?

​ 由于这样剪切到的图片会有很多部分有相同的,如果一张张的输入到神经网络进行计算,计算成本很高,而卷积层具有权值共享的特点,于是可以将全连接层变为卷积层,便可以解决计算成本高的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zs24d3qM-1578218376675)(E:\吴恩达深度学习笔记\目标检测\全连接层变为卷积层.bmp)]

Bounding Box预测——YOLO算法

​ 上面说的滑动窗口法检测对象,其实窗口并不一定可以包容整个对象进去,甚至有些对象要想完全包进去需要的不一定是方框形状的窗口,那么如何解决这个问题?

​ 这里介绍YOLO算法。(YOLO——you only look once)

​ 如果要检测的图像为100*100像素的,首先用个3×3的各子分隔图像,实际中可能是更为精细的格子,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keCCPt69-1578218376677)(E:\吴恩达深度学习笔记\目标检测\yolo1.bmp)]

​ 然后将这九张图片输入至滑动窗口算法,所以,九个格子每一个都需要指定一个标签y,y仍是和上述一样,是个八维向量。

​ YOLO算法就会取两个对象的中点,然后将对象分配给包含对象的格子,并用方框框出对象的位置。

交并补函数——用于评价对象检测算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NeUraohb-1578218376677)(E:\吴恩达深度学习笔记\目标检测\交并补.bmp)]

​ 我们需要的方框是红色的,而实际算法得到的方框为紫色的,那么交并补函数就会计算两个方框的交集占两个方框并集的比例。一般比例loU≥0.5,即可认为合格。

非极大值抑制

​ 对象检测定位算法可能对对象检测了多次,事实上检测一次就够了,为了避免这种情况,我们采用非极大值抑制,它可以确保算法只检测一次对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sy0YAepy-1578218376678)(E:\吴恩达深度学习笔记\目标检测\非极大值抑制.bmp)]

不采用非极大值抑制得到的结果会是一辆车有多个方框,如果采用了非极大值抑制,就会首先找出Pc最大的方框,为0.9,然后抑制掉其余的边框。

​ 非极大值意味着只输出最大的分类效果,抑制很接近但不是最大的其他预测结果。

Anchor boxes

​ 当两个对象出现在同一个格子中,可用anchor box来处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQUNRf27-1578218376678)(E:\吴恩达深度学习笔记\目标检测\anchor box.bmp)]

​ 在这里,我要同时检测行人和汽车,首先还是按照原来的窗口滑动算法,然后非极大值抑制,便得到了两个方框。同时,我们根据检测对象的形状定义两个anchor box:

在这里插入图片描述

非极大值抑制,便得到了两个方框。同时,我们根据检测对象的形状定义两个anchor box:

在这里插入图片描述
在这里插入图片描述
​ 然后,将得到的方框与anchor box进行匹配,显然行人与anchor box1匹配度高,于是在行人上放上anchor box1,汽车与anchor box2匹配度高,于是在汽车上放上anchor box2.



内容来自吴恩达老师深度学习课程,如有错误还请指出批评,谢谢!

猜你喜欢

转载自blog.csdn.net/tqptr_opqww/article/details/103845523