def DarknetConv(x, filters, size, strides=1, batch_norm=True):if strides ==1:
padding ='same'else:
x =ZeroPadding2D(((1,0),(1,0)))(x) # top left half-padding
padding ='valid'
x =Conv2D(filters=filters, kernel_size=size,
strides=strides, padding=padding,
use_bias=not batch_norm, kernel_regularizer=l2(0.0005))(x)if batch_norm:
x =BatchNormalization()(x)
x =LeakyReLU(alpha=0.1)(x)return x
def DarknetResidual(x, filters):
prev = x
x =DarknetConv(x, filters // 2, 1)
x =DarknetConv(x, filters,3)
x =Add()([prev, x])return x
def DarknetBlock(x, filters, blocks):
x =DarknetConv(x, filters,3, strides=2)for_ in range(blocks):
x =DarknetResidual(x, filters)return x
def Darknet(name=None):
x = inputs =Input([None, None,3])
x =DarknetConv(x,32,3)
x =DarknetBlock(x,64,1)
x =DarknetBlock(x,128,2) # skip connection
x = x_36 =DarknetBlock(x,256,8) # skip connection
x = x_61 =DarknetBlock(x,512,8)
x =DarknetBlock(x,1024,4)return tf.keras.Model(inputs,(x_36, x_61, x), name=name)
yolov3最突出的特点是它可以在三种不同的尺度上进行检测。代码如下
#这里体现了yolov3 模型的多尺度,就是同时提取模型的多层特征
#如下的 x_36, x_61, x
x_36, x_61, x = Darknet(name='yolo_darknet')(x)