目标检测算法实现细节
代码:https://github.com/experiencor/keras-yolo2
1 网络结构的构建
输入维度:
416*416(yolo v2为全卷积网络,可以接受任意尺寸的图像输入)
输出维度:
13*13*(5+80/20)
栅格数*anchor box个数*(5+类别数)
5中1个元素表示是目标的置信概率,4个元素为目标框的信息(x,y,w,h)
网络结构:
跑过的是yolov2-voc的模型,共23个卷积层,参照goolenet的设计结构,不过没有使用goolenet中的inception模块,而是简单的使用1*1卷积后面接3*3卷积的模式,简化网络
-
卷积滤波器模板:主要用到3*3卷积(same模式)和1*1卷积(主要用于压缩通道),1*1卷积也可以用于构建瓶颈层,降低计算成本(比如将28*28*192->28*28*32变为中间插入1*1 卷积,28*28*16)
-
池化模板:主要用到2*2的池化,用于缩小尺寸,共有5个池化层(1/2/5/8/13)
-
每层进行Batch Norm,规范化网络,学习速度更快,而且有正则化效果,无需在进行dropout
-
用leakyRelu的激活函数(相比relu解决了神经死亡问题,相比sigmoid和tanh函数,减轻了梯度消失问题)
优化方法
-
Adam梯度下降算法
训练样本
-
voc2007
-
训练集和测试集均为2500多张图片,6300多个目标,类别20(人、动物、交通工具、室内物体)
anchor box的作用思考
-
学习时有一定参考,可以更快收敛
-
让一个栅格可以检测多个目标
2 loss函数的构建
loss
-
四类loss,分别是object、noobject、class、coord。总体loss是四个部分的平方和
-
权重不同,对有目标的权重为5,其余为1
-
yolov2不直接预测位置信息,而是预测位置相对于anchor box的变换关系
下图分别为yolo_v1和yolo_v2的loss函数