Давайте начнем с идентификации Проблема, которую мы хотим решить который вдохновлен Этот проект Отказ
Учитывая изображения, содержащие линии текста, возвращает пиксельную маркировку этого изображения с каждым пикселем, принадлежащим к фону, либо линии почерка.
Структура проекта
Он состоит из 5 основных разделов, один для ноутбуков, один для общих кодов Python, наборов данных, скриптов Google облачных и один для сохранения весов модели.
В производственном проекте у вас, вероятно, будет больше каталогов, таких как Web и API.
Я также решил использовать Pipenv вместо CODAS и VirtualenV для управления моей Python Environment. Я только недавно перешел на Pipenv из кондей, и я обнаружил, что она последовательно работала, как и ожидалось везде.
Для тренировки GPU я использовал экземпляр облака Google с одним GPU T4 NVIDIA. Сценарии Bash управляют жизненным циклом экземпляра, от создания его изначально, чтобы начать его, подключение к нему и остановить его.
Данные
Набор данных описан в Toml Файл внутри RAW Directory, файл TOML в основном состоит из клавишных пар. Другие каталоги под данными являются Git игнорируются, потому что они будут содержать фактические загрузки полных наборов данных.
Ноутбуки
Я использую ноутбуки для разведки и как контейнер высокого уровня для кода, необходимого для построения, чистых наборов данных и построить учебный базовый трубопровод.
Python файлы
В каталоге SRC я держу код, который можно поделиться и повторно использовать между различными ноутбуками. После хороших методов инженерной инженерии программного обеспечения является ключом к тому, чтобы все было сделано быстро и правильно, находки и идентификации ошибок в ML-коде могут быть чрезвычайно сложными. Вот почему вы хотели бы начать мало и часто повторяют.
Окружающая среда Python
Вы можете установить Pipenv на Linux или Mac, используя Linuxbrew или Macbrew Со следующей командой:
brew install pipenv
А затем вы можете скачать ваши зависимости, используя Pipenv, установите что-то из вашего каталога проекта.
Набор данных
Я буду использовать это Старый академический набор данных Здесь в качестве базы для создания набора данных сегментации линий для обучения A Unet Мини-сеть для обнаружения линий почерка.
Оригинальные изображения в DataSet выглядят следующим образом, они также поставляются с файлами XML, которые определяют ограничивающие коробки.
В ноутбуках/01 – Explore-IAM-DataSet.ipynb Я загрузил набор данных, расстегнул его, а затем переоценил некоторые случайные изображения с данными из файла XML.
Далее я обрезал изображения и сгенерировал маскирует изображения, чтобы соответствовать новым размерам. Маскивые изображения – это изображения наземных прав истины, которые мы будем использовать для обучения окончательной модели.
Наконец, я разделил данные в поезд, действителен и тестируйте
Сеть
Поскольку у нас нет много данных для обучения, я использовал мини-версию Unet Архитектура основана на Эта реализация KERAS Отказ
И используя эта великая библиотека Я могу визуализировать сеть, выполнив Feedforward с определенным размером ввода.
Учебный трубопровод
Теперь, когда у нас есть данные готовы и сеть, которую мы хотим определить, пришло время построить базовый учебный трубопровод.
Сначала определяет набор данных факела и итерации через него с помощью DataLoader
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils
class FormsDataset(Dataset):
def __init__(self, images, masks, num_classes: int, transforms=None):
self.images = images
self.masks = masks
self.num_classes = num_classes
self.transforms = transforms
def __getitem__(self, idx):
image = self.images[idx]
image = image.astype(np.float32)
image = np.expand_dims(image, -1)
image = image / 255
if self.transforms:
image = self.transforms(image)
mask = self.masks[idx]
mask = mask.astype(np.float32)
mask = mask / 255
mask[mask > .7] = 1
mask[mask <= .7] = 0
if self.transforms:
mask = self.transforms(mask)
return image, mask
def __len__(self):
return len(self.images)
train_dataset = FormsDataset(train_images, train_masks, number_of_classes, get_transformations(True))
train_data_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
print(f'Train dataset has {len(train_data_loader)} batches of size {batch_size}')
Далее я определяю петлю тренировки
# Use gpu for training if available else use cpu
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# Here is the loss and optimizer definition
criterion = torch.nn.NLLLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# The training loop
total_steps = len(train_data_loader)
print(f"{epochs} epochs, {total_steps} total_steps per epoch")
for epoch in range(epochs):
for i, (images, masks) in enumerate(train_data_loader, 1):
images = images.to(device)
masks = masks.type(torch.LongTensor)
masks = masks.reshape(masks.shape[0], masks.shape[2], masks.shape[3])
masks = masks.to(device)
# Forward pass
outputs = model(images)
softmax = F.log_softmax(outputs, dim=1)
loss = criterion(softmax, masks)
# Backward and optimize
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i) % 100 == 0:
print (f"Epoch [{epoch + 1}/{epochs}], Step [{i}/{total_steps}], Loss: {loss.item():4f}")
Вот последние прогнозы
Вы можете проверить Keras поддерживает реализацию TF2 здесь Отказ
Спасибо за то, что сделал это так далеко. Последнее, что я хотел бы сказать, это то, что, к сожалению, большинство доступных онлайн-материалов либо предлагают плохие советы или очень базовые, что они на самом деле на самом деле не предлагают много ценности, а некоторые неправываются. Есть несколько отличных ресурсов, хотя и их 60-минутная серия Blitz и отличный API Docs. . Есть также это чит лист И это Github Repo Отказ
Если вам понравилось, читая этот пост и нашел его полезным, я хотел бы услышать от вас, Мой Twitter DMS открыты.
Оригинал: “https://dev.to/mgazar_/train-a-lines-segmentation-model-using-pytorch-1159”