Я пытаюсь обучить модель 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()
Я не уверен, что моя проблема делаетполный смысл. Я могу дать больше разъяснений, если это необходимо, но я застрял на этом некоторое время.