Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
© 2022 ООО «Яндекс.Облако»
Yandex DataSphere
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Управление проектом
      • Создание проекта
      • Выбор версии Python
      • Установка зависимостей
      • Управление вычислительными ресурсами
      • Настроить ограничения вычислений для проекта
      • Настроить ограничения вычислений для каталога
      • Изменение размера хранилища проекта
      • Изменение имени или описания
      • Удаление ноутбука или проекта
    • Поделиться ноутбуком
      • Публикация ноутбука
      • Экспорт проекта
    • Работа с ноутбуком
      • Запуск примеров кода в ноутбуке
      • Версионирование. Работа с контрольными точками
      • Очистка состояния интерпретатора
      • Работа с Git
    • Управление Docker‑образами
      • Docker-образ для проекта
      • Docker-образ в ячейке
    • Подключение к источникам данных
      • Подключение к базе данных ClickHouse
      • Подключение к базе данных PostgreSQL
      • Подключение к хранилищу S3
    • Настройка интеграции с Data Proc
    • Работа с приватными данными
      • Создание секрета
      • Вызов секрета
      • Изменение секрета
      • Копирование секрета
      • Удаление секрета
    • Запуск распределенного обучения
    • Развертывание эксплуатации моделей
      • Создание ноды из ячейки с кодом на Python
      • Настройка окружения ноды
      • Запросы в ноды
  • Концепции
    • Обзор
    • Проект
    • Список предустановленного ПО
    • Доступные команды
    • Служебные команды #pragma
    • Конфигурации вычислительных ресурсов
    • Интеграция с системами контроля версий и данных
    • Сохранение состояния
    • Интеграция с Data Proc
    • Фоновые операции
    • Датасеты
    • Хранение приватных данных
    • Развертывание эксплуатации моделей
    • Использование TensorBoard в DataSphere
    • Распределенное обучение
    • Управление расходами
    • Квоты и лимиты
  • Ранний доступ
    • Обзор
    • Специальные фоновые операции
  • Практические руководства
    • Все руководства
    • Знакомство с DataSphere
    • Голосовая биометрия
    • Оценка качества STT моделей
    • Разметка аудио
    • Классификация изображений на видеокадрах
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • AppTokenService
      • FolderBudgetService
      • NodeService
      • ProjectDataService
      • ProjectService
      • OperationService
    • REST (англ.)
      • Overview
      • AppToken
        • Overview
        • validate
      • FolderBudget
        • Overview
        • get
        • set
      • Node
        • Overview
        • execute
      • Project
        • Overview
        • create
        • delete
        • execute
        • get
        • getCellOutputs
        • getNotebookMetadata
        • getStateVariables
        • getUnitBalance
        • list
        • open
        • setUnitBalance
        • update
  • Управление доступом
  • Правила тарификации
  • Публичные материалы
  • Релизы
  • Вопросы и ответы
  1. Практические руководства
  2. Классификация изображений на видеокадрах

Классификация изображений на видеокадрах

Статья создана
Yandex.Cloud
  • Перед началом работы
  • Установите зависимости
  • Загрузите и разметьте данные
  • Подготовьте ML-модель и вычислите признаки
  • Обучите классификатор на полученных признаках
  • Получите результаты предсказания признаков на тестовых данных
  • Практическое применение модели

Yandex DataSphere позволяет строить модели машинного обучения, используя интерфейс Jupyter Notebook в Yandex Cloud.

В этом сценарии решена задача бинарной классификации изображений. Такая задача возникает при определении типа транспортного средства по изображению с камеры видеонаблюдения. Предполагается, что система управления видеомониторингом захватывает изображения с камеры при обнаружении движения. Далее изображения передаются в S3-бакет.

Чтобы познакомиться с решением задачи:

  1. Установите зависимости.
  2. Загрузите и разметьте данные.
  3. Подготовьте ML-модель и вычислите признаки.
  4. Обучите классификатор на полученных признаках.
  5. Получите результаты предсказания признака на тестовом изображении.
  6. Посмотрите варианты практического применения модели.

Перед началом работы

  1. Создайте S3-бакет. Загрузите в него изображения для обучения модели из каталога по ссылке.

  2. Создайте сервисный аккаунт.

  3. Назначьте роль storage.viewer сервисному аккаунту для доступа на чтение объектного хранилища, в котором создан бакет.

  4. Создайте статический ключ доступа.

  5. Сохраните статический ключ доступа в файл:

    [default]
    aws_access_key_id=<идентификатор статического ключа>
    aws_secret_access_key=<секретный ключ>
    
  6. Создайте проект в DataSphere и откройте его.

  7. Склонируйте Git-репозиторий, в котором находятся ноутбуки с примерами обучения и тестирования модели машинного обучения:

    https://github.com/MaxKhlupnov/ImageClassificationML
    

    Дождитесь окончания клонирования, это может занять некоторое время. После завершения операции в блоке File Browser появится каталог склонированного репозитория.

  8. Откройте каталог ImageClassificationML и затем файл yc.config. Замените содержимое файла строками из локального файла со статическим ключом доступа.

  9. Откройте каталог ML и затем ноутбук model-building.ipynb.

    Примечание

    Если вы обновите вкладку браузера, на которой запущен ноутбук, или закроете ее, то состояние ноутбука сохранится. Переменные и результаты уже сделанных вычислений при этих действиях не сбрасываются.

Установите зависимости

  1. Выделите первую ячейку, кликнув на нее:

    #!g1.1
    %matplotlib inline
    import matplotlib
    import matplotlib.pyplot as plt
    import os
    import io
    from os import path
    ...
    
  2. Запустите выделенную ячейку, выбрав в меню Run → Run Selected Cells (также можно использовать сочетание клавиш Shift+Enter).

  3. Дождитесь завершения операции.

В решении используется интерфейс Keras библиотеки TensorFlow с CNTK-бэкендом. Пакет boto3 используется для подключения к S3-бакету как источнику изображений. Также в ячейке задаются переменные окружения, необходимые для работы с CNTK-бэкендом и подключения к S3-бакету.

Указанные в ячейке пакеты уже установлены в DataSphere и импортируются с помощью команды import. Полный список предустановленных в DataSphere пакетов см. в разделе Список предустановленного ПО.

Примечание

Эта и последующие ячейки используют конфигурацию вычислительных ресурсов g1.1 для ускорения загрузки и обучения модели. Подробнее см. в разделе Конфигурации вычислительных ресурсов.

Загрузите и разметьте данные

Перейдите к разделу Функции для подключения к S3. В нем выполняются следующие операции:

  1. Настраивается подключение к S3-бакету.
  2. Загружается список объектов (изображений) автомобилей и автобусов. Они будут использоваться при обучении модели.
  3. Определяется функция для извлечения изображения по ключу (названию).

В следующем разделе Маркировка выполняется разметка данных:

  • Изображения маркируются в соответствии со значением ключа (именем папки).
  • Изображения автобусов помечаются меткой 0, автомобилей — 1.

Чтобы загрузить и разметить данные:

  1. Выделите все ячейки с кодом в разделах Функции для подключения к S3 и Маркировка, удерживая Shift и кликая слева от нужных ячеек:

    #!g1.1
    
    session = boto3.session.Session()
    ...
    
  2. Запустите выделенные ячейки.

  3. Дождитесь завершения операции. По завершении операции выводится одно из изображений для проверки корректности загрузки и разметки данных.

Подготовьте ML-модель и вычислите признаки

Перейдите к разделу Вычисление признаков. В нем выполняются следующие операции:

  1. Из пакета Keras загружается модель ResNet50 с весами, предварительно подобранными на наборе данных ImageNet. Этот набор содержит 1,2 миллиона изображений, которые разнесены по 1000 категорий.
  2. Определяется функция для разделения списка изображений на пачки (chunks) по 32 в каждой.
  3. Определяется функция, которая читает список изображений и преобразует в формат, пригодный для обработки моделью, а также вычисляет признаки и возвращает их в массиве NumPy.
  4. С помощью данных функций вычисляются бинарные признаки (1 — автомобиль, 0 — иное) и сохраняются в файл. Этот шаг может занять 10-15 минут. Подробнее про модель ResNet50.

Чтобы подготовить модель и вычислить признаки:

  1. Выделите все ячейки с кодом в разделе Вычисление признаков:

    #!g1.1
    model = ResNet50(weights='imagenet',  input_shape=(224, 224, 3))
    ...
    
  2. Запустите выделенные ячейки.

  3. Дождитесь завершения операции.

Обучите классификатор на полученных признаках

Перейдите к разделам Training and Cross Validation и Save the model. В них выполняются следующие операции:

  1. Определяется объект для кросс-валидации результатов обучения методом K-fold.
  2. Готовится таблица для сохранения метрик качества классификации.
  3. Определяется функция вычисления выбранных метрик.
  4. Запускается обучение классификатора LightGBM. В данном примере используется кросс-валидация с пятью фолдами:
    1. Обучающая выборка разбивается на пять непересекающихся одинаковых по объему частей.
    2. Выполняется пять итераций. На каждой итерации выполняются следующие шаги:
      1. Модель обучается на четырех частях выборки.
      2. Модель тестируется на части выборки, которая не участвовала в обучении.
      3. Выводятся выбранные метрики качества.
  5. Классификатор обучается на полном наборе данных и выводится итоговая матрица ошибок.

Для обучения классификатора запустите последовательно все ячейки в разделах Training and Cross Validation и Save the model.

Результатом обучения является модель, сохраненная в отдельном файле.

Получите результаты предсказания признаков на тестовых данных

Чтобы использовать полученную модель:

  1. Откройте каталог ImageClassificationML/ML и затем ноутбук model-testing.ipynb.

    Примечание

    Для использования модели нужно существенно меньше ресурсов, чем для ее обучения, поэтому здесь оставлена минимальная конфигурация c1.4 (по умолчанию).

  2. Запустите первые две ячейки. В этих ячейках:

    1. Импортируются необходимые для теста пакеты.
    2. Настраивается подключение к S3-бакету с изображениями из сервиса видеомониторинга.
  3. Задайте тестовое изображение с автомобилем:

    test_image = 'car/test/3_60184_41.jpg'
    
  4. В следующей ячейке загрузите модель ResNet50 и подготовленный классификатор LightGBM, и вычислите вероятность предсказанного значения бинарного признака (1 соответствует автомобилю).

    В первый раз ячейка с вычислением предсказания обрабатывается дольше, так как модели загружаются в память. При последующих запусках ячейка будет выполняться быстрее:

    %%time
    clf = lgb.Booster(model_file='ImageClassificationML/lightgbm_classifier.model')
    model = ResNet50(weights='imagenet',  input_shape=(224, 224, 3))
    ...
    
  5. Убедитесь, что значение вероятности близко к единице (должно получиться ≈0.98).

  6. Поменяйте код в ячейке перед загрузкой модели:

    test_image = 'car/test/3_59296_27.jpg'
    

    Это тестовое изображение, на котором нет автомобиля.

  7. Выполните ячейку.

  8. Повторите вычисление вероятности и убедитесь, что значение существенно меньше 0.5.

Таким образом, классификатор успешно предсказывает признак для этих двух изображений.

Примечание

Вы можете поделиться готовым ноутбуком с расчетами или экспортировать проект целиком.

Практическое применение модели

Есть несколько вариантов практического применения построенной модели:

  • На основе кода предлагаемого решения можно запустить веб-сервис с помощью Yandex Cloud Functions и анализировать изображения при наступлении соответствующего события в видеомониторинге.

  • Для параллельной обработки изображений, приходящих с большого количества видеокамер в S3-бакет, можно загрузить код в кластер Apache Spark™ в Yandex Data Proc с помощью пакета PySpark.

    Пример кода Python для интеграции модели с PySpark:

    from sparkdl import readImages, KerasImageFileTransformer
    
    # load cctv image body from S3 and return image tensor
    
    def load_image_body_and_process(uri):
        import PIL.image
        from keras.applications.imagenet_utils import preprocess.input
    ...
    
    # load cctv images in batch (from S3 or copy to local hdfs)
    
    image_uri_dataset = readImages("/cctv-in/*.jpg")
    
    # create a Keras estimator that takes our saved model file and train it using Spark
    
    estimator = KerasImageFileEstimator(inputCol="imageUri",
                                        outputCol="predict_car",
                                        labelCol="categoryVec",
                                        imageLoader=load_image_body_and_process,
                                        kerasOptimizer="adam",
                                        kerasLoss="categorical_crossentropy",
                                        kerasFitParams={"epochs": 5, "batchSize": 64},
                                        modelFile="lightgbm_classifier.model")
    predictions = estimator.fit(image_uri_dataset)
    

Была ли статья полезна?

Language / Region
© 2022 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Установите зависимости
  • Загрузите и разметьте данные
  • Подготовьте ML-модель и вычислите признаки
  • Обучите классификатор на полученных признаках
  • Получите результаты предсказания признаков на тестовых данных
  • Практическое применение модели