def yolo_body(inputs, num_anchors, num_classes): # 生成darknet53的主干模型 # 52 52 256 # 26 26 512 # 13 13 1024 feat1, feat2, feat3 = darknet_body(inputs) darknet = Model(inputs, feat3) # 第一个特征层 # y1=(batch_size,13,13,3,25) x, y1 = make_last_layers(darknet.output, 512, num_anchors * (num_classes + 5)) x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat2]) # 第二个特征层 # y2=(batch_size,26,26,3,25) 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]) # 第三个特征层 # y3=(batch_size,52,52,3,25) 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): # 生成darknet53的主干模型 feat1, feat2, feat3 = darknet_body(inputs) #darknet53获得的特征层 #52*52*256,26*26*512,13*13*1024 darknet = Model(inputs, feat3) # 第一个特征层 # y1=(batch_size,13,13,3,25) x, y1 = make_last_layers(darknet.output, 512, num_anchors * (num_classes + 5)) x = compose( DarknetConv2D_BN_Leaky(256, (1, 1)), #一次卷积 UpSampling2D(2))(x) #上采样 x = Concatenate()([x, feat2]) #与第二特征层输出结合 # 第二个特征层 # y2=(batch_size,26,26,3,25) 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]) # 第三个特征层 # y3=(batch_size,52,52,3,25) 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): # Darknet53 feat1, feat2, feat3 = darknet_body(inputs) darknet = Model(inputs, feat3) # fist stage's outputs # y1 = (batch_size, 13, 13 , 3, 85) x, y1 = make_last_layers(darknet.output, 512, num_anchors * (num_classes + 5)) # feature fusion x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat2]) # second stage's outputs # y2 = (batch_size, 26, 26, 3, 85) 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]) # third stage's outputs # y3 = (batch_size, 52, 52, 3, 85) 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): # 生成darknet53的主干模型 feat1, feat2, feat3 = darknet_body(inputs) darknet = Model(inputs, feat3) # 第一个特征层 x, y1 = make_last_layers(darknet.output, 512, num_anchors * (num_classes + 5)) # 得到y1 = 【batch_size,13,13,255】 x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x) # 得到x=【batch_size,26,26,256】,feat2 = 【batch_size,26,26,512】 x = Concatenate()([x, feat2]) # 得到x = 【batch_size,26,26,768】 # 第二个特征层 # y2=(batch_size,26,26,3,75) x, y2 = make_last_layers(x, 256, num_anchors * (num_classes + 5)) # 得到y2 =【batch_size,26,26,255】,x = 【batch_size,26,26,256】 x = compose( DarknetConv2D_BN_Leaky(128, (1, 1)), # 得到x =【batch_size,26,26,128】 UpSampling2D(2))(x) # 得到x =【batch_size,52,52,128】,feat1 = 【batch_size,52,52,256】 x = Concatenate()([x, feat1]) # 得到x =【batch_size,52,52,384】 # 第三个特征层 # y3=(batch_size,52,52,3,85) x, y3 = make_last_layers(x, 128, num_anchors * (num_classes + 5)) # 得到y2 =【batch_size,52,52,255】,x = 【batch_size,52,52,128】 return Model(inputs, [y1, y2, y3])
def yolo_body(inputs, num_anchors, num_classes): #---------------------------------------------------# # 生成darknet53的主干模型 # 获得三个有效特征层,他们的shape分别是: # 13,13,256 # 26,26,512 # 13,13,1024 #---------------------------------------------------# feat1,feat2,feat3 = darknet_body(inputs) darknet = Model(inputs, feat3) #---------------------------------------------------# # 第一个特征层 # y1=(batch_size,13,13,3,85) #---------------------------------------------------# # 13,13,1024 -> 13,13,512 -> 13,13,1024 -> 13,13,512 -> 13,13,1024 -> 13,13,512 x, y1 = make_last_layers(darknet.output, 512, num_anchors*(num_classes+5)) # 13,13,512 -> 13,13,256 -> 26,26,256 x = compose( DarknetConv2D_BN_Leaky(256, (1,1)), UpSampling2D(2))(x) # 26,26,256 + 26,26,512 -> 26,26,768 x = Concatenate()([x,feat2]) #---------------------------------------------------# # 第二个特征层 # y2=(batch_size,26,26,3,85) #---------------------------------------------------# # 26,26,768 -> 26,26,256 -> 26,26,512 -> 26,26,256 -> 26,26,512 -> 26,26,256 x, y2 = make_last_layers(x, 256, num_anchors*(num_classes+5)) # 26,26,256 -> 26,26,128 -> 52,52,128 x = compose( DarknetConv2D_BN_Leaky(128, (1,1)), UpSampling2D(2))(x) # 52,52,128 + 52,52,256 -> 52,52,384 x = Concatenate()([x,feat1]) #---------------------------------------------------# # 第三个特征层 # y3=(batch_size,52,52,3,85) #---------------------------------------------------# # 52,52,384 -> 52,52,128 -> 52,52,256 -> 52,52,128 -> 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 = darknet_body(inputs) darknet = Model(inputs, feat3) x, y1 = make_last_layers(darknet.output, 512, num_anchors * (num_classes + 5)) x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat2]) 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]) 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): """Gaussian YOLOv3 Gaussian YOLOv3 can predict a bounding box distribution. We model the distribution by a gaussian distribution. p(y|x) = N(μ, δ) We can use δ to represent the uncertainty about bounding box. we change [dx, dy, dw, dh] to [μ(dx), μ(dy), μ(dw), μ(dh), δ(dx), δ(dy), δ(dw), δ(dh)] Args: inputs: [batch, height, width, channels] num_anchors: usually be 3 num_classes: number of your classes Returns: model """ # Darknet53 feat1, feat2, feat3 = darknet_body(inputs) darknet = Model(inputs, feat3) # fist stage's outputs # y1 = (batch_size, 13, 13 , 3, 89) x, y1 = make_last_layers(darknet.output, 512, num_anchors * (num_classes + 9)) # feature fusion x = compose(DarknetConv2D_BN_Leaky(256, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat2]) # second stage's outputs # y2 = (batch_size, 26, 26, 3, 89) x, y2 = make_last_layers(x, 256, num_anchors * (num_classes + 9)) x = compose(DarknetConv2D_BN_Leaky(128, (1, 1)), UpSampling2D(2))(x) x = Concatenate()([x, feat1]) # third stage's outputs # y3 = (batch_size, 52, 52, 3, 89) x, y3 = make_last_layers(x, 128, num_anchors * (num_classes + 9)) return Model(inputs, [y1, y2, y3])
def yolo_body(inputs, num_anchors, num_classes): '''特征层->最后的输出 Parameters ---------- inputs: num_anchors: num_classes: Returns ------- Model(inputs, [y1,y2,y3]): ''' # 生成darknet53的主干模型 feat1,feat2,feat3 = darknet_body(inputs) darknet = Model(inputs, feat3) # 第一个特征层 # y1=(batch_size,13,13,3,25) # x, y1 = make_last_layers(darknet.output, 512, num_anchors*(num_classes+5)) x = compose( DarknetConv2D_BN_Leaky(256, (1,1)), # 执行2倍上采样 UpSampling2D(2))(x) # 将x与darknet的第152层拼接,feat2为第152层输出 x = Concatenate()([x,feat2]) # 第二个特征层 # y2=(batch_size,26,26,3,25) 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]) # 第三个特征层 # y3=(batch_size,52,52,3,25) x, y3 = make_last_layers(x, 128, num_anchors*(num_classes+5)) # 根据整个逻辑的输入和输出,构建模型。输入inputs依然保持不变, # 即(?, 416, 416, 3),而输出则转换为3个尺度的预测层,即[y1, y2, y3] return Model(inputs, [y1,y2,y3])