上周我们搭建了一套“Windows 10+YOLO v3+Deep_Sort多目标跟踪实验环境”,并做了一些简单的测试记录,具体内容请参考:
https://blog.csdn.net/weixin_41943311/article/details/93747924
那么本周,我们需要详细了解一下YOLO v3的darknet53的网络是什么样的,或者说,是怎样在Keras+Tensorflow环境中一步步构造出这个darknet53网络的(C++环境下的构造过程,先放一放),那么下面我们就来看一看。
Keras YOLOv3源代码下载地址:https://github.com/qqwweee/keras-yolo3
关于darknet53网络的构建,请查看源文件:keras-yolo3-master\yolo3\model.py
作为新手,如果对卷积核/过滤器、特征图、卷积层这些概念还不是很清楚,可以先跳到这篇文章来简单学习一下:
https://blog.csdn.net/weixin_41943311/article/details/94434958
这篇文章主要内容分为三部分,(一)darknet53的网络结构,(二)darknet53网络的输出,(三)Netron工具。
(一)darknet53的网络结构
darknet53的网络结构如下图所示(图中默认的输入是256X256大小的图片,而实际上YOLO v3建议的输入图片大小为416 X416,因而下图中的256 X256、128 X128、64 X64、32 X32、16 X16、8 X8分别应修改为:416 X416、208 X208、104 X104、52 X52、26 X26、13 X13):
即:darknet53一共53层卷积,除去最后一个FC(全连接层,实际上是通过1x1卷积实现的)总共52个卷积用于当做主体网络。
这52个卷积层是这样组成的:
首先是1个32个过滤器的卷积核,然后是5组重复的残差单元resblock_body(这5组残差单元,每个单元由1个单独的卷积层与一组重复执行的卷积层构成,重复执行的卷积层分别重复1次、2次、8次、8次、4次;在每个重复执行的卷积层中,先执行1x1的卷积操作,再执行3x3的卷积操作,过滤器数量先减半,再恢复),一共是52层。残差计算不属于卷积层计算。
52 = 1+ (1+1*2 ) + (1+2*2) + (1+8*2) + (1+8*2) + (1+4*2)
每组残差单元的第一个单独的卷积层操作均是一次步长为2的卷积操作,因此整个YOLO v3网络一共降维5次32倍,即:32=2^5,最后输出的特征图维度是13,即:13=416/32;最后1层的通道数是1024,最终的输出结构是(?, 13, 13, 1024)。所以,darknet53模型的输入是(?, 416, 416, 3),输出是(?, 13, 13, 1024)。
这个52层网络是这么定义的:
def darknet_body(x):
'''Darknent body having 52 Convolution2D layers'''
x = DarknetConv2D_BN_Leaky(32, (3, 3))(x)
x = resblock_body(x, num_filters=64, num_blocks=1)