文中图片均来自博客,作者写得真好。
1.网络结构
YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。下图可以更加清楚地看到全连接层部分的结构:
2.损失函数
作者没有采用传统的sum-squared error loss,虽然这个loss 很容易优化,但是不符合检测目标,作者分别对bounding box坐标预测loss和未包含物体的bounding box概率loss施加不同的权重,因为在一幅图中,大部分网格都不包含物体,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。
在检测中希望同样的偏差在大尺寸box中的影响要小于小尺寸的box,如果采用传统的sum-squared error loss,那么这两者的loss是一样的,为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。见下图(原作者很厉害,用这么直观的方式理解原因,举例子都没这么直观):
3. 后处理过程
S =7 B = 2 C = 20 ,网络输出7x7x30的张量,在每个网格中,每个对象Ci位于第j个bounding box的概率为:
将网络输出张量重写为20x(7x7x2)的结构,矩阵的数据为Score(ij),具体过程如上图所示:
- 将得分小于阈值(0.2)的数据设置为0;
- 将每一行得分从高到低排序(一行属于一类);
- 对每一行利用NMS算法去掉重复率较大的box;
- 最后每个box取20个类别中score最大的那一个(从列看),如过得分大于0,那么box中就是score对应的类别以及相应的坐标;否则box就没有物体。