看了一个大佬的博客,简单记一下YOLOv3。
一、网络结构
从这里盗了图:
二、backbone:darknet-53
分类效果:相对于ResNet-152和ResNet-101,darknet-53不仅在分类精度上差不多,计算速度还比ResNet-152和ResNet-101强多了,网络层数也比他们少
模型改进点1:yolo_v3这个网络是一个全卷积网络,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,作者直接摒弃了POOLing,用conv的stride来实现降采样。在这个网络结构中,使用的是步长为2的卷积来进行降采样。
模型改进点1:为了加强算法对小目标检测的精确度,YOLO v3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是26×26和52×52),在多个scale的feature map上做检测。
三、output
预测头
backbone中一共有5次下采样,输出的3个预测头,分别在32倍降采样、16倍降采样、8倍降采样时进行预测,实现多尺度检测。
- y1:直接在32倍降采样特征图【13**13】上进行预测
- y2: 16倍降采样特征图【26*26】与 32倍降采样特征图上采样2倍【13*13】--->【26*26】的结果进行Concat拼接,在此结果上进行预测
- y3: 8倍降采样特征图【52*52】与 y2预测所用特征图上采样2倍【26 * 26 --> 52 * 52】Concat拼接,在此结果上进行预测
预测输出
怎么预测:针对每个预测特征层,最后都是同一个1 * 1的卷积层。当1 * 1的卷积核每滑动到一个预测特征图上的每一个cell时,会预测3个边界框(bounding box)的一些预测输出值。边界框的大小是由先验框(anchor box)的尺寸决定的。
3个特征图用的anchor大小是不一样的:
- 32倍降采样的感受野最大,适合检测大的目标,所以在输入为416×416时,每个cell的三个anchor box为(116 ,90); (156 ,198); (373 ,326)
- 16倍适合一般大小的物体,anchor box为(30,61); (62,45); (59,119)。
- 8倍的感受野最小,适合检测小目标,因此anchor box为(10,13); (16,30); (33,23)。
所以当输入为416×416时,实际总共有(52×52+26×26+13×13)×3=10647个proposal box,即【1, 10647, 85】;
预测输出内容:每个anchor的预测输出内容为(Xcenter, Ycenter, w, h, confidence,类别1概率,类别概率,..... ,类别80概率)。
一张图的实际输出会有10647个bounding box?
logistic回归:
对anchor包围的部分进行一个目标性评分(objectness score),即这块位置是目标的可能性有多大。这一步是在predict之前进行的,可以去掉不必要anchor,可以减少计算量。
另外,还会从9个anchor priors中找到objectness score(目标存在可能性得分)最高的那一个。
所以一张图的实际输出bounding box数量应该少于10647。
参考: