def YOLOv3_model(mode='train', optimizer="adam"): input_image = Input(shape=model_config.input_shape, name="input_image") slabel = Input(shape=(52, 52, 3, 5 + model_config.class_num), name="slabel") sbboxes = Input(shape=(model_config.max_bbox_per_scale, 4), name="sbboxes") mlabel = Input(shape=(26, 26, 3, 5 + model_config.class_num), name="mlabel") mbboxes = Input(shape=(model_config.max_bbox_per_scale, 4), name="mbboxes") llabel = Input(shape=(13, 13, 3, 5 + model_config.class_num), name="llabel") lbboxes = Input(shape=(model_config.max_bbox_per_scale, 4), name="lbboxes") all_branch = yolov3(input_image, model_config.class_num) anchors = get_anchors("./anchors_size.txt") # anchors=np.array(model_config.anchors_size,dtype=np.float32) if mode == 'train': branch_and_decodedbranch_tensor = [] for i, branch in enumerate(all_branch): pred_tensor = Decode( model_config.class_num, stride=model_config.strides[i], anchor_size=anchors[i], anchor_num=model_config.anchor_num_per_grid)(branch) branch_and_decodedbranch_tensor.append(branch) branch_and_decodedbranch_tensor.append(pred_tensor) target = [slabel, sbboxes, mlabel, mbboxes, llabel, lbboxes] branch_and_decodedbranch_tensor.extend(target) matched_tensor = branch_and_decodedbranch_tensor ######output losses ,metrics############################## conf_loss = ConfidenceLoss(matched_tensor) prob_loss = ProbabilityLoss(matched_tensor) # bbox_loss=BboxLoss(matched_tensor) giou_loss = GiouLoss(matched_tensor) m_iou = MeanIou(matched_tensor) model = Model(input=[ input_image, slabel, sbboxes, mlabel, mbboxes, llabel, lbboxes ], output=[conf_loss, prob_loss, giou_loss]) ######添加losses################################ model._losses = [] model._per_input_losses = {} for loss_name in ["conf_loss", "prob_loss", "giou_loss"]: layer = model.get_layer(loss_name) if layer.output in model.losses: continue model.add_loss(layer.output) model.compile(optimizer=Adam()) #######添加metric######################################### model.metrics_names.extend( ["m_iou", "conf_loss", "prob_loss", "giou_loss", "lr"]) model.metrics_tensors.extend( [m_iou, conf_loss, prob_loss, giou_loss, model.optimizer.lr]) #################################################### # def mIOU(y_true,y_pred): # return y_pred # model.compile(optimizer='adam',loss=[lambda y_true,y_pred: y_pred]*4, # loss_weights=[1.0,0.5,0.5,0.], # metrics={"m_iou":mIOU}) return model elif mode == 'inference': decodedbranch_tensor = [] for i, branch in enumerate(all_branch): pred_tensor = Decode( model_config.class_num, stride=model_config.strides[i], anchor_size=anchors[i], anchor_num=model_config.anchor_num_per_grid)(branch) decodedbranch_tensor.append( Reshape(target_shape=(-1, 5 + model_config.class_num))(pred_tensor)) all_decoded_pred_tensor = Concatenate( axis=1, name="all_pred")(decodedbranch_tensor) model = Model(input=input_image, output=all_decoded_pred_tensor) return model
def deep_net(n_ch, patch_height, patch_width): inputs = Input(shape=(n_ch, patch_height, patch_width)) # Block 1 x1_1 = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1', data_format='channels_first')(inputs) x1_2 = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2', data_format='channels_first')(x1_1) x1_pool = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool', data_format='channels_first')(x1_2) # Block 2 x2_1 = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1', data_format='channels_first')(x1_pool) x2_2 = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2', data_format='channels_first')(x2_1) x2_pool = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool', data_format='channels_first')(x2_2) # Block 3 x3_1 = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1', data_format='channels_first')(x2_pool) x3_2 = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2', data_format='channels_first')(x3_1) x3_3 = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3', data_format='channels_first')(x3_2) x3_pool = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool', data_format='channels_first')(x3_3) # Block 4 # x4_1 = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1',data_format='channels_first')(x3_3) x4_1 = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1', data_format='channels_first')(x3_pool) #x4_drop1 = Dropout(0.5, name='dr1')(x4_1) x4_2 = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2', data_format='channels_first')(x4_1) #x4_drop2 = Dropout(0.5, name='dr2')(x4_2) x4_3 = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3', data_format='channels_first')(x4_2) #x4_drop3 = Dropout(0.5, name='dr3')(x4_3) x1_2_16 = Conv2D(16, (3, 3), name='x1_2_16', padding='same', data_format='channels_first')(x1_2) x2_2_16 = Conv2D(16, (3, 3), name='x2_2_16', padding='same', data_format='channels_first')(x2_2) x3_3_16 = Conv2D(16, (3, 3), name='x3_3_16', padding='same', data_format='channels_first')(x3_3) x4_3_16 = Conv2D(16, (3, 3), name='x4_3_16', padding='same', data_format='channels_first')(x4_3) conv4_to_1 = Conv2D(2, (3, 3), padding='same', data_format='channels_first', name='conv4_to_1')(x4_3) # conv4_to_1_up=UpSampling2D(size=(8,8),data_format='channels_first')(conv4_to_1) conv4_to_1_up = Deconv2D(filters=2, kernel_size=16, strides=(8, 8), data_format='channels_first')(conv4_to_1) # crop4to1_back = Cropping2D(cropping=(patch_height, patch_width), data_format='channels_first')(conv4_to_1_up) # conv1_2_17=concatenate([conv4_to_1_up,x1_2_16],axis=1) crop4to1_back = cropfunc(conv4_to_1_up, inputs) conv1_2_17 = concatenate([crop4to1_back, x1_2_16], axis=1) dsn1_in = Conv2D(1, (1, 1), data_format='channels_first', name='dsn1_in')(conv1_2_17) conv1_to_2 = Conv2D(2, (1, 1), name='conv1_to_2', data_format='channels_first')(x1_2_16) # side_multi2_up=UpSampling2D(size=(2,2),data_format='channels_first')(x2_2_16) side_multi2_up = Deconv2D(16, 4, strides=(2, 2), padding='same', data_format='channels_first')(x2_2_16) # upside_multi2 = Cropping2D(cropping=(patch_height, patch_width), data_format='channels_first')(side_multi2_up) # conv2_2_17=concatenate([conv1_to_2,side_multi2_up],axis=1) upside_multi2 = cropfunc(side_multi2_up, inputs) upside_multi27 = concatenate([conv1_to_2, upside_multi2], axis=1) # dsn2_in=Conv2D(1,(1,1),data_format='channels_first',padding='same',name='dsn2_in')(conv2_2_17) dsn2_in = Conv2D(1, (1, 1), data_format='channels_first', name='dsn2_in')(upside_multi27) # conv2_to_3=Conv2D(1,(1,1),padding='same',name='conv2_to_3',data_format='channels_first')(conv2_2_17) # side_multi3_up=UpSampling2D(size=(4,4),data_format='channels_first')(x3_3_16) conv2_to_3 = Conv2D(1, (1, 1), name='conv2_to_3', data_format='channels_first')(upside_multi27) side_multi3_up = Deconv2D(16, 8, strides=(4, 4), data_format='channels_first')(x3_3_16) # upside_multi3 = Cropping2D(cropping=(patch_height, patch_width), data_format='channels_first')(side_multi3_up) upside_multi3 = cropfunc(side_multi3_up, inputs) # conv3_2_17=concatenate([conv2_to_3,side_multi3_up],axis=1) upside_multi37 = concatenate([conv2_to_3, upside_multi3], axis=1) # dsn3_in=Conv2D(1,(1,1),data_format='channels_first',padding='same',name='dsn3_in')(conv3_2_17) dsn3_in = Conv2D(1, (1, 1), data_format='channels_first', name='dsn3_in')(upside_multi37) # conv3_to_4=Conv2D(1,(1,1),padding='same',name='conv3_to_4',data_format='channels_first')(conv3_2_17) # side_multi4_up=UpSampling2D(size=(8,8),data_format='channels_first')(x4_3_16) # conv4_2_17=concatenate([conv3_to_4,side_multi4_up],axis=1) # dsn4_in=Conv2D(1,(1,1),data_format='channels_first',padding='same',name='dsn4_in')(conv4_2_17) conv3_to_4 = Conv2D(1, (1, 1), name='conv3_to_4', data_format='channels_first')(upside_multi37) side_multi4_up = Deconv2D(16, 16, strides=(8, 8), data_format='channels_first')(x4_3_16) # upside_multi4 = Cropping2D(cropping=(patch_height, patch_width), data_format='channels_first')(side_multi4_up) upside_multi4 = cropfunc(side_multi4_up, inputs) upside_multi47 = concatenate([conv3_to_4, upside_multi4], axis=1) dsn4_in = Conv2D(1, (1, 1), data_format='channels_first', name='dsn4_in')(upside_multi47) dsn = concatenate([dsn1_in, dsn2_in, dsn3_in, dsn4_in], axis=1) dsn_out = Conv2D(1, (1, 1), data_format='channels_first', padding='same', name='dsn_out')(dsn) # dsn_out = Conv2D(1, (1, 1), data_format='channels_first', name='dsn_out', activation='sigmoid')(dsn) target = Input(shape=(1, patch_height, patch_width), name="target") MyLoss = Lambda(lambda x: MyEntropyLoss(*x), name="complex_loss")\ ([target, dsn1_in, dsn2_in, dsn3_in, dsn4_in, dsn_out]) # outputs = [dsn_out, MyLoss] outputs = [dsn_out, dsn1_in, dsn2_in, dsn3_in, dsn4_in, MyLoss] model = Model(inputs=[inputs, target], outputs=outputs) # model = Model(inputs=inputs, outputs=[dsn1_in, dsn2_in, dsn3_in, dsn4_in, dsn_out]) # model.add_loss(myloss) # model.compile(loss=[None] * len(model.outputs), optimizer='SGD') # model.compile(optimizer='SGD') model._losses = [] model._per_input_losses = {} for loss_name in ["complex_loss"]: layer = model.get_layer(loss_name) if layer.output in model.losses: continue loss = tf.reduce_mean(layer.output) model.add_loss(loss) return model