yoloV3
yoloV3中加入了9个锚框,这9个锚框是针对训练集用kmeans聚类算出的9个框,分别有大中小三种尺度,每个尺度有三种规格
主干网络:
主干网络darknet53的下采样用的是卷积,残差快中1x1卷积做通道融合,3x3卷积做像素融合和升通道
最后一层输出是13x13的特征图,所以要求输入必须是32的倍数。一般使用时是将原图缩放到416x416大小。整个网络总共输出三种特征图,13x13, 26x26,52x52分别用来侦测大,中,小目标
帧测网络:
13x13特征图输出先经过一个卷积集,然后一个分支是做预测输出,另一个分支用再上采样与26x26输出进行concat(注意这里的上采样并没用反卷积而是用的最近邻插值,因为用了反卷积之后就不能直接表示中层网络的特征了),26x26特征图输出之后也一样。。。
前向过程:
416x416的图片输入网络之后会输出13x13x((1+4+类别数)* 3),26x26x((1+4+类别数)* 3),26x26x((1+4+类别数)* 3)。
1表示置信度,4表示中心点偏移量和长宽偏移量,类别数为onehot
- 置信度:因为置信度是一个0到1之间的值,所以在前向推理或训练时都会给网络输出加一个sigmoid激活,置信度一般是真实框与9个锚框最大IOU,没有中心点的网格置信度为0
- 中心点偏移量:中心点偏移量是相对于一个网格里的偏移量,如下图所示tx,ty为中心点到中心点所在网格的左上角坐标与中心点坐标的距离除以网格大小
- 长宽偏移量:长宽偏移量直接是真实框的长宽乘以锚框的长宽,由于这个量必须大于零所以输出要用exp函数
通过一定的置信度阈值(一般设为0.5)来过滤置信度比较低的网格,然后再通过NMS选择出左后的方框(注意NMS只能同类别上做NMS)。
训练过程
训练时标签形状也是13x13x(1+4+类别数),26x26x(1+4+类别数),26x26x(1+4+类别数),在有中心点的网格上我们让神经网络学习置信度和偏移量,类别。没有中心点的网格上,如果最大IOU大于0.7的化我们也让他学习偏移量,类别,其他的只学习置信度