1.创作灵感
很多小伙伴在玩深度学习模型的时候,需要计算Groudtruth和predict图的dsc、IOU以及BCELoss。这两个关键的指标的程序有很多种写法,今天使用OpenCV绘制两张已知分布的图像,计算其dsc、IOU以及BCELoss。
2、图像如图所示
在一个100×100的区域内,红色框范围为预测值,黑色框的范围是真实值。则TP、FP、TN、FN的分布如图所示。

3程序的编写
3.1 绘制图形,并保存程张量。
import torch import torch.nn as nn import cv2 as cv import numpy as np # 定义一个函数,填充绘制的轮廓 def fill_img(img): contours, hierarchy = cv.findContours(img, cv.RETR_LIST, cv.CHAIN_APPROX_NONE) area = [] for k in range(len(contours)): area.append(cv.contourArea(contours[k])) # 轮廓索引 max_idx = np.argsort(np.array(area)) # 按轮廓索引填充颜色 for idx in max_idx: # 填充轮廓 img = cv.drawContours(img, contours, idx, 255, cv.FILLED) return img# 创建一个黑色的图像 image1 = np.zeros((100, 100, 1), dtype=np.uint8) cv.rectangle(image1, (0,0), (69,69), 255, 1) #转为灰度图 # gray1 = cv.cvtColor(image1, cv.COLOR_BGR2GRAY) image2 = np.zeros((100, 100, 1), dtype=np.uint8) cv.rectangle(image2, (30,30), (99,99), 255, 1) #得到两幅图像, image1 = fill_img(image1) image2 = fill_img(image2) # 显示图像 cv.imshow('Image1', image1) cv.imshow('Image2', image2) #保存图像 cv.imwrite("img1.png",image1) cv.imwrite("img2.png",image2) img1_tensor = torch.from_numpy(image1) img2_tensor = torch.from_numpy(image2)
绘制的图像想过如下

对于这样的单通道的图,黑色区域的值是0,白色区域的值是255、
3.2 计算dsc和IOU
程序如下:
# 定义一个函数计算IoU
def calculate_IOU(img1,img2):
img1 = img1/255
img2 = img2/255
inter = torch.sum(img1*img2)
union = torch.sum(img1)+torch.sum(img2)-inter
iou= float(inter)/float(union)
return iou
def calculate_dice(img1,img2):
img1 = img1 / 255
img2 = img2 / 255
inter = torch.sum(img1 * img2)
dice = (2*inter)/(torch.sum(img1)+torch.sum(img2))
return dice
3.3 调用程序
IoU=calculate_IOU(img1_tensor,img2_tensor)
print("IoU is: {}\n".format(IoU))
Dice = calculate_dice(img1_tensor,img2_tensor)
print("Dice is: {}\n".format(Dice))
3.4 程序运行结果
可见结果是正确的。

4 .二值交叉熵损失函数的计算
对于二值交叉熵损失函数,在二分类的分割任务中经常会用到,可以通过以下代码计算,二值交叉熵函数(BCELoss):
# 将图像值限制在0到1之间,通常使用sigmoid函数
sigmoid = nn.Sigmoid()
image1_sigmoid = sigmoid(img1_tensor)
image2_sigmoid = sigmoid(img2_tensor)
# 初始化二值交叉熵损失函数
bce_loss = nn.BCELoss()
# 计算二值交叉熵损失
loss = bce_loss(image1_sigmoid, image2_sigmoid)
print("Binary Cross Entropy Loss:", loss.item())
运行结果如下:
