6 通俗学AI:始入目标检测( 二 )


我觉得这种思想就是要网络先从大型数据集中学会一些基础形状颜色等先验知识,然后再去学习你给它的新知识,就事半功倍 。而论文作者这里使用的大型数据集是 。
SVM分类
实际上作者选取的不是整个,最后一个全连接层(由4096个神经元到1000的那层)是被扔掉的,因此卷积网络输出的最终结果是一个[2000,4096]的矩阵,这是一个二维矩阵,我们可以把它看成一个有2000行、4096列的矩阵(2000是因为有2000个候选框,4096是因为最后一层神经元有4096个),我们要把它整成一个[2000,21]的矩阵,2000是指有2000个候选框,21是指20类加一个背景判断,相当于一个候选框对应一条向量,向量里有21个数,其中每个代表这个物体属于这一类的概率,还有一个数是指这个物体属于背景的概率 。
那根据矩阵乘法,我们应该要让[2000,4096]乘上一个[4096,21]的矩阵,相当于训练21个SVM分类器,把每个候选框那4096个输出值塞进去做分类 。
训练样本问题
首先我们先来了解一下如何定义两个框的重叠度 。我们这里使用IOU衡量重叠度 。IOU就是两个框的交集除两个框的并集,如下图 。
图片来自网络
然后我们再回到训练样本的问题 。我们要知道,CNN(也就是卷积神经网络)使用小样本进行训练很容易拟合,所以我们要尽量平均正例和负例的比例 。首先,我们用 算法获取2000个框,计算每个框和我们自己标注的框(label)之间的IOU,然后IOU大于0.5,那么我们就认为这个框为正例,如果小于0.5,那么就是反例 。随后我们每次训练时以128张图为一批(32个正例,96个反例) 。
【6通俗学AI:始入目标检测】但等我们训练SVM分类器时,我们就以IOU小于0.3的为反例,以我们标注的框(label)为正例,其他忽略掉 。
因为SVM是小样本训练,所以我们可以设置严格的标准,提高结果精度而不影响训练 。而CNN是大样本训练,我们需要更多的数据,尽可能平衡正反例的比例,所以我们选取比较宽松的IOU标准 。如果我们使用来做分类器,要和CNN连在一起训练,要大样本,选取标准就宽松,最后的效果就比较差 。这也是为什么不用简单的,而搞这么复杂用SVM的原因 。
检测框回归
刚才也说了,因为我们使用 算法选出的2000个候选框,他的位置不一定靠谱,所以我们要在原来的基础上对候选框进行精修 。所谓精修,就是将这个框进行平移,同时进行缩放,使这个框和我们自己标注的label相似 。平移涉及框在图片上的位置,放缩涉及框的长宽,因此我们在目标检测任务中一般使用四个量来描述一个框:x和y代表框中点在像素坐标系上的坐标,w和h代表框的宽和高 。因此论文中提出这么一个公式:
图片来自论文
解释一下,P为我们原来的候选框,而G为我们标注的label中的框(也就是-true),而G上面戴着个小帽子代表这是我们将P修正后的框,我们期望它与G在位置和形状上很相似 。而d代表了一个函数,我们将P代入就能得到的缩放值 。
举个例子,一个戴帽子的G的下标是x,说明这个是修正框的x,而得到这个值的办法就是让候选框的x乘上一个数,这个数由P代入d函数中得到,最后再加上原来候选框的x 。
所以说这四个d函数是关键,但我们不能只求四个固定的d函数,如果固定了,就相当于所有的候选框都遵循同一个平移放缩原则,所以我们应该需要2000组d函数,也就是每个候选框都有四个与之对应的d函数 。
这时候很多人情不自禁地想到,我可以弄一个[4,4]的矩阵,让[2000,4]的矩阵(2000个初始候选框)去乘它,不就得到了一个[2000,4]的结果了嘛?(2000个修正后的框)