终于解决了毕业的一系列问题,简书和个人博客恢复正常更新频率(当然我断更这么久也没人发现不是【摊手】)惊喜的发现简书有了公式渲染功能,但是大型公式还是渲染不出来,因此公式完整版请参见个人博客
基本思路
YOLO(You Only Look Once)是一种目标检测系统,其特点是将物品识别和物品分类融合,使用一个深度学习模型直接计算出物体的位置和类型。基本思路如下所示:
yolo_basic.JPG首先图片被分为S \times S个框,如最左边的图所示。对于每个框,若一个物体的中心落在该框中,则这个框负责该物体的类型和位置预测。对于每个框,需要计算以下数据:
- B个Bounding boxes的数据,共B \times 5个。每个框对应5个数据,分别是:
- x:物体中心x的位置
- y:物体中心y的位置
- w:物体水平长度
- h:物品垂直长度
- conf:物品置信度,即有多大的概率这个框包含了物体,定义conf =P(object) \times IOU_{pred}^{truth},即该指标同时考虑物品的存在可能性和对应Bounding boxes与真实物体重叠的面积。
- 所属类别:共C个,分别对应物品的种类,用于标记这个框的属于哪一个物体。
在VOC数据集中,共有20类物品,即C=20。取S = 7,B = 2,因此最后数据共7 \times 7 \times (20 + 5 \times 2) = 7 \times 7 \times 30个,表示为维度为[7,7,30]。
网络设计
网络结构的设计如下:
yolo_network.JPG网络的设计取材与GoogLeNet,其中将Inception结构简单的换成了1x1卷积和3x3卷积的串联。同时需要注意的是激活函数使用的leaky常数为0.1的leaky relu函数。
除此之外,上文所提到的x,y,w,h参数均被归一化——中心位置x,y使用框的尺寸归一化,w,h使用图片尺寸归一化。如此操作后,x,y,w,h均归一化到0~1。
训练与预测
预训练
该模型首先在ImageNet进行了预训练,Top-5准确率达到88%。训练开始前保留前20层卷积的参数。
正式训练
训练的代价函数分为五个部分,如下所示(此处公式渲染不完全):
$$
Loss = L oss_{xy} + Loss_{wh} + Loss_{obj} + Loss_{noobj} + Loss_c \\
Loss_{xy} = \lambda_{coord} \sum\limits_{i=0}^{S^2}{\sum\limits_{j=0}^{B}{l_{ij}^{obj}[(x_i - x'_i)^2 + (y_i-y'_i)^2]}} \\
Loss_{wh} = \lambda_{coord}\sum\limits_{i=0}^{S^2}{\sum\limits_{j=0}^{B}{l_{ij}^{obj}[(\sqrt w_i - \sqrt{ w'_i})^2 + (\sqrt h_i-\sqrt{h'_i})^2]}} \\
Loss_{obj} = \sum\limits_{i=0}^{S^2}{\sum\limits_{j=0}^{B}l_{ij}^{obj}(C_i - C_i')^2} \\
Loss_{noobj} = \lambda_{noobj}\sum\limits_{i=0}^{S^2}{\sum\limits_{j=0}^{B}l_{ij}^{noobj}(C_i - C_i')^2} \\
Loss_c = \sum\limits^{S^2}_{i = 0}l^{obj}_i\sum\limits_{c \in classes}{(p_i(c) - p'_i(c))^2}
$$
其中,l_{i}^{obj}用于标记是否有物体出现在i框中,若有为1,否则为0;l_{ij}^{obj}用于标记是否有物体出现框i中的第j个Bounding box中,若有为1,否则为0。由于一个框会产生多个Bounding Box,这里取与真实区域IOU最高的Bounding Box负责该物体的预测。\lambda_{noobj}和\lambda_{coord}为格点包括物体和不包括物体的两种情况区分对考虑,有\lambda_{noobj} = 0.5和\lambda_{coord} = 5。
Loss_{xy}和Loss_{wh}是针对物品位置的代价项,Loss_{obj}和Loss_{noobj}是针对物品存在置信度的代价项。Loss_c则是针对物品类别的代价项。假设一个网络输出了一个[7x7x(20+2X5)]的输出向量。假设仅在位于a,b的网格中有一个物体。则l_{i=a \times b}^{obj} = 1,l_{i \neq a \times b}^{obj} = 0,则有Loss_c = \sum\limits_{c \in classes}(p_{a \times b}(c) - p'_{a \times b}(c))^2。对于该网格,有B个Bounding Box,假如标号为k的Bounding Box与该物体的IOU最高,则l^{obj}_{i = a \times b,j = k} = 1,l^{obj}_{i \neq a \times b,j \neq k} = 0,即计算Loss时仅考虑k号Bounding Box的损失,k号Bounding Box被指定负责该物品的检测。
测试
测试时,每测试一张图片,都会获得S \times S \times B个Bounding Box,根据个人理解,每个格点有唯一的归属,因此可以对每个格点的B个Bounding Box取置信度最高的一个,即有S \times S个Bounding Box。在这些Bounding Box中,可以设置一个阈值,筛去置信度低的格点。对于最后的格点,进行非最大值抑制:即对IOU超过一定阈值且属于同一类的Bounding Box比较置信度,选择置信度最高的Bounding Box。
网友评论