tensorflow означает iou только для класса переднего плана для бинарной семантической сегментации

avatar
Naman
8 апреля 2018 в 06:39
2608
1
1

tensorflow.metrics.mean_iou() в настоящее время в среднем превышает iou каждого класса. Я хочу получить iou только переднего плана для моей задачи бинарной семантической сегментации.

Я пытался использовать weights как tf.constant([0.0, 1.0]), но tf.constant([0.01, 0.99]) но mean_iou выглядит переполненным следующим образом:

(500, 1024, 1024, 1)
119/5000 [..............................] - ETA: 4536s - loss: 0.3897 - mean_iou: -789716217654962048.0000 - acc: 0.9335

Я использую это как metrics для keras fit_generator следующим образом:

def mean_iou(y_true, y_pred):
    y_pred = tf.to_int32(y_pred > 0.5)
    score, up_opt = tf.metrics.mean_iou(y_true, y_pred, 2, weights = tf.constant([0.01, 0.99]))
    keras.get_session().run(tf.local_variables_initializer())
    with tf.control_dependencies([up_opt]):
        score = tf.identity(score)
    return score

Я буду очень признателен за любую помощь, так как я перепробовал много вещей, даже вычислил потери самостоятельно, используя только функции keras.backend, но ничего не выглядит правильно.

Источник

Ответы (1)

avatar
王佳欣
10 мая 2018 в 05:39
1

если вы используете keras

импортировать keras.backend как K

def switch_mean_iou(labels, predictions):
    """
    labels,prediction with shape of [batch,height,width,class_number=2]
    """
    mean_iou = K.variable(0.0)
    seen_classes = K.variable(0.0)

    for c in range(2):
        labels_c = K.cast(K.equal(labels, c), K.floatx())
        pred_c = K.cast(K.equal(predictions, c), K.floatx())

        labels_c_sum = K.sum(labels_c)
        pred_c_sum = K.sum(pred_c)

        intersect = K.sum(labels_c*pred_c)
        union = labels_c_sum + pred_c_sum - intersect
        iou = intersect / union
        condition = K.equal(union, 0)
        mean_iou = K.switch(condition,
                            mean_iou,
                            mean_iou+iou)
        seen_classes = K.switch(condition,
                                seen_classes,
                                seen_classes+1)

    mean_iou = K.switch(K.equal(seen_classes, 0),
                        mean_iou,
                        mean_iou/seen_classes)
    return mean_iou
王佳欣
10 мая 2018 в 05:41
0

Seen_classes также можно установить на class_number=2.