论文传送门:YOLOv3: An Incremental Improvement
Yolov3的改进:
1.使用Darknet53作为backbone;
2.多尺度特征预测(类似FPN结构);
3.其他tricks。
Yolov3的结构:
backbone为Darknet53的特征提取部分,其中Convolutional表示Conv+BN+LeakyReLU,Residual表示进行残差连接;
输入图像经过backbone提取出三层特征层,由浅层到深层分别标记为feature0、feature1和feature2;
首先将feature2经过Convolutional Layers,其输出一边经过Convolutional+Conv输出out2,另一边经过Convolutional和Upsampling,再与feature1相接;
Concat的特征一边经过Convolutional+Conv输出out1,另一边经过Convolutional和Upsampling,再与feature0相接;
最后Concat的特征经过Convolutional+Conv输出out0;
其中,Convolutional Layers的结构为5层Convolutional堆叠,其卷积核大小为 [ 1 , 3 , 1 , 3 , 1 ] [1,3,1,3,1] [1,3,1,3,1];
除了Concat后的第一个Convolutional和图片输入的第一个Convolutional,其余Convolutional中,卷积核尺寸为3,则通道数翻倍;卷积核尺寸为1,则通道数减半。
Yolov3的输出:
网络输出为三层,在COCO目标检测任务中,当输入图像尺寸为(3,416,416)时,输出的结果为:
Out 0 (255,52,52),用于预测小尺寸目标;
Out 1 (255,26,26),用于预测中尺寸目标;
Out 1 (255,13,13),用于预测大尺寸目标。
与Yolov2相似,其中,52x52,26x26,13x13均代表预设的anchor位置; 255 = ( 4 + 1 + 80 ) ∗ 3 255=(4+1+80)*3 255=(4+1+80)∗3,4代表目标回归参数,1代表目标置信度,80代表80个类别的条件概率,最后一个3代表anchor的尺寸数,即每个位置存在3种尺寸的anchor(针对每一层Out而言)。
(代码仅实现模型结构部分)
Yolov3的尝试:
关于预测形式和损失函数,作者尝试过一些不奏效的策略,其中值得注意的是Focal Loss。作者使用Focal Loss作为损失函数的基本形式,导致mAP降低了两个点,其不奏效的原因作者也不完全确定。
import torch
import torch.nn as nn
def convolutional(in_channels, out_channels, kernel_size, strid): # Conv+BN+LeakyReLU
padding = 1 if kernel_size == 3 else 0
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size, strid, padding