У меня есть набор данных из 1,6 тыс. изображений (разделение: поезд — 90%, проверка — 10%) с кусочками бумаги (1280x720x1). И у меня есть для них ограничительные рамки. Вот пример изображения и ограничивающей рамки. Итак, мне нужно создать модель для обнаружения углов бумаги.
Я создал ее на pytorch:
class PaperCorners(torch.nn.Module):
def __init__(self):
super().__init__()
# Input image (1280x720x1)
self.conv1 = torch.nn.Conv2d(in_channels = 1, out_channels = 4,
kernel_size = (5, 5), stride = 3)
# After conv1 (426x239x4)
self.act1 = torch.nn.ReLU()
# After act1 (426x239x4)
self.conv2 = torch.nn.Conv2d(in_channels = 4, out_channels = 8,
kernel_size = (5, 5), stride = 3)
# After conv2 (141x79x8)
self.act2 = torch.nn.ReLU()
# After act2 (141x79x8)
self.conv4 = torch.nn.Conv2d(in_channels = 8, out_channels = 16,
kernel_size = (3, 3), stride = 2)
# After conv4 (70x39x16)
self.act4 = torch.nn.ReLU()
# After act4 (70x39x16)
self.conv5 = torch.nn.Conv2d(in_channels = 16, out_channels = 32,
kernel_size = (3, 3), stride = 2)
# After conv5 (34x19x32)
self.act5 = torch.nn.ReLU()
# After act5 (34x19x32)
self.conv6 = torch.nn.Conv2d(in_channels = 32, out_channels = 64,
kernel_size = (3, 3), stride = 2)
# After conv6 (16x9x64)
self.act6 = torch.nn.ReLU()
# After act6 (16x9x64)
self.gmp = torch.nn.AdaptiveMaxPool2d(output_size = 1)
#After gmp and squeeze (64)
self.lin1 = torch.nn.Linear(in_features = 64, out_features = 128)
# After lin1 (128)
self.act7 = torch.nn.ReLU()
# After act7 (128)
self.lin2 = torch.nn.Linear(in_features = 128, out_features = 128)
# After lin2 (128)
self.act8 = torch.nn.ReLU()
# After act8 (128)
self.lin3 = torch.nn.Linear(in_features = 128, out_features = 64)
# After lin3 (64)
self.act9 = torch.nn.ReLU()
# After act9 (64)
self.lin4 = torch.nn.Linear(in_features = 64, out_features = 4)
# After lin4 (4)
self.act10 = torch.nn.ReLU()
# After act10 (4)
def forward(self, x):
x = self.act1(self.conv1(x))
x = self.act2(self.conv2(x))
x = self.act4(self.conv4(x))
x = self.act5(self.conv5(x))
x = self.act6(self.conv6(x))
x = self.gmp(x).squeeze()
x = self.act7(self.lin1(x))
x = self.act8(self.lin2(x))
x = self.act9(self.lin3(x))
x = self.act10(self.lin4(x))
return x
Кроме того, я делю значения изображения на 255, чтобы их нормализовать. Я использую Адама (lr=0,001), MSE. Моя потеря примерно через 300 эпох - 13000 (при наборе валидации). Когда я пытаюсь сфотографироваться в реальной обстановке, происходит следующее. он каждый раз остается на одном месте, но когда я подгоняю лист под размеры прямоугольника, он начинает немного отставать от него. Что я могу сделать? Я не хочу использовать существующие модели, хочу создать свою
У меня есть набор данных из 1,6 тыс. изображений (разделение: поезд — 90%, проверка — 10%) с кусочками бумаги (1280x720x1). И у меня есть для них ограничительные рамки. Вот пример изображения и ограничивающей рамки. Итак, мне нужно создать модель для обнаружения углов бумаги. Я создал ее на pytorch: [code]class PaperCorners(torch.nn.Module): def __init__(self): super().__init__() # Input image (1280x720x1) self.conv1 = torch.nn.Conv2d(in_channels = 1, out_channels = 4, kernel_size = (5, 5), stride = 3) # After conv1 (426x239x4) self.act1 = torch.nn.ReLU() # After act1 (426x239x4) self.conv2 = torch.nn.Conv2d(in_channels = 4, out_channels = 8, kernel_size = (5, 5), stride = 3) # After conv2 (141x79x8) self.act2 = torch.nn.ReLU() # After act2 (141x79x8) self.conv4 = torch.nn.Conv2d(in_channels = 8, out_channels = 16, kernel_size = (3, 3), stride = 2) # After conv4 (70x39x16) self.act4 = torch.nn.ReLU() # After act4 (70x39x16) self.conv5 = torch.nn.Conv2d(in_channels = 16, out_channels = 32, kernel_size = (3, 3), stride = 2) # After conv5 (34x19x32) self.act5 = torch.nn.ReLU() # After act5 (34x19x32) self.conv6 = torch.nn.Conv2d(in_channels = 32, out_channels = 64, kernel_size = (3, 3), stride = 2) # After conv6 (16x9x64) self.act6 = torch.nn.ReLU() # After act6 (16x9x64)
self.gmp = torch.nn.AdaptiveMaxPool2d(output_size = 1) #After gmp and squeeze (64)
self.lin1 = torch.nn.Linear(in_features = 64, out_features = 128) # After lin1 (128) self.act7 = torch.nn.ReLU() # After act7 (128)
self.lin2 = torch.nn.Linear(in_features = 128, out_features = 128) # After lin2 (128) self.act8 = torch.nn.ReLU() # After act8 (128)
self.lin3 = torch.nn.Linear(in_features = 128, out_features = 64) # After lin3 (64) self.act9 = torch.nn.ReLU() # After act9 (64)
self.lin4 = torch.nn.Linear(in_features = 64, out_features = 4) # After lin4 (4) self.act10 = torch.nn.ReLU() # After act10 (4)
def forward(self, x): x = self.act1(self.conv1(x)) x = self.act2(self.conv2(x)) x = self.act4(self.conv4(x)) x = self.act5(self.conv5(x)) x = self.act6(self.conv6(x)) x = self.gmp(x).squeeze() x = self.act7(self.lin1(x)) x = self.act8(self.lin2(x)) x = self.act9(self.lin3(x)) x = self.act10(self.lin4(x)) return x [/code] Кроме того, я делю значения изображения на 255, чтобы их нормализовать. Я использую Адама (lr=0,001), MSE. Моя потеря примерно через 300 эпох - 13000 (при наборе валидации). Когда я пытаюсь сфотографироваться в реальной обстановке, происходит следующее. он каждый раз остается на одном месте, но когда я подгоняю лист под размеры прямоугольника, он начинает немного отставать от него. Что я могу сделать? Я не хочу использовать существующие модели, хочу создать свою :)