Камеры видеонаблюдения вокруг нас. Возможно, вы задавались вопросом, как вы могли обнаружить подозрительное поведение в видеопотоке одного из них. Сегодня я покажу вам, как это сделать. Мы будем использовать веб-камеру вашего компьютера в качестве источника видео, как для обучающих данных (вы станете актером), так и для тестирования вашей модели. Подход представляет собой контролируемое обучение с намеком на трансферное обучение.

Прежде чем мы перейдем к делу, я хочу кратко рассказать о том, что побудило меня написать эту статью. Я полностью верю в важность демократизации технологий. ИИ не должен находиться в руках нескольких влиятельных людей и организаций, а должен быть в руках всех. Вы ответственно относитесь к использованию технологии. Тем не менее, есть случаи, когда технологии должны быть спрятаны, например. в случае опасного оружия (не только оружия), и явно есть параллели с дебатами о 2-й поправке в Соединенных Штатах. Я лично считаю, что методы обработки видео относятся к категории безопасных вещей, которыми можно делиться, но это тонкая линия чтения. В любом случае, вас не должно удивлять, что большая часть этой технологии в любом случае является готовой (спасибо, открытый исходный код), поэтому дискуссия носит в основном академический характер.

Что вам нужно будет следовать

У вас должен быть доступ к компьютеру со следующими установленными компонентами.

  • Питон 3
  • Керас/Tensorflow
  • Подушка (ПИЛ)
  • Нампи
  • CV2

Я пропущу инструкции по установке этих библиотек, так как ваш пробег может отличаться. Не пугайтесь, все они доступны через pip и conda.

Хотя я тестировал этот код на Mac, он должен работать на любой системе. Единственным исключением является преобразование текста в речь, где я использовал subprocess.call() для вызова команды Mac OS X say. В вашей ОС может быть эквивалентная команда. В любом случае, общение с компьютером не имеет решающего значения для успеха миссии, поэтому не стесняйтесь пропускать эти строки.

Будьте готовы действовать!

Во-первых, нам понадобятся некоторые обучающие данные, чтобы учиться. Нам понадобятся видео как «подозрительного», так и «безопасного» поведения, так что будьте готовы действовать! Чтобы упростить обучение нашей модели, вы можете взять в руки игрушечный пистолет или другой узнаваемый предмет для своих «подозрительных» сцен. Таким образом, вашей модели будет легче разделить два случая без большого количества обучающих данных.

Вот фрагмент кода, который захватывает четыре видео (два подозрительных и два безопасных) с веб-камеры вашего компьютера и сохраняет их в каталоге data для последующей обработки.

Посмотрите видео в каталоге data. Вы должны увидеть, что ведете себя безопасно и подозрительно. Видео названы в соответствии с классом, например. SAFE1.avi для безопасного видео.

Извлечение функций из видео с предварительно обученной моделью

Затем вам нужно будет превратить эти видео во что-то, на чем может обучаться алгоритм машинного обучения. Для этого мы переназначим предварительно обученную сеть VGG16, которая была обучена на ImageNet.

Классификатор поездов

Теперь, когда у нас есть ряды X и Y, пришло время обучить модель различать подозрительное и безопасное поведение! В этом примере мы будем использовать глубокую плотную сеть. Выбор модели не заставил себя долго ждать, и вы можете настроить ее так, как считаете нужным.

Будьте готовы обнаружить подозрительное поведение!

Теперь самое интересное. Теперь мы будем использовать все части, которые мы построили. Пришло время превратить веб-камеру вашего компьютера в детектор поведения в режиме реального времени!

Развлекайся!

Вывод

Надеюсь, вам понравился этот урок по обнаружению подозрительного поведения на видео с камер видеонаблюдения. Очевидно, что это всего лишь игрушечный пример, но он должен быть достаточно поучительным, чтобы показать, что вам нужно пройти полный 1984 год.

Очевидный выбор — тренироваться на отдельных кадрах или на последовательностях кадров. Для простоты я выбрал для этого примера отдельные кадры, потому что мы можем пропустить некоторые ортогональные задачи, такие как буферизация изображений и упорядочивание обучающих данных. Если вы хотите тренироваться на последовательностях, вы можете использовать LSTM, и у меня есть для этого общий код (см. ссылку ниже). Тем не менее, с ограниченными тренировочными данными, на которых вы будете тренироваться, это не имеет большого значения.

Взгляните на мой полный код на GitHub.

Этот пример основан на работе, ранее выполненной в Инрии и в других местах.