程序实现 dice coefficient损失函数

1.dice coefficient说明

图像分割,目标检测中比较常用到dice coefficient。它的取值范围是0到1,越接近1说明模型越好。

dice coefficient是像素级别的,真实的目标出现在某片区域A,你的模型预测的目标区域为B,那么dice coefficient就等于
在这里插入图片描述
数学公式为:
在这里插入图片描述
用图形象说明:
程序实现 dice coefficient损失函数_第1张图片

2. 程序实现

# -*- encoding: utf-8 -*-
"""
@File    : 
@Time    : 2020/7/20 17:15
@Author  : li
@WeChat   : by15188607997
@Software: PyCharm
"""
"""
程序实现dice coefficient 损失函数计算
解释:
    intersection = 2 * tf.reduce_sum(pred_flat * true_flat, axis=1)
    计算两张图片的交集
    用乘积就可以得到两张图片的交集,是因为,unet训练中得到的预测值是二值化图,非0即1,
    所有只有当两张图片中对应位置都为
    1的时候得到的值才为1,也就是交集位置,其他情况都为0。
"""

import numpy as np
from PIL import Image
import tensorflow as tf

# 假设pred_flat为预测图片矩阵
pred_flat = np.array([[1, 1, 1, 1], [0, 0, 0, 0], [1, 1, 1, 1]], dtype=np.float)
# pred_flat = tf.reshape(pred_flat, [-1, 12])
# print(pred_flat.eval())
# 假设true_flat为真实图片矩阵
true_flat = np.array([[1, 0, 1, 1], [0, 1, 0, 0], [1, 1, 1, 1]], dtype=np.float)
# true_flat = tf.reshape(true_flat, [-1, 12])
# DICE loss计算方法
# 1. 求取 2倍的预测图片和真实图片的交集,先乘积在求和
intersection = 2 * tf.reduce_sum(pred_flat * true_flat, axis=1)
# 2. 求取预测图片和真实图片的并集
denominator = tf.reduce_sum(pred_flat, axis=1) + tf.reduce_sum(true_flat, axis=1)
# 求两张图片的2倍交集 和 并集的 比值,再把比值求平均
loss = tf.reduce_mean(intersection / denominator)

with tf.Session() as sess:
    # 结果:[6. 0. 8.]
    # 计算方法:2 * (1 * 1 + 1 * 0 + 1 * 1 + 1 * 1) = 6
    #          2 * (0 * 0 + 0 * 1 + 0 * 0 + 0 * 0) = 0
    #          2 * (1 * 1 + 1 * 1 + 1 * 1 + 1 * 1) = 8
    print(sess.run(intersection))
    # 结果:[7. 1. 8.]
    # 计算方法: 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 = 7
    #           0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 = 1
    #           1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 8
    print(sess.run(denominator))
    # 结果:[0.85714286 0.         1.        ]
    # 计算方法: 6 / 7 = 0.85714286
    #           0 / 1 = 0
    #           8 / 8 = 1
    print(sess.run(intersection / denominator))
    # 结果:0.6190476190476191
    # 计算方法: (0.85714286 + 0 + 1) / 3 = 0.6190476190476191
    print(sess.run(loss))

你可能感兴趣的:(人工智能-个人理解,人工智能)