【发布时间】:2021-05-14 07:17:08
【问题描述】:
在我的轮廓生成网络中,我使用nn.L1Loss() 来计算有多少像素是错误的。这适用于训练,但真实轮廓和假轮廓之间的 2D 距离会更好。我的目标是之后测量生成轮廓的长度。这个两个二进制图像的代码示例显示了nn.L1Loss() 失败的地方。
import cv2
import torch
from torch import nn
p1 = [(15, 15),(45,45)]
p2 = [(16, 15),(46,45)]
real = cv2.rectangle(np.ones((60,60)), p1[0], p1[1], color=0, thickness=1)
fake = cv2.rectangle(np.ones((60,60)), p2[0], p2[1], color=0, thickness=1)
cv2.imshow('image',np.hstack((real,fake)))
cv2.waitKey(0)
real = torch.tensor(real)
fake = torch.tensor(fake)
losss = [nn.L1Loss(), nn.MSELoss(), nn.BCELoss(), nn.HingeEmbeddingLoss(), nn.SmoothL1Loss()]
print(my_loss(real, fake))
for k, loss in enumerate(losss):
err = loss(real, fake)
print(err*60)
如果我将矩形向右移动 1 个像素:
-> L1 损失为 0.0333 * 60 = 2
如果我将矩形向右移动 1 个像素,向左移动 1 个像素:
-> L1 损失为 0.0656 * 60 = 3.933
如果我将矩形向右移动 10 像素,向左移动 10 像素:
-> L1 损失为 0.0656 * 60 = 3.933
还是一样!这并不奇怪,错误像素的数量是相同的。但是到它们的距离改变了 10 * 2**1/2。
我还考虑了两个中心之间的距离:
M = cv2.moments(c)
cX = int(M['m10'] /M['m00'])
cY = int(M['m01'] /M['m00'])
centers.append([cX,cY])
这里的问题是生成的轮廓与真实的轮廓不相同,因此具有不同的中心。
这个答案与我正在寻找的答案很接近,但是计算成本很高吗?!
https://stackoverflow.com/a/36505073/12337147
是否有像我描述的那样确定距离的自定义损失函数?
【问题讨论】:
-
嗯,你试过用洪水填充形状吗?如果这样做,您可以使用 Intersection-over-Union、Tversky Index 或 Dice Coefficient 来计算预测输出和真实输出之间的误差。
-
如何在张量内填充轮廓?转换为 cpu,然后转换为 numpy,然后转换为
cv2.findContour和cv2.drawContour(thickness=-1),然后返回张量对于损失函数来说似乎非常耗时?
标签: python contour loss-function generative-adversarial-network completion