В самом последнем блоге нашей серии Компьютерное зрение мы показали вам, как использовать AutoML Vertex AI для обучения и развертывания модели обнаружения объектов. Каким бы мощным и эффективным ни был AutoML, вам может понадобиться гибкость для обучения и развертывания большего количества заказных моделей или решения задачи компьютерного зрения, которая в настоящее время не поддерживается AutoML. К счастью, Vertex AI также поможет вам в этом, предлагая настраиваемые параметры для обучения и развертывания ваших моделей в Google Cloud.
В этом блоге мы покажем вам, как обучить и развернуть собственную пользовательскую модель сегментации изображений с помощью Vertex AI. Мы расскажем о сегментации изображений и возможностях обучения Vertex AI. Затем мы проведем вас через пошаговый процесс создания и запуска вашей собственной модели.
Фон
Сегментация изображений
Сегментация изображения — это метод, используемый в цифровой обработке изображений, при котором изображение разбивается на несколько разных сегментов, каждый из которых представляет отдельную часть изображения. Сегментацию изображения можно использовать для таких задач, как отделение фона от переднего плана на изображении или группирование пикселей изображения вместе на основе цветового сходства.
В частности, мы собираемся сосредоточиться на создании модели, которая может выполнять определенный тип сегментации изображения, который называется Семантическая сегментация.
Семантическая сегментация
Семантическая сегментация — это тип сегментации изображения, целью которого является разделение изображения на семантически значимые классы и классификация каждого пикселя в один из этих заранее определенных классов.
Семантическая сегментация на один шаг сложнее, чем обнаружение объектов, поскольку вместо того, чтобы пытаться нарисовать ограничивающую рамку вокруг объекта, цель состоит в том, чтобы нарисовать аккуратный контур вокруг обнаруженного объекта, чтобы вы точно знали, какие пиксели принадлежат объекту. и каких пикселей нет.
Важно отметить, что в семантической сегментации мы не делаем различий между экземплярами одного и того же объекта. Например, если на изображении есть два велосипеда, семантическая сегментация пометит все пиксели, соответствующие любому велосипеду, одной и той же меткой «велосипед». Это отличается от сегментации экземпляров, которая дает уникальную метку каждому экземпляру определенного объекта на изображении.
Семантическая сегментация особенно полезна в таких приложениях, как самоуправляемые автомобили, где автомобиль должен точно понимать, какие пиксели представляют управляемую поверхность и, следовательно, где можно безопасно ездить. Кроме того, его можно использовать в медицинской визуализации для сегментации участков анатомии пациента, что может облегчить выявление нарушений и диагностику серьезных заболеваний.
Ю-нет
В этом блоге архитектура модели, которую мы будем использовать, представляет собой особый тип сверточной нейронной сети, называемый U-Net. Первоначально U-Net была разработана для биомедицинской сегментации изображений, но эта архитектура полезна во многих других приложениях, что делает ее одной из самых важных и основополагающих архитектур нейронных сетей для компьютерного зрения на сегодняшний день.
Чтобы обучить и развернуть такую модель в Google Cloud, нам потребуется использовать настраиваемые параметры обучения Vertex AI.
Обучение пользовательской модели с помощью Vertex AI
Варианты обучения Vertex AI позволяют вам лучше контролировать архитектуру модели, а это означает, что вы можете обучать и развертывать архитектуры моделей, которые вы пишете сами. Это достигается за счет использования контейнеров, где вы можете выбрать либо предварительно созданные контейнеры (доступные для поддерживаемых фреймворков, таких как Tensorflow), либо настраиваемые параметры контейнера, которые позволяют вам поместить свой код в контейнер Docker и отправить его в контейнер. реестр для работы на Vertex AI.
Это означает, что вы можете относительно легко развернуть практически любую модельную структуру или архитектуру и даже ускорить процесс обучения с помощью графических процессоров. Начнем!
Руководство
В этом руководстве мы обучаем и развертываем модель, обеспечивающую семантическую сегментацию изображений городских улиц. В этом руководстве мы будем использовать набор данных Cityscapes, целью которого является присвоение каждому пикселю изображения одной из следующих восьми категорий, перечисленных в разделе Группа в таблице ниже:
Создание проекта на GCP
Чтобы начать обучение пользовательской модели сегментации изображений в Google Cloud, создайте проект Google Cloud и настройте учетную запись Google с достаточными разрешениями. Для этого руководства вам потребуется разрешение на использование Vertex AI, а также на создание сегментов хранилища и управление ими. Вам также может потребоваться включить определенные API, такие как API Vertex AI, API Compute Engine и API облачного хранилища.
Затем выберите регион для запуска вашего проекта. Если вы хотите использовать графический процессор для обучения своей модели, обязательно выберите регион, в котором они доступны, поскольку они не могут использоваться во всех регионах.
Наконец, создайте сегмент облачного хранилища. Это место в Google Cloud, где будут храниться все входные и выходные данные.
Подготовка обучающего набора данных
Чтобы загрузить и использовать Данные Cityscapes, вам необходимо зарегистрировать учетную запись и запросить доступ. Загрузите файлы leftImg8bit_trainvaltest.zip и gtFine_trainvaltest.zip, как только у вас появится доступ. Распакуйте эти два файла и загрузите полученные папки в базу вашего облачного хранилища Bucket.
Обучение модели
Первым шагом в обучении модели с использованием пользовательского обучения Vertex AI является написание сценария обучения Python. Для этого урока мы адаптировали этот скрипт для использования с набором данных Cityscapes. Нашу обновленную версию этого скрипта с именем model.py можно найти здесь.
Первая часть этого скрипта (см. здесь) — это вспомогательный класс, который упрощает чтение пакетов обучающих изображений и их меток, известных как маски сегментации, из корзины облачного хранилища. Каждая из этих масок сегментации представляет собой одномерный массив того же размера, что и соответствующее изображение, где каждая запись относится к пикселю исходного изображения.
Значения для каждого пикселя содержат числовой идентификатор, который соответствует одному из классов в наборе данных. Например, если пиксель в маске сегментации имеет значение 11, это означает, что этот пиксель назначен пикселю здания.
Обратите внимание, что вместо того, чтобы тренироваться с использованием этих классов напрямую, мы группируем их по 8 широким категориям, упомянутым выше (плоские, человеческие, транспортные средства, конструкции, объекты, природа, небо, пустота). Для этого используется переменная id_to_cat.
Наконец, мы определяем часть скрипта (см. здесь), которая использует наши вспомогательные классы для загрузки обучающих данных из нашего сегмента хранилища, создания модели с использованием описанного выше метода get_model, обучения модели и сохранения ее в ведро для хранения.
Упаковка кода модели для запуска обучения Vertex AI
Следующим шагом является упаковка обучающего кода в виде контейнера Docker, который может запускаться службой обучения Vertex AI. Это можно сделать двумя основными способами. Одним из них является создание нашего собственного настраиваемого контейнера докеров, который упаковывает все зависимости и обучающий код вместе.
Другой, который мы используем в этом руководстве, заключается в использовании предварительно созданных учебных контейнеров Google. Эти готовые контейнеры — отличный вариант, если вы обучаете модель, использующую одну из распространенных библиотек Python для машинного обучения, например scikit-learn, TensorFlow, PyTorch или XGBoost. Учитывая, что модель в этом руководстве использует структуру TensorFlow, здесь мы используем изображение TensorFlow. Выберите изображение, которое хотите использовать, и запишите его URI.
В то же время мы также выбираем предварительно созданный образ контейнера прогнозирования, который будет использоваться позже при развертывании нашей обученной модели на конечной точке Vertex AI. Здесь мы снова используем изображение TensorFlow. Выберите изображение, которое хотите использовать, и запишите его URI.
Мы также можем использовать GPU для обучения модели. Убедитесь, что в выбранном вами регионе GCP есть доступные графические процессоры, прежде чем принять решение об их использовании.
Если в вашем регионе они недоступны или вы не хотите их использовать, задайте для переменной accelerator_type в приведенных ниже сценариях значение «ACCELERATOR_TYPE_UNSPECIFIED» и убедитесь, что выбранные образы контейнеров для обучения и прогнозирования предназначены для версии ЦП конкретного рамки, которые вы используете. В противном случае выберите графический процессор, который вы хотите использовать, и запишите его имя. В этом руководстве мы используем один графический процессор NVIDIA Tesla K80.
Чтобы использовать предварительно созданные обучающие контейнеры, мы используем Vertex AI SDK для Python (aiplatform) для написания скрипта, который автоматически упаковывает обучающий код с предварительно созданным обучающим контейнером и запускает его на Vertex AI. Вы можете найти этот скрипт с именем train.py здесь. Нам нужно обновить следующие переменные в скрипте перед его запуском:
- название нашего проекта GCP (project_id),
- регион GCP, который мы используем (region),
- наша корзина GCS в том же регионе (bucket_name),
- URI нашего предварительно созданного образа обучающего контейнера (train_image),
- URI нашего предварительно созданного образа контейнера предсказаний (deploy_image),
- тип GPU, который мы хотим использовать (accelerator_type), и
- путь к нашему обучающему скрипту (script_path)
После успешного запуска скрипта должно начаться задание обучения на Vertex AI.
После запуска задания обучения вы должны увидеть новую запись в разделе «Обучение» пользовательского интерфейса Vertex AI.
Вы можете щелкнуть свое задание по обучению, выбрать связанное с ним CustomJob, а затем выбрать Просмотреть журналы, чтобы просмотреть журналы, созданные при обучении вашей модели.
Развертывание вашей модели в Vertex AI
Подождите, пока ваша модель закончит обучение, затем снова нажмите на запись задания обучения в Vertex AI. Это приведет вас к записи вашего артефакта модели в реестре моделей. Нажмите здесь Сведения о версии и запишите идентификатор вашей модели.
Мы снова используем Vertex AI Python SDK для развертывания обученной модели в конечной точке Vertex AI. Для этого нам нужно предоставить скрипт deploy.py с переменными project_id, region, Bucket_Name и Accelerator_type, а также указать идентификатор модели (model_id).
После развертывания модели вы должны увидеть запись в разделе Конечные точки пользовательского интерфейса Vertex AI для вашей модели. Запишите идентификатор этой конечной точки, так как он понадобится нам при использовании модели для прогнозирования.
Использование развернутой модели для сегментации изображения
Теперь мы будем использовать нашу модель для сегментации тестового изображения. Скрипт predict.py берет изображение, преобразует его в пустой массив и отправляет в конечную точку. Развернутая модель возвращает маску сегментации, которая раскрашивается и сохраняется в формате PNG (mask.png) с использованием библиотеки Pillow Python. После этого скрипт накладывает маску сегментации на тестовое изображение и также сохраняет это наложение как отдельный PNG (overlay.png).
Не забудьте обновить переменные project_id, region и Bucket_name, а также указать путь к тестовому образу (image_path), а также идентификатор развернутой конечной точки (endpoint_id) в сценарии ниже. Затем запустите его, чтобы протестировать развернутую модель.
Полученные результаты
Наконец, мы можем изучить два выходных изображения, чтобы увидеть, насколько хорошо модель показала себя при сегментации тестового изображения.
Как видите, в данном случае модель успешно сегментировала изображение на составные части. Машины, припаркованные на улице (розовые), отделены от окружающих их деревьев (зеленые) и зданий (красные). Капот ведущей машины (белый) отделен от дороги (серый), а небо (синий) отделен от деревьев (зеленый).
Полный список сопоставлений цветов выглядит следующим образом:
Стоит признать, что границы масок здесь немного размыты; это связано с тем, что мы сжимаем все наши изображения до 160 × 160 пикселей во время обучения и прогнозирования, чтобы упростить процесс обучения. Если вы хотите улучшить эти результаты, не стесняйтесь попробовать уменьшить степень усадки, так как это может помочь сделать границы между объектами более четкими. Кроме того, мы советуем поэкспериментировать с обучением модели для большего количества эпох (определенных в train.py), так как это должно дать лучшие результаты.
Краткое содержание
В этой статье мы показали вам, как использовать Vertex AI для обучения и развертывания пользовательской модели сегментации изображений. Надеюсь, вы уже поняли, как легко обучить и развернуть вашу модель с помощью Vertex AI после того, как вы ее разработали. Хотя основное внимание в этом блоге уделялось сегментации изображений, вы можете использовать те же методы обучения и развертывания с помощью Vertex AI Python SDK для гораздо более широкого круга задач машинного обучения.
Сценарии, которые мы предоставили в этом блоге, легко адаптируются, при этом в сценарии train.py и deploy.py нужно внести очень мало изменений. особенно, поэтому мы надеемся, что вам понравится настраивать их для вашего собственного варианта использования!
Дататоник, четырехкратный партнер года Google по облачным технологиям, обладает богатым опытом в области компьютерного зрения, машинного обучения и ряда продуктов и услуг Google. Свяжитесь с нами, чтобы узнать, какие преимущества может принести вашему бизнесу компьютерное зрение или другие модели машинного обучения.
Ознакомьтесь с другими нашими блогами о компьютерном зрении из этой серии:
Часть 1: Компьютерное зрение: взгляды экспертов Datatonic
Часть 2: Компьютерное зрение: новые тенденции и облачные технологии Google
Часть 3: Компьютерное зрение: обнаружение объектов и искусственный интеллект без кода с помощью AutoML
Часть 4: Компьютерное зрение: развертывание моделей сегментации изображений на вершинном ИИ
Часть 5: Компьютерное зрение: генеративные модели и условный синтез изображений