深度学习:原理简明教程14-深度学习:CNN对象定位以及对象检测
欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程14-深度学习:CNN对象定位以及对象检测
本文主要介绍图像识别的对象检测问题。
主要内容参考Andrew NG。
图像分类:识别一个图像是什么类别,比如是车
图像分类和定位:识别一个图像是什么类别,并且定位
图像检测:识别多个对象,并且定位
如何定位且且进行分类?
图示:
假设类别有4个:新人,车,摩托,背景
设定:左上是(0,0),右下角是(1,1)
输入:图片
输出:类别和bx,by是识别对象的中心,bh和bw是图像的长和宽
我们通过一个CNN提取特征,然后通过softmax进行类别学习,bx,by,bh,bw通过平方差设置cost函数
形式化定义如下:
Pc取值0表示不包含对象,1表示包含对象,c1-c3表示3个类别
左边包含对象,所以要看b的各个值以及c的值,右边不包含对象,所以只用考虑第一个值,所以损失函数为:
解释:
如果y1,也就是Pc为1的话,那么y的所有分量都要看,和标准做差求平方和,如果越小,损失越小
如果y1为0,那么后面的都不用看,只看第一个分量
输入一个x,通过CNN预测一个y^,各个分量和标准的y做差,求平方和。
另外一种叫landmark detection,也可以识别对象并且定位:
该方法主要要识别对象的骨架:
我们可以约定学习骨架要学习多少个坐标点,比如32个,这样y=32*2 + 1 个分量,其中最后一个1表示是否真是对象骨架:
对象检测:Object Detection
实例:
目的:识别图片中的汽车及其位置,可以有多个。
最简单方法:
首先训练一个图像分类器:
该分类器可以通过CNN识别一个小图片是否是汽车。
然后用不同的框,将图片分成不同的小块,对每个小块进行分类,看看是否是汽车,通过这种办法进行识别对象类别和位置:
问题:效率及其低。
解决:[Sermanet et al., 2014, OverFeat: Integrated recognition, localization and detection using convolutional networks]
通过将Fully Connection层转成Convolution层,实现一个框,一遍,可以对整个图像进行对象类别识别:
解释:
第一行的图,实际上将一个小图,通过CNN,进行分类,最后得到的y是一个one-hot表示的向量。
第二行的图,将FC用Convolution替代,先通过5*5 400个filter的Convolution替代第一个FC,再通过1*1 400个filter的Convolution替代第二个FC,最后生成一个1*1*4的one-hot表示的向量
上下两图效果完全一样。
继续:
解释:
第一行的图,对一个14*14*3的图片用上面方法进行对象类别识别
第二行的图,对一个16*16*3的图片,用上面方法,最后输出2*2*4的结果,这个结果什么含义?
实际上就是对16*16*3的图的四个14*14*3的子图,每个进行对象类别识别的结果。也就是14*14方框对输入的图,可以一次通过CNN进行不同位置的类别识别!!!这样就加快了效率。
第三行的图,和第二行的图效果一样。
总结:
一种大小的方框,对输入图片,可以运行一次,就识别出每个方法对象的类别。
但是还是没法准确定位图形位置。
为了不仅识别对象,而且识别位置,我们采用YOLO算法:[Redmon et al., 2015, You Only Look Once: Unified real-time object detection]
首先:
y不再是1*1*4
而是1*1*8,其中这8个值含义前面介绍过。
其次:
指定方框大小后,会一次性学习一个图片中各个小方块情况,学习出这8个值,通过这8个值,我们就可以精确定位每个对象的中心位置,长宽,类别等信息。
注意:bx和by中心只能是0-1之间的值,每个方框左上角为(0,0)右下角为(1,1),但是bh和bw可以超过1
问题:
1)如何评估结果好坏?
看结果和确定的值,和标准值两个方框的intersection over union值。可以设定一个最小值。
2)如果设定的检查方框太小,可能不同方框都检测出了同一个对象,怎么办?
解决:Non-max suppression算法
例如:
我们选取的方框,几个绿色和黄色都识别出来了对象,并且定出了位置:
Non-max suppression算法:
由于得到的y第一个分量是一个概率值,所以我们可以根据他,首先将概率小于阈值的全去掉,留下图中的五个位置结果。
然后我们:
选概率最大的,比如0.9的这个
选择之后把和0.9这个重合IoU大于一定阈值的全部去掉,这样就只留下了左边的两个框和0.9这个
再选择概率最大的0.8的,然后去掉重合的,最后就剩下了两个定位框
标准算法:
再复杂一点:
目标:对象有重合
改进:
其实主要改变y的分量,从8个变成8*2 16个
该方法同时也可以识别一个对象:即pc1为1,而pc2为0,
总结YOLO算法:
训练:
识别:
留言