Классификация изображений на видеокадрах
- Перед началом работы
- Подготовьте инфраструктуру
- Настройте DataSphere
- Создайте секреты
- Подготовьте ноутбуки
- Установите зависимости
- Загрузите и разметьте данные
- Подготовьте ML-модель и вычислите признаки
- Обучите классификатор на полученных признаках
- Получите результаты предсказания признаков на тестовых данных
- Практическое применение модели
- Как удалить созданные ресурсы
Yandex DataSphere позволяет строить модели машинного обучения, используя интерфейс Jupyter Notebook.
В этом руководстве решена задача бинарной классификации изображений. Такая задача возникает при определении типа транспортного средства по изображению с камеры видеонаблюдения. Предполагается, что система управления видеомониторингом захватывает изображения с камеры при обнаружении движения и сохраняет их в бакет Yandex Object Storage.
Чтобы познакомиться с решением задачи:
- Подготовьте инфраструктуру.
- Настройте DataSphere.
- Создайте секреты.
- Подготовьте ноутбуки.
- Установите зависимости.
- Загрузите и разметьте данные.
- Подготовьте ML-модель и вычислите признаки.
- Обучите классификатор на полученных признаках.
- Получите результаты предсказания признака на тестовом изображении.
- Посмотрите варианты практического применения модели.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Перед началом работы нужно зарегистрироваться в Yandex Cloud, настроить сообщество и привязать к нему платежный аккаунт:
- На главной странице DataSphere
нажмите Попробовать бесплатно и выберите аккаунт для входа — Яндекс ID или рабочий аккаунт в федерации (SSO). - Выберите организацию Yandex Cloud Organization, в которой вы будете работать в Yandex Cloud.
- Создайте сообщество.
- Привяжите платежный аккаунт к сообществу DataSphere, в котором вы будете работать. Убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его в интерфейсе DataSphere.
Необходимые платные ресурсы
В стоимость работы модели входит:
- плата за использование бакета (см. тарифы Yandex Object Storage).
- плата за использование вычислительных ресурсов (см. тарифы Yandex DataSphere).
Подготовьте инфраструктуру
Войдите в консоль управления
Если у вас есть активный платежный аккаунт, на странице облака
Примечание
Если вы работаете с Yandex Cloud через федерацию удостоверений, вам может быть недоступна платежная информация. В этом случае обратитесь к администратору вашей организации в Yandex Cloud.
Создайте каталог для работы
Создайте каталог и сеть с подсетями в каждой зоне доступности.
- В консоли управления
выберите облако и нажмите кнопку Создать каталог. - Введите имя каталога, например
data-folder
. - Нажмите кнопку Создать.
Создайте сервисный аккаунт
-
Перейдите в каталог
data-folder
. -
В списке сервисов выберите Identity and Access Management.
-
Нажмите кнопку Создать сервисный аккаунт.
-
Введите имя сервисного аккаунта, например
sa-for-project
. -
Нажмите Добавить роль и назначьте сервисному аккаунту роли:
storage.viewer
— для чтения данных из бакета Object Storage.vpc.gateways.user
— для работы с подсетью.
-
Нажмите кнопку Создать.
Создайте статический ключ доступа для сервисного аккаунта
Чтобы сервисный аккаунт мог аутентифицироваться в Object Storage, создайте статический ключ доступа.
- Перейдите в каталог
data-folder
. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Сервисные аккаунты. - В открывшемся списке выберите сервисный аккаунт
sa-for-project
. - Нажмите кнопку Создать новый ключ на верхней панели.
- Выберите пункт Создать статический ключ доступа.
- Задайте описание ключа, чтобы потом было проще найти его в консоли управления.
- Сохраните идентификатор и секретный ключ: секретный ключ не сохраняется в Yandex Cloud, поэтому его нельзя будет посмотреть в консоли управления.
Создайте NAT-шлюз для доступа в интернет
- В каталоге
data-folder
выберите сервис Virtual Private Cloud. - На панели слева выберите Шлюзы.
- Нажмите кнопку Создать и задайте настройки шлюза:
- Введите имя шлюза, например
nat-for-cluster
. - Тип шлюза — NAT-шлюз.
- Нажмите кнопку Сохранить.
- Введите имя шлюза, например
Создайте таблицу маршрутизации:
- На панели слева выберите Таблицы маршрутизации.
- Нажмите кнопку Создать и введите параметры таблицы маршрутизации:
- Введите имя, например
route-table
. - Выберите сеть каталога
data-folder
. - Нажмите кнопку Добавить маршрут.
- В открывшемся окне в поле Next hop выберите Шлюз.
- В поле Шлюз выберите созданный NAT-шлюз. Префикс назначения заполнится автоматически.
- Нажмите кнопку Добавить.
- Введите имя, например
- Нажмите кнопку Создать таблицу маршрутизации.
Привяжите таблицу маршрутизации к одной из подсетей, чтобы направить трафик из нее через NAT-шлюз:
- На панели слева выберите
Подсети. - В строке нужной подсети нажмите кнопку
. - В открывшемся меню выберите пункт Привязать таблицу маршрутизации.
- В открывшемся окне выберите созданную таблицу в списке.
- Нажмите кнопку Привязать.
Создайте S3-бакет
- Перейдите в каталог
data-folder
. - В списке сервисов выберите Object Storage.
- Нажмите Создать бакет.
- На странице создания бакета:
-
Введите имя бакета в соответствии с правилами именования.
Важно
Не используйте для подключения бакеты, содержащие точку в имени.
-
В полях Доступ на чтение объектов, Доступ к списку объектов и Доступ на чтение настроек выберите Ограниченный.
-
При необходимости ограничьте максимальный размер бакета.
-
- Нажмите Создать бакет для завершения операции.
Настройте DataSphere
Создайте проект
- Откройте главную страницу
DataSphere. - На панели слева выберите
Сообщества. - Выберите сообщество, в котором вы хотите создать проект.
- На странице сообщества нажмите кнопку
Создать проект. - В открывшемся окне укажите имя и (опционально) описание проекта.
- Нажмите кнопку Создать.
Измените настройки проекта
-
Выберите нужный проект в своем сообществе или на главной странице
DataSphere во вкладке Недавние проекты. -
Перейдите на вкладку Настройки.
-
В блоке Расширенные настройки нажмите кнопку
Редактировать. -
Укажите параметры:
- Каталог по умолчанию —
data-folder
. - Сервисный аккаунт —
sa-for-project
. - Подсеть — подсеть зоны доступности
ru-central1-a
в каталогеdata-folder
.
Примечание
Если вы указали подсеть в настройках проекта, время выделения вычислительных ресурсов может быть увеличено.
- Группа безопасности — укажите группу безопасности, если они используются в вашей организации.
- Каталог по умолчанию —
-
Нажмите Сохранить.
Создайте секреты
Создайте секреты для хранения идентификатора и секретной части статического ключа доступа:
- В блоке Ресурсы проекта на странице проекта нажмите
Секрет. - Нажмите кнопку Создать.
- В поле Имя задайте имя секрета. Секрет с идентификатором статического ключа назовите
token
, а секрет с секретной частью —key_value
. - В поле Значение введите значение, которое будет храниться в зашифрованном виде.
- Нажмите кнопку Создать. Откроется страница с информацией о созданном секрете.
Подготовьте ноутбуки
Склонируйте Git-репозиторий, в котором находятся ноутбуки с примерами обучения и тестирования модели машинного обучения:
- В верхнем меню нажмите Git и выберите Clone.
- В открывшемся окне введите URI репозитория
https://github.com/yandex-cloud-examples/yc-datasphere-video-recognition.git
и нажмите кнопку Clone.
Дождитесь окончания клонирования, это может занять некоторое время. Папка cклонированного репозитория появится в разделе
В репозитории содержатся два ноутбука:
model-building.ipynb
— для настройки окружения и обучения модели с использованием подхода Convolutional Neural Network (CNN) под названием ResNet50;model-testing.ipynb
— для тестирования модели.
Установите зависимости
Примечание
В примере обучение и тестирование модели производится на конфигурации вычислительных ресурсов g1.1. Вы можете использовать другую конфигурацию с GPU. Для этого измените конфигурацию в коде на желаемую во всех ячейках ноутбуков.
-
Откройте каталог ML и затем ноутбук model-building.ipynb.
-
Выделите первую ячейку, кликнув на нее:
#!g1.1 %matplotlib inline import matplotlib import matplotlib.pyplot as plt import os import io from os import path ...
-
Чтобы запустить ячейку, нажмите
(также можно использовать сочетание клавиш Shift + Enter). -
Дождитесь завершения операции.
В решении используется интерфейс Kerasboto3
необходим для подключения к бакету с изображениями. Также в ячейке задаются переменные окружения, необходимые для работы с CNTK-бэкендом и подключения к бакету.
Указанные в ячейке пакеты уже установлены в DataSphere и импортируются с помощью команды import
. Полный список предустановленных в DataSphere пакетов см. в разделе Список предустановленного ПО.
Загрузите и разметьте данные
Перейдите к разделу Connect S3. В нем выполняются следующие операции:
- Настраивается подключение к S3-бакету.
- Загружается список объектов (изображений) автомобилей и автобусов. Они будут использоваться при обучении модели.
- Определяется функция для извлечения изображения по ключу (названию).
В следующем разделе Labeling выполняется разметка данных:
- Изображения маркируются в соответствии со значением ключа (именем папки).
- Изображения автобусов помечаются меткой
0
, автомобилей —1
.
Чтобы загрузить и разметить данные:
-
В первой ячейке измените значение переменной
bucket_name
на название созданного вами бакета. По умолчанию указано значениеbucketwithvideo
. -
Выделите все ячейки с кодом в разделах Connect S3 и Labeling, удерживая Shift и кликая слева от нужных ячеек:
#!g1.1 session = boto3.session.Session() ...
-
Запустите выделенные ячейки.
-
Дождитесь завершения операции. По завершении операции выводится одно из изображений для проверки корректности загрузки и разметки данных.
Подготовьте ML-модель и вычислите признаки
Перейдите к разделу Calculating the characteristics. В нем выполняются следующие операции:
- Из пакета Keras загружается модель ResNet50 с весами, предварительно подобранными на наборе данных ImageNet. Этот набор содержит 1.2 миллиона изображений, которые разнесены по 1000 категорий.
- Определяется функция
featurize_images
, которая разделяет список изображений на порции (chunks) по 32 в каждой, преобразует их до размера 224×224 пикселя, а затем конвертирует в четырехмерный тензор для загрузки в модель Keras. Далее функция вычисляет признаки и возвращает их в массиве NumPy. - С помощью функции вычисляются бинарные признаки (
1
— автомобиль,0
— иное) и сохраняются в файл. Этот шаг может занять 10-15 минут. Подробнее про модель ResNet50 .
Чтобы подготовить модель и вычислить признаки:
-
Выделите все ячейки с кодом в разделе Calculating the characteristics:
#!g1.1 model = ResNet50(weights='imagenet', input_shape=(224, 224, 3)) ...
-
Запустите выделенные ячейки.
-
Дождитесь завершения операции.
Обучите классификатор на полученных признаках
В этом разделе вы будете обучать классификатор LightGBM на признаках, вычисленных в предыдущем разделе. Для характеризации модели выполняется кросс-валидация.
Используется метод K-fold
Это важно, когда в ваших данных число изображений одной из категорий существенно меньше, чем из другой категории. Здесь используется кросс-валидация с пятью фолдами. Вы можете задать другое число фолдов в параметре n_splits
.
Перейдите к разделам Training and cross-validation и Saving the model. В них выполняются следующие операции:
- Определяется объект для кросс-валидации результатов обучения методом K-fold.
- Готовится таблица для сохранения метрик качества классификации.
- Определяется функция вычисления выбранных метрик
classification_metrics
. - Запускается обучение классификатора LightGBM. В данном примере используется кросс-валидация с пятью фолдами:
- Обучающая выборка разбивается на пять непересекающихся одинаковых по объему частей.
- Выполняется пять итераций. На каждой итерации выполняются следующие шаги:
- Модель обучается на четырех частях выборки.
- Модель тестируется на части выборки, которая не участвовала в обучении.
- Выводятся выбранные метрики качества.
- Классификатор обучается на полном наборе данных и выводится итоговая матрица ошибок.
Для обучения классификатора запустите последовательно все ячейки в разделах Training and cross-validation и Saving the model.
В результате обученная модель будет сохранена в отдельный файл.
Получите результаты предсказания признаков на тестовых данных
Чтобы использовать полученную модель:
-
Откройте каталог ML и затем ноутбук model-testing.ipynb.
В этом ноутбуке используется ранее обученный классификатор LightGBM для подготовки необходимых сущностей для иллюстрации применения вашей модели.
Примечание
Для использования модели нужно существенно меньше ресурсов, чем для ее обучения, поэтому здесь оставлена минимальная конфигурация c1.4 (по умолчанию).
-
Во второй ячейке измените значение переменной
bucket_name
на название созданного вами бакета. По умолчанию указано значениеbucketwithvideo
. -
Запустите первые три ячейки. В этих ячейках:
- Импортируются необходимые для теста пакеты.
- Определяется имя бакета, в котором хранятся изображения.
- Настраивается подключение к бакету с изображениями из сервиса видеомониторинга.
-
Задайте тестовое изображение с автомобилем:
test_image = 'car/electric-cars-17.jpeg'
Примечание
Если вы повторно запускаете ячейку, укажите новое изображение.
-
В ячейке из раздела Prediction загрузите модель ResNet50 и подготовленный классификатор LightGBM и вычислите вероятность предсказанного значения бинарного признака (
1
соответствует автомобилю).В первый раз ячейка с вычислением предсказания обрабатывается дольше, так как модели загружаются в память. При последующих запусках ячейка будет выполняться быстрее:
%%time clf = lgb.Booster(model_file='ImageClassificationML/lightgbm_classifier.model') model = ResNet50(weights='imagenet', input_shape=(224, 224, 3)) ...
-
Убедитесь, что значение вероятности близко к единице (должно получиться
≈0.98
). -
Поменяйте код в ячейке перед загрузкой модели:
test_image = 'bus/electric_bus-183.jpeg'
Это тестовое изображение, на котором нет автомобиля.
-
Выполните ячейку.
-
Повторите вычисление вероятности и убедитесь, что значение существенно меньше
0.5
.
Таким образом, классификатор успешно предсказывает признак для этих двух изображений.
Примечание
Вы можете поделиться готовым ноутбуком с расчетами или экспортировать проект целиком.
Практическое применение модели
Есть несколько вариантов практического применения построенной модели:
- На основе кода предлагаемого решения можно запустить веб-сервис с помощью Yandex Cloud Functions и анализировать изображения при наступлении соответствующего события в видеомониторинге.
- Для параллельной обработки изображений, приходящих с большого количества видеокамер в S3-бакет, можно загрузить код в кластер Apache Spark™ в Yandex Data Processing с помощью пакета PySpark.
Как удалить созданные ресурсы
Некоторые ресурсы платные. Чтобы остановить работу модели и перестать платить за созданные ресурсы, удалите те из них, которые вы больше не будете использовать: