Давайте начнем с идентификации Проблема, которую мы хотим решить который вдохновлен Этот проект Отказ
Учитывая изображения, содержащие линии текста, возвращает пиксельную маркировку этого изображения с каждым пикселем, принадлежащим к фону, либо линии почерка.
Структура проекта
Он состоит из 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”