NIX Solutions corporate blog
Algorithms
Machine learning
February 26

Проект «Прометей»: поиск пожаров с помощью ИИ

Original author: Facundo Santiago
Translation


Перевод Project Prometheus — An AI-powered fire finding solution

Мы с коллегами работаем в проекте Prometheus («Прометей») — это решение для раннего обнаружения пожаров, в котором объединены ИИ, компьютерное зрение, автоматические дроны и сервисы прогноза погоды. Этот комплекс предназначен для выявления пожаров в дикой природе, прежде чем они перерастут в настоящее бедствие. Мы хотим рассказать о проекте поподробнее, как он работает и какой теоретический аппарат лежит в его основе. Материал будет подан как можно более независимо от конкретных технологий, так что если вас интересуют конкретные особенности реализации (CNTK, Faster R-CNN, контейнеры Docker, Python, фреймворк .NET и т. д.), то заходите в наш GitHub-репозиторий. А здесь мы лишь упомянем использованные технологии.

Небольшое введение:


Мотивация


В 2017-м подсчитали, что лесные пожары обходятся экономике США примерно в $200 млрд. Это немногим меньше ущерба от ураганов. Но отличие в том, что если тушить пожары, пока они не разрослись, то потери можно сильно уменьшить. Однако задача обнаружения пожаров — задача рутинная, трудная и требующая участия людей: по большей части они сидят на наблюдательных башнях с биноклями, стараясь вовремя заметить пожар, или облетают территории на вертолётах или посредством управляемых дронов. Проект «Прометей» призван автоматизировать всю эту рутину с помощью автоматических дронов, которые будут выявлять пожары на ранней стадии, иначе ветер, сухость или особенности рельефа помогут огню за минуты распространиться на акры площади. Причём большинство таких пожаров возникают в удалённых районах, где мало людей и некому отслеживать возникновение очагов.

Если отправить дроны патрулировать эти удалённые районы, они помогут вовремя обнаружить огонь и минимизировать ущерб.

Проект


«Прометей» можно разделить на три части:

  • Модуль определения пожаров использует алгоритмы глубокого обучения для выявления маленьких очагов с помощью RGB-камеры дрона (реализован в качестве облачного REST-сервиса).
  • Модуль планирования полётов позволяет пользователю выбирать и планировать зоны патрулирования (реализован в качестве Windows-приложения и интегрирован с картографическими погодными сервисами).
  • Система предупреждения позволяет пользователю быстро уведомлять команду о найденном возгорании (с помощью Azure Functions и Twilio).

Определение пожаров


Мы используем автоматизированные дроны для поиска огня в отдалённых районах. Установленные на борту RGB-камеры используются для съёмки всего района, а фотографии затем скармливаются модели машинного обучения, которая ищет пожары и уведомляет пользователя. Всем спасибо, все свободны. Хотя, погодите…

Урок первый: размер имеет значение


Определение пожаров с помощью компьютерного зрения в тех пропорциях, что нам были нужны, оказалось трудной задачей, и поэтому мы использовали другой подход. Вероятно, вы подумали, что использовать RGB-камеры нецелесообразно, потому что инфракрасные камеры в данном случае предпочтительнее. Но поговорив с пожарными, мы выяснили, что всё не так просто: на инфракрасных камерах пожарами будут выглядеть места с высокой температурой воздуха, а некоторые участки поверхности будут выглядеть источниками тепла только из-за особенностей отражения света. К тому же такие камеры существенно дороже. Пожарные используют их по большей части ночью, чтобы понять, удалось ли полностью потушить пожар.

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



В подобных случаях, в том числе и в нашем, наилучшей производительности в определении объектов можно достичь, если не обращать внимание на их конкретное расположение или не подсчитывать количество на изображении. Но чаще всего устройство системы определения объектов оказывается гораздо сложнее. Есть разные способы решения этой задачи, и мы воспользовались областной свёрточной нейросетью (regional convolutional neural network, R-CNN) а точнее, реализацией Faster R-CNN.

Также часто используют YoLo и Detectron (недавно переведена в open-source).

Процесс состоит из таких шагов:

  • Локализация: нужно генерировать участки (образцы) областей внутри изображения, которые могут содержать искомые объекты. Эти области называются Regions of Interest (ROI, области интереса). Они представляют собой большие наборы рамок, охватывающие всё изображение. Мы генерируем ROI с помощью методики, описанной в работе «Segmentation as Selective Search for Object Recognition» авторства Koen E. A. van de Sande и других. Методика реализована в Python-библиотеке dlib.
  • Классификация объектов: далее из каждой рамки извлекаются визуальные свойства, проводится их оценка и система предполагает, есть ли там объекты, и какие они (подробнее об этом ниже).
  • Подавление немаксимумов (Non-maximum suppression): бывает, что рамки, представляющие один и тот же объект, частично или полностью накладываются друг на друга. Чтобы избежать таких дублирований, пересекающие рамки объединяются в одну. Эта задача может потребовать очень много вычислительных мощностей, однако в Intel Math Library реализованы некоторые оптимизации.

Урок второй: вашим данным может понадобиться помощь


Для машинного обучения нужны данные. Но в глубоком обучении (то есть в многомерном пространстве ввода) вам понадобится очень много данных, чтобы извлечь интересующие визуальные свойства. Как вы понимаете, трудно найти большой датасет объектов, которые нас интересуют (пожары). Чтобы решить эту проблему, мы для извлечения визуальных свойств воспользовались методикой «переноса обучения» (transfer learning) с заранее обученными моделями классификации изображений общего назначения, поскольку они умеют хорошо обобщать. Проще говоря, вы берёте модель, заранее обученную что-то определять, и «настраиваете» её с помощью своего датасета. То есть эта модель будет извлекать свойства, а вы уже будете пытаться использовать их представления, выученные для задачи А (обычно, высокоуровневой задачи), в решении задачи Б (обычно, низкоуровневой). Успешность решения задачи Б свидетельствует о том, сколько модель для задачи А смогла узнать о задаче Б. В нашем случае задачей А была задача классификации объектов ImageNet, а задачей Б — определение пожаров.

Это методику можно применять, убрав из заранее обученной нейросети последний слой и заменив его своим классификатором. Затем замораживаем веса всех остальных слоёв и обычным образом обучаем нейросеть.

Получившаяся у нас нейросеть недоступна в GitHub из-за её размера — около 250 Мб. Если она вам нужна, напишите нам.

Для ImageNet есть много уже обученных моделей (AlexNet, VGG, Inception, RestNet и т.д.). В каждой из них авторы использованы разные компромиссы по скорости, точности и в структуре. Мы выбрали AlexNet, потому что она требует меньше вычислительных ресурсов, а результаты в нашей задаче мало отличаются от других сетей.

Урок третий: видеоролики (особенно, их отдельные кадры) — ваши лучшие друзья


Но несмотря на перенос обучения нам всё ещё нужно довольно много данных, чтобы решить задачу классификации. И тут мы воспользовались видео. Из каждого ролика можно извлечь кучу кадров и быстро получить отличный большой датасет. У видео есть ещё одно полезное свойство: если объект или камера движется, то вы получаете изображения объекта с разным освещением, под разными углами и в разных позициях, так что датасет получается очень качественным.

Свой набор картинок мы не загрузили в репозиторий тоже из-за размера, стучитесь.

Мы собрали видео с дронов из разных источников и вручную промаркировали. Есть несколько инструментов для присвоения изображениям меток в разных форматах, в зависимости от используемого фреймворка глубокого обучения. Рекомендую LabelImg для Linux/Windows и RectLabel для Mac. Мы использовали CNTK, поэтому остановились на инструменте Microsoft VoTT, умеющем экспортировать в форматы CNTK и TensorFlow.

Урок четвёртый: купите видеокарту (или арендуйте облачную)


Обучение большой модели вроде нашей требует немалых вычислительных мощностей, и GPU будет огромным подспорьем. У нас ушло около 15 минут на обучение с помощью NVIDIA GeForce GTX 1050. Но даже несмотря на использование видеокарты настройка параметров модели является большим затруднением. У Microsoft есть хороший инструмент Azure Experimentation Service, позволяющий запускать в облаке параллельно несколько обучений с разными параметрами и анализировать полученную точность. Также присмотритесь к AWS SageMaker.

В нашем репозитории лежит скрипт Sweep_parameters.py, который автоматически очистит параметрическое пространство и запустит задачи на обучение.

Готово!


Итак, мы обучили свою R-CNN и навозились с переносом обучения, глубоким обучением, видеокартами и т. д. Как теперь поделиться своими трудами с другими? Сначала мы запустили REST-сервис для взаимодействия с моделью. API позволяет отправлять изображения для оценки и возвращает области картинок, наличие огня для которых модель определила с определённой уверенностью. Также вы можете сообщать API, есть ли на изображении на самом деле огонь или нет. Другие конечные точки используются для получения обратной связи и внесения улучшений.
Сервис REST API упакован в Docker-контейнер и опубликован в облаке, что позволяет дёшево масштабировать решение. В репозитории вы можете найти файл с Docker-образом.

Планирование полётов


Красные предупреждения


Как «Прометей» узнаёт, куда отправлять дроны? Мы интегрируемся с национальными погодными сервисами ради определения «красных предупреждений». Это районы, в которых температура воздуха, направление и сила ветра, влажность и атмосферное давление повышают вероятность возникновения пожаров. Поскольку погодные сервисы ориентированы на свои страны, вряд ли их можно использовать для зарубежного поиска. На сегодняшний день мы работаем с американскими и аргентинскими сервисами.



Информация о погоде


Очень важно обладать точными данными о погоде в интересуемых районах. Об этой функции нас попросили пожарные. Мы получаем данные о погоде, опрашивая погодные станции через картографический сервер Национальной службы погоды, и накладывая на карту полученную информацию. Подчеркнём, что это не прогноз погоды, а реальные измерения:


Погодные станции в США.

Не понимаете, как работает эта карта? Вы не одиноки в этом. У нас ушло несколько недель, чтобы разобраться, как этим можно пользоваться. В сети мало информации. Если хотите поэкспериментировать с данными от погодных станций, то придётся получить API-ключи от провайдеров, поскольку мы не имеем права ими делиться.

Система предупреждения


Когда система обнаруживает огонь, она просит оператора подтвердить факт обнаружения. Интерфейс выглядит так:


Окно подтверждения возгорания.

Как видите, система работает достаточно точно даже в таких непростых случаях, как этот. Маленькая красная рамка очерчивает границы возгорания с вероятностью 67 %. На самом деле, «Прометей» старается обнаруживать большие пожары и работает нестабильно при расчёте областей в сценариях, подобных этому. Всё в порядке, так и было задумано. Нас просто не интересовали такие ситуации.

Система предупреждения отправляет на заранее прописанные телефонные номера SMS-уведомление с GPS-координатами пожара. Рассылка выполняется с помощью Twilio, облачной платформы, чьи API позволяют, помимо прочего, программно отправлять и получать текстовые сообщения.

Хотите взглянуть?


Исходный код лежит здесь

Благодарности


«Прометей» разрабатывался в сотрудничестве с Пожарным департаментом Темпе, Аризона, Аргентинским пожарным департаментом и Аргентинским национальным институтом сельскохозяйственных технологий Аргентины.
+22
2.9k 28
Comments 6
Top of the day