Home Машинное обучение Создайте приложение камеры для отслеживания животных/объектов с помощью TensorFlow.js | DeepTech

Создайте приложение камеры для отслеживания животных/объектов с помощью TensorFlow.js | DeepTech

0

Представляем PetCam: неинвазивный трекер домашних животных на базе машинного обучения, работающий на старом смартфоне. Этот проект является результатом сотрудничества между мной и Джейсон Мэйс, кто придумал. Кроме того, забавная история… мой коллега Маркку Леписто создал (почти) ТАКОЙ ЖЕ ПРОЕКТ в то же время для своего собственного шоу на YouTube, Level Up, которые вы можете увидеть здесь. Мы используем старые смартфоны. Он использует Коралловая доска для развития. Выберите свое собственное приключение.

Когда я был маленьким и жил дома в Нью-Джерси, мои родители очень строго следили за тем, чтобы я не забывал закрывать гараж на ночь. Потому что, если бы я не закрыл гараж, случилось бы что-то вроде этого:

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

Медведи любят есть мусор. Еноты любят есть мусор. Даже лисы будут бороться с мусором, если вы облегчите им задачу. Учитывая все вышесказанное, я, вероятно, должен был поправиться, не забывая закрывать гараж. Но также было бы неплохо взломать маленькое приложение для машинного обучения на установке камеры Nest моего отца, чтобы всякий раз, когда оно замечало медведя, выносящего наш мусор, оно издавало громкий, угрожающе звучащий воздушный гудок, который напугать бандита обратно в лес.

То, что я хотел тогда, было PetCam, проект, который я представляю вам сегодня: аn приложение, которое предупреждает, когда ваша собака, кошка, птица, курица (другие животные ожидаются) прыгает на вашу кровать, диван, стул, ноутбук и многое другое.

Когда Пушистик запрыгивает на ваш диван («событие, представляющее интерес»), PetCam отправляет вам оповещение через Slack и сохраняет снимок в «дневнике» в облаке.

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

Вот обзор.

Архитектура

Этот проект разделен на три основные части:

1. Интерфейс для обнаружения домашних животных

Это бит, который использует вашу камеру и модель машинного обучения TensorFlow.js для анализа поведения ваших питомцев. Он построен на простом Javascript и работает в браузере, и вы можете попробовать его прямо сейчас. здесь.

Фронтенд-приложение для отслеживания домашних животных

Он использует модель машинного обучения TensorFlow.js, которая анализирует данные с камеры вашего телефона (или веб-камеры) в браузере, никогда не отправляя данные обратно в облако (это то, что делает его «сохраняющим конфиденциальность»). Однако, чтобы сохранить эти события в журнале (например, «кот на диване»), мы отправляем фотографии и строки событий в Firestore, чтобы позже мы могли просматривать события в дневнике (подробнее об этом далее).

2. Интерфейс питомца «Дневник»

Второе внешнее приложение «дневник», которое позволяет просматривать журнал всех действий, обнаруженных вашей камерой PetCam. По сути, он загружает данные, сохраненные в Firestore, в красивый пользовательский интерфейс:

3. Серверная часть Firebase (+ Slack API)

Бессерверный «бэкэнд» делает две вещи: хранит журнал событий и фотографий, а также включает уведомления Slack. Итак, когда ваш питомец делает что-то аккуратное, вы получаете сообщение об этом в Slack:

Все это питается от Firebaseлегкий набор инструментов Google для создания бессерверных бэкендов, а также Slack API.

3а. Модель обнаружения цыплят AutoML Vision

Хорошо, эта часть действительно «приятно иметь». Для PetCam 1.0 мы будем использовать предварительно созданную модель машинного обучения (Coco SSD), которая по умолчанию анализирует множество животных. Но он не так хорошо распознает птенцов (моих новых и единственных питомцев). Итак, в этой третьей части мы создадим пользовательскую модель обнаружения цыплят TensorFlow, используя Google Cloud AutoML:

Уф, этот проект какой-то чокер, не так ли? Два разных интерфейса, разве это не лишнее? Как всегда, вы можете найти весь код для самостоятельной сборки этого приложения. здесь в репозитории Making with ML. Или, если вы просто занимаетесь интерфейсом для отслеживания домашних животных, вы можете найти код и живую демонстрацию в Глючная ссылка.

Теперь, поскольку этот проект такой большой, а объем моего внимания такой маленький, я не собираюсь утомлять вас всеми мелкими подробностями о том, как мы с Джейсоном настроили аутентификацию, установили TensorFlow, развернули облачную функцию и прочую ерунду. Вы можете понять большую часть этого материала самостоятельно, чтение кодачтение ПРОЧТИ МЕНЯпосмотрев наше видео на YouTube (TODO), или (пожалуйста, не убивайте меня) от гуглить.

Вместо этого я просто хочу охватить каждый компонент на высоте 5000 футов и сосредоточиться в основном на сложных, неожиданных препятствиях, которые мы с Джейсоном должны были решить, когда мы построили эту штуку, чтобы вам не приходилось решать их самостоятельно, и чтобы мы могли чувствовать себя умнее. .

Теперь к кодовым шахтам!

Отслеживание домашних животных (или людей, или автомобилей, или посылок Amazon)

Вы когда-нибудь пробовали делать обнаружение объекта на вашей веб-камере, в браузере, используя Javascript?

Изображение MTheiler из Википедии

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

Вы можете настроить это в нескольких строках кода:

Сначала этот код загружает предварительно обученный объект общего назначения. КОКО-СД модель компьютерного зрения TensorFlow.js. COCO-SSD распознает 80 типов объектовв том числе, но не ограничиваясь: жираф, галстук, бокал для вина, брокколи, фен.

Использовать модель так же просто, как вызвать `model.detect(video)`, где `video` — это указатель на ваш поток с веб-камеры. (Это `video id=”webcam” autoplay>` в HTML). Это имеет больше смысла, когда вы смотрите на код здесь в Глюк.

Чтобы проанализировать поток видео, а не только один кадр, запустите `model.detect` в цикле. Вуаля! У вас есть обнаружение объектов в реальном времени.

Как рассчитать пересечения/расстояния ограничивающей рамки

Мы с Джейсоном разработали это приложение таким образом, что при пересечении двух важных для вас объектов — собаки и миски с водой, кошки и вашего ноутбука, вас и вашего холодильника — приложение запускает событие, например «ЧЕЛОВЕК У ХОЛОДИЛЬНИКА». Затем мы сохраняем это событие в пожарный магазин бэкэнд, чтобы мы могли просматривать журнал всех прошлых событий в будущем и запускать уведомление Slack (подробнее о бэкэнде чуть позже). Под пересечением я подразумеваю пересечение двух ограничивающих прямоугольников вокруг обнаруженных объектов:

На этом снимке моя очаровательная маленькая цыпочка Милли «пересекается» со своей миской с водой, и поэтому я делаю вывод, что она, вероятно, пьет.

Джейсон также разработал приятный интерфейс, который поможет вам выбрать, какие два объекта вы хотите отслеживать:

Как рассчитать, насколько близко друг к другу находятся два ограничивающих прямоугольника? Для этого проекта мы хотели знать не только, пересекаются ли два ограничивающих прямоугольника («bboxes»), но и, если нет, то как далеко они друг от друга? Вот код:

Он возвращает 0, если два прямоугольника пересекаются, или расстояние между ними, если они не пересекаются.

Знание того, когда отправлять оповещения

Как только я понял этот код пересечения прямоугольников, я почувствовал себя великолепно! Но затем Джейсон и я обнаружили менее привлекательную, но гораздо более тревожную проблему, которую мы не знали, как решить: как узнать, когда нужно сохранить событие и отправить пользователю предупреждение?

Напомним, что для обнаружения и отслеживания объектов в реальном времени мы запускаем код для анализа изображения с веб-камеры и обнаружения пересечения несколько раз в секунду в цикле. Итак, если ваш корги Руфус просто отдыхает на диване, мы посчитаем, что ограничивающая рамка «собака» пересекается с ограничивающей рамкой «кушетки» несколько раз в секунду. Очевидно, мы хотим считать это «событием» только в первый раз, когда это происходит, когда Руфус прыгает на диван, но не после. Затем, если Руфус уйдет и вернется позже, мы можем запустить событие снова. Так что, может быть, мы создадим переменную, которая отслеживает, отправили ли мы уведомление пользователю, и сбрасывает его, когда Руфус встает с дивана.

За исключением того, что это сложнее, потому что что, если Руфус как бы парит перед диваном или бегает вокруг него, поэтому наш код определяет его как «на» и «вне» дивана много раз за одни и те же несколько секунд? Нравится этот пес с зумами?

через GIPHY

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

// Min number of seconds before we send another alert.
const MIN_ALERT_COOLDOWN_TIME = 60;

if (sendAlerts) {
   sendAlerts = false;
   sendAlert(naughtyAnimals);
   setTimeout(cooldown, MIN_ALERT_COOLDOWN_TIME * 1000);
}

Только периода охлаждения недостаточно! Потому что, что, если у вас есть два собаки или много собак, бегающих по дивану и обратно? Потому что, если Руфус подпрыгивает, а Майло подпрыгивает сразу после него, это два уникальных события, и мы хотим предупредить пользователя об обоих. Внезапно вы должны знать который собаки перемещаются и следят за своим состоянием, и у вас есть волосатая проблема «отслеживания нескольких объектов», которая звучит как чья-то докторская диссертация, и это! (На самом деле вы получаете эту функцию бесплатно через API Google Cloud Video Intelligenceно мы застряли здесь, на земле TensorFlow.js, и это сложно).

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

через GIPHY

Для этого мы вели счетчик количества животных в кадре. Если количество животных увеличивалось, мы отправляли уведомление и увеличивали счетчик. Однако мы никогда не уменьшали значение счетчика, если только количество животных в кадре не достигало нуля (в этот момент мы делали полный сброс). Звучит странно, но взгляните на код здесь:

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

Сценарий Отправить оповещение?
1 собака -> 2 собаки Да
2 собаки -> 3 собаки Да
3 собаки -> 2 собаки Нет
2 собаки -> 1 собака -> 2 собаки Нет
2 собаки -> 1 собака -> 0 собак -> 1 собака Да (для самой последней собаки, которая прыгает на диване)

Фу. К более простым вещам!

Создание приложения для дневника/просмотра домашних животных

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

Я использовал Firestore во многих проектах и ​​столько раз говорил об этом в Dale on AI, что не буду здесь вдаваться в подробности. Когда внешнее приложение PetCam обнаруживает событие (с помощью описанного выше алгоритма), оно записывает некоторые данные о событии в Firestore. Вот как выглядит моя база данных Firestore:

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here