def yolo_body(inputs, num_anchors, num_classes): feat1, feat2, feat3 = mobilenetv1(inputs) # (13, 13, 1024) -> (13, 13, 512) x, y1 = make_last_layers(feat3, 512, num_anchors*(num_classes + 5)) # (13, 13, 512) -> (26, 26, 256) x = compose( DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat2]) # (26, 26, 256) -> (52, 52, 128) x, y2 = make_last_layers(x, 256, num_anchors*(num_classes + 5)) x = compose( DarknetConv2D_BN_Leaky(128, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat1]) # (52, 52, 256) -> (52, 52, 128) x, y3 = make_last_layers(x, 128, num_anchors*(num_classes + 5)) return Model(inputs, [y1, y2, y3])
def yolo_body(inputs, num_anchors, num_classes): feat1, feat2, feat3 = CSPdarknet53(inputs) # SPP net P5 = DarknetConv2D_BN_Leaky(512, (1, 1))(feat3) P5 = DarknetConv2D_BN_Leaky(1024, (3, 3))(P5) P5 = DarknetConv2D_BN_Leaky(512, (1, 1))(P5) maxpool1 = MaxPooling2D((13, 13), strides=(1, 1), padding='same')(P5) maxpool2 = MaxPooling2D((9, 9), strides=(1, 1), padding='same')(P5) maxpool3 = MaxPooling2D((5, 5), strides=(1, 1), padding='same')(P5) P5 = Concatenate()([maxpool1, maxpool2, maxpool3, P5]) P5 = DarknetConv2D_BN_Leaky(512, (1, 1))(P5) P5 = DarknetConv2D_BN_Leaky(1024, (3, 3))(P5) P5 = DarknetConv2D_BN_Leaky(512, (1, 1))(P5) P5_upsample = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(P5) P4 = DarknetConv2D_BN_Leaky(256, (1, 1))(feat2) P4 = Concatenate()([P4, P5_upsample]) P4 = make_last_layers(P4, 256) P4_upsample = compose(DarknetConv2D_BN_Leaky(128, (1, 1)), UpSampling2D(2))(P4) P3 = DarknetConv2D_BN_Leaky(128, (1, 1))(feat1) P3 = Concatenate()([P3, P4_upsample]) P3 = make_last_layers(P3, 128) # yolo_output3 shape(b, 52, 52, 3, num_classes + 5) P3_output = DarknetConv2D_BN_Leaky(256, (3, 3))(P3) P3_output = DarknetConv2D(num_anchors * (num_classes + 5), (1, 1))(P3_output) P3_downsample = ZeroPadding2D(((1, 0), (1, 0)))(P3) P3_downsample = DarknetConv2D_BN_Leaky(256, (3, 3), strides=(2, 2))(P3_downsample) P4 = Concatenate()([P3_downsample, P4]) P4 = make_last_layers(P4, 256) # yolo_output2 shape(b, 26, 26, 3, num_classes + 5) P4_output = DarknetConv2D_BN_Leaky(512, (3, 3))(P4) P4_output = DarknetConv2D(num_anchors * (num_classes + 5), (1, 1))(P4_output) P4_downsample = ZeroPadding2D(((1, 0), (1, 0)))(P4) P4_downsample = DarknetConv2D_BN_Leaky(512, (3, 3), strides=(2, 2))(P4_downsample) P5 = Concatenate()([P4_downsample, P5]) P5 = make_last_layers(P5, 512) # yolo_output1 shape(b, 13, 13, 3, num_classes + 5) P5_output = DarknetConv2D_BN_Leaky(1024, (3, 3))(P5) P5_output = DarknetConv2D(num_anchors * (num_classes + 5), (1, 1))(P5_output) return Model(inputs, [P5_output, P4_output, P3_output])