文章目录
只描述代码每个函数的含义,具体含义参考代码解析。
一. core.common.py代码理解
构建darknet和yolov3的时候会用到这个py文件
yolov3具体的骨干网络模型参考
其中DBL由convolutional函数表示
res由residual_block表示
concat由route表示,但是代码中实际上没有使用route函数,而是直接使用concat
上采样由upsample表示。
1. convolutional函数:
函数表示darknet最基本的卷积过程:包括: 卷 积 + B N / 偏 置 + 非 线 性 卷积+BN/偏置+非线性 卷积+BN/偏置+非线性
返回:经过上面几个操作的输出。
def convolutional(input_data, filters_shape, trainable, name, downsample=False, activate=True, bn=True):
# input_data:输入数据 shape(?,416,416,3)等
# filters_shape:filter的大小和形状 shape(3,3,32输入通道数,64输出通道数)
# trainable:BN层是训练过程,还是测试过程
# name:每个卷积的权重参数的名字
# downsample:是否下采样,即:是否需要使得输出图片大小是输入图片的一半
# activate:是否使用激活函数
# bn:是否使用bn层,使用bn层,则不使用bias,不使用bn,就是用bias层
return conv
2. residual_block
def residual_block(input_data, input_channel, filter_num1, filter_num2, trainable, name):
...
return residual_output
使用resnet模块:input经过 1 ∗ 1 1*1 1∗1和 3 ∗ 3 3*3 3∗3然后再和input进行相加。
返回得到经过一个res模块的输出。
3. route
def route(name, previous_output, current_output):
...
return output
感觉本来是要用于分支之间的拼接,但是代码后期并没有使用这个函数进行拼接,而是直接使用了tf.concat。所以这个函数好像没什么意义。
4. upsample上采样
def upsample(input_data, name, method="deconv"):
...
return output
通过resize和反卷积两种方式进行上采样。
返回得到上采样以后得到的输出。
二. core.backbone.py
构建yolov3的时候会用到darknet骨干特征提取网络
1. darknet53
就darknet一个函数,表示骨干特征提取的过程。
def darknet53(input_data, trainable)
# trainable表示bn层是训练还是测试过程
...
return route_1, route_2, input_data
返回的是三个分支:
route_1:第一个res8的输出分支
route_2:第二个res8的输出分支
input_data:res4的输出分支
三. core.yolov3.py
train和test的时候都会用到这个yolov3.py,这个文件中不仅有网络构建部分,还有损失函数的部分。
只有一个YOLOv3类:
class YOLOV3(object)
构建整个yolov3网络,包括损失函数。
1. __init__初始化函数
def __init__(self, input_data, trainable):
创建类的时候自动调用的函数。
需要传入参数:输入图片,以及是训练过程还是测试过程。
函数中还定义了构建yolov3网络必须用到的参数:比如classes;num_class;strides
等等。具体看代码。
函数中调用了decode函数:得到对应resize之后的原图中的结果,得到:pred_sbbox;pred_mbbox;pred_lbbox
。
shape:(batch_size,13,13,3,类别数+类别分数)
坐标也是针对resize之后的原图。
2. __build_nework
def