Tensorflow2.0—SSD网络原理及代码解析(三)- 特征提取网络
model = SSD300(input_shape, NUM_CLASSES, anchors_size)
这行代码进行SSD特征提取网络的构建。一起来看看内部代码是如何实现的~
首先,先进行VGG16网络的搭建。
上述就是VGG16网络,用一个dict按照name进行保存。然后return回SSD特征提取网络代码中。接下来,就是对特定的网络层进行处理了~
# 对conv4_3的通道进行l2标准化处理
# 38,38,512
net['conv4_3_norm'] = Normalize(20, name='conv4_3_norm')(net['conv4_3'])
num_priors = 4
# 预测框的处理
# num_priors表示每个网格点先验框的数量,4是x,y,h,w的调整
net['conv4_3_norm_mbox_loc'] = Conv2D(num_priors * 4, kernel_size=(3,3), padding='same', name='conv4_3_norm_mbox_loc')(net['conv4_3_norm'])
net['conv4_3_norm_mbox_loc_flat'] = Flatten(name='conv4_3_norm_mbox_loc_flat')(net['conv4_3_norm_mbox_loc'])
# num_priors表示每个网格点先验框的数量,num_classes是所分的类
net['conv4_3_norm_mbox_conf'] = Conv2D(num_priors * num_classes, kernel_size=(3,3), padding='same',name='conv4_3_norm_mbox_conf')(net['conv4_3_norm'])
net['conv4_3_norm_mbox_conf_flat'] = Flatten(name='conv4_3_norm_mbox_conf_flat')(net['conv4_3_norm_mbox_conf'])
priorbox = PriorBox(input_shape, anchors_size[0], max_size=anchors_size[1], aspect_ratios=[2],
variances=[0.1, 0.1, 0.2, 0.2],
name='conv4_3_norm_mbox_priorbox')
net['conv4_3_norm_mbox_priorbox'] = priorbox(net['conv4_3_norm'])
我就以第一个有效特征层进行解释,这是VGG16中conv4_3层,shape为(None,38,38,512)。由于第一层比较浅,所以对它做一个L2标准化操作,conv4_3_norm的shape不变还是(None,38,38,512)。然后进行预测框的生成,在代码实现中体现为feature map的channel的改变。conv4_3_norm_mbox_loc的shape为(None,38,38,16),最后一维的16是表示每个锚点生成4个box,每个box有xywh信息。conv4_3_norm_mbox_conf的shape为(None,38,38,84),最后一维84是表示每个锚点生成4个box,每个box包含21个类别概率。然后都将二者进行flatten操作。
预测框生成之后,就是要对锚点框进行生成操作~
priorbox = PriorBox(input_shape, anchors_size[0], max_size=anchors_size[1], aspect_ratios=[2],
variances=[0.1, 0.1, 0.2, 0.2],
name='conv4_3_norm_mbox_priorbox')
net['conv4_3_norm_mbox_priorbox'] = priorbox(net['conv4_3_norm'])
其实这个步骤与我写的Tensorflow2.0—SSD网络原理及代码解析(二)-锚点框的生成代码几乎一样,其实就是进行锚点框的生成。
结果就是(None,5776,8),表示生成了5776个anchor box,每个box前四个是左上角右下角坐标,后四个是variances[0.1, 0.1, 0.2, 0.2]。同理:
接着,进行anchor box维度上的拼接:
最后,进行reshape并进行concat:
这里。net[‘predictions’]就包含着预测框的loc和conf信息,和锚点框的信息。shape为(None,8732,33),8732表示一共有8732个anchor box。