Qt/C++. Objects detection and actions.

Как может выглядеть приложение избирательно реагирующее на объекты, обнаруживаемые нейронной сетью в режиме реального времени? В состав инструментального комплекса входит видеокамера, данные с которой поступают в нейронную сеть. Нейронная сеть обнаруживает объекты. Далее, в зависимости от настроек пользователя, программа избирательно выполняет некоторые действия (реакции) на найденные объекты или группы объектов.
Вообще говоря, используя в программе логические операции «and-or-not» применительно к группе найденных сетью объектов, может быть построено логическое условие, которое служит триггером для запуска какого либо действия. Например, если сцена содержит такие объекты как: человек, чемодан, остановка. И, если эти объекты скреплены условием «and», то, в этом случае, может быть сделано некоторое предположение и выполнено заданное пользователем действие. В этой программе использовано условие «or» для любого подмножества имен COCO, обнаруживаемых сетью.
Что понимается под действием на обнаруженные объекты? В программе применяются два типа действий:
  • проговаривание (озвучивание) имен и процентов вероятности обнаружеваемых нейронной сетью объектов;
  • сохранение на диске снимков экранов (screens) в виде jpg файлов, и автоматическая отправка их на определенный адрес по протоколу SMTP (e-mail).
Другим примером действия может быть, например, отправка SMS на мобильный телефон с использованием сервиса IFTTT. А если у вас есть некоторый привод и контроллер к нему, то может быть задействован и он.
При разработке программы использовались:
  • операционная система macOS BigSur версия 11.0.1;
  • среда разработки Qt/C++ версия 5.14.2;
  • компилятор Clang версия 12.0.0;
  • библиотека OpenCV версия 4.4.0
  • нейронная сеть из группы YOLO обученная на наборе данных COCO.
1. Программа выполняет следующие функции:
  • принимает поток данных с видеокамеры в режиме реального времени;
  • детектирует объекты с помощью нейронной сети (Deep Neural Networks) yolov4-tiny;
  • принимает настройки пользователя для установки связи между объектами и действиями;
  • озвучивает (произносит) имена обнаруженных объектов и их вероятности;
  • создает снимки экрана монитора, сохраняет их в виде jpg файла на SSD диске, отсылает файлы на e-mail;
  • принимает и устанавливает настройки пользователя для модуля голосовых данных (высоту тона, громкость, скорость речи);
  • выполняет тестовую проверку функции создания и отсылки jpg файлов по протоколу SMTP;
  • выводит на экран сохраненные на диске скрины.
2. О реальном времени и потоках.
Коэффициент FPS (Frames per Second) камеры комплекса по паспорту равен 30. Это значит, что с камеры мы можем считаывать 30 кадров в секунду. И это значит, что у нейронной сети есть около 33 миллисекунд на обработку каждого кадра. Однако, без установленного в системе GPU сеть не уложится в эти миллисекунды, и программа неизбежно будет терять данные. Величина этих потерь будет зависеть от быстродействия CPU. Насколько критичны эти потери? Для действий, определенных в нашей программе, эти потери не критичны. Ниже я объясню почему. Для систем, работающих в масштабе реального времени, например, для систем управления движением потери будут безусловно критичны.
Детектирование объектов в приложении выполняется в отдельном потоке. Выполняется это объектом класса NewThread.
Процесс проговаривания (озвучивания) запускается автоматически из нейронной сети при обнаружении объекта, определенного пользователем в настройках. Проговаривание имен объектов, найденных DNN, выполняется в программе по мере готовности модуля голосовых данных, о чем сигнализирует соответствующий флаг. Сам процесс озвучивания может продолжаться несколько секунд, а длительность его зависит от числа обнаруженных объектов. Понятно, что процессы озвучивания и детектирования объектов занимают совершенно разные времена. Во время проговаривания, детектирование будет работать штатно, выделяя объекты на экране красной рамкой, но эти кадры будут потеряны для озвучивания, если не завершится текущий процесс озвучивания, то есть не будет готовности флага проговаривания.
Процесс создания снимка экрана и его отсылки запускается автоматически из нейронной сети при обнаружении объекта, определенного пользователем в настройках. Этот процесс выполняется по мере готовности модуля SMTP и работает в отдельном потоке относительно потока детектирования объектов. Процесс детектирования объектов при этом не прерывается. Техника взаимодействия между потоком DNN и потоком создания скрина и его отсылки похожа на описанную выше.
3. Состав используемых программ.
Для озвучивания имен классов, обнаруженных нейронной сетью, используется программа Speak, входящая в состав примеров QT Creator. Speak имеет GUI интерфейс и может быть запущена как из С++ кода, так и из меню приложения. Исходный код находится в файлах speak.h, speak.cpp, speak.ui. Внешний вид программы приведен на рис. 1.
Рис. 1
Для отправки сообщений по SMTP со вложенными файлами скринов использован почтовый клиент. Клиент не имеет GUI интерфейса и запускается из кода приложения. Интерфейс пользователя может быть при необходимости дописан. Клиент находится в каталоге libSMTP. Спасибо автору разработки.
Методика взаимодействия между OpenCV и DNN yolov, элементы дизайна в приложении основаны на примерах, опубликованых в книге Qt 5 and OpenCV 4 Computer Vision автора Zhuo Qingliang. В тексты классов внесены изменения и дополнения с целью реализации новых задач. Рекомендую данную книгу.
Связи между обнаруженными объектами и действиями реализованы в классе формы SelectName. Класс написан с нуля. Внешний вид приложения с формой, устанавливающей связи между объектами и действиями приведен на рис. 2.
Рис. 2
По этой ссылке можно найти файл конфигурации модели а по этой - предварительно обученные веса модели.
Полное описание программы предоставляется платно в файлах pdf или odt.
Проект можно загрузить.
Евгений Вересов.
10.01.2021 года.