コード例 #1
0
ファイル: yolov3.py プロジェクト: VectXmy/YOLOv3.Keras
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
コード例 #2
0
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