【发布时间】:2020-02-17 19:50:38
【问题描述】:
我正在尝试训练一个 Unet 模型来对图像进行每像素回归预测。为此,我将我的大图像 (1000x1000) 分成 200x200 像素的正方形。然后使用它来训练具有线性最终层的 FCN 模型。损失函数是 MSE 损失。在预测阶段,我提取相同的框,但将它们拼接在一起并获得最终的输出图像。当我这样做时,我遇到的问题是框的边界之间存在不连续性。 (我可以清楚地看到盒子)
我尝试通过将 250x250 的框输入到我的 FCN 并计算 200x200 中心区域的损失来解决这个问题。我对预测状态执行相同的过程。提取 250x250 补丁裁剪 200x200 中心区域并将图像重新缝合在一起。请看下面的一些代码:
损失函数:
criterion = nn.MSELoss()
optimizer = optim.Adam(self.model.parameters(), lr=LR)
for inputs, labels in train_loader:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
output = model(inputs)
output = output.squeeze()
_, dimx, dimy = output.shape
loss = criterion(output[:,25:dimx-25, 25:dimy-25], labels[:,25:dimx-25, 25:dimy-25])
loss.backward()
optimizer.step()
我的预测代码如下:
pred = np.zeros((height, width))
for i in range(25, height, 200):
for j in range(25, width, 200):
patch = img[:, i-25:i+225, j-25:j+225]
patch = torch.from_numpy(patch)
patch = patch.unsqueeze(dim=0).to(device)
out = model(patch)
out = out[0,0,25:225, 25:225]
pred[i:i+200, j:j+200] = out.cpu().numpy()
我不确定我的问题是否完全合理。如有必要,我可以提供更多说明,但我已经坚持了一段时间了。
【问题讨论】:
标签: python machine-learning computer-vision conv-neural-network pytorch