Python: распознавание объектов в реальном времени

25
44092
Добавить в избранное

В этой статье мы будем разбирать код программы, в которой используется Deep Learning и OpenCV. Её суть: распознавание объектов в реальном времени.

Содержание статьи:

Этот пост разделён на две части. В первой части мы рассмотрим реализацию распознавания объектов в реальном времени, используем deep-learning и OpenCV, чтобы работать с видео потоками и видеофайлами. В этом нам поможет высокоэффективный класс VideoStream, подробнее о нём читайте здесь.

Оттуда мы возьмём Deep Learning, код для обнаружения объекта и код для измерения FPS.

Часть 1: распознавание объектов в реальном времени — работаем с кодом

Чтобы сделать детектор объектов в реальном времени, нам потребуется:

  1. Получить доступ к нашей веб-камере/видео потоку.
  2. Применить распознавание объекта для каждого кадра.

Чтобы посмотреть, как это делается, откройте новый файл, назовите его real_time_object_detection.py и вставьте следующий код:

Мы начали с импортирования библиотек (на строках 2-8). Для этого вам необходим imutils и OpenCV.

Пишем код для работы с командной строкой.

Далее анализируем аргументы командной строки:

  • —prototxt : Путь к prototxt Caffe файлу.
  • —model : Путь к предварительно подготовленной модели.
  • —confidence : Минимальный порог валидности (сходства) для распознавания объекта (значение по умолчанию — 20%).

Добавляем основные объекты.

Затем мы инициализируем список классов и набор цветов:

На строках 22-26 мы инициализируем метки CLASS и соответствующие случайные цвета.

Теперь загрузим модель и настроим наш видео поток:

Загружаем нашу сериализованную модель, предоставляя ссылки на prototxt и модели (строка 30) — обратите внимание, насколько это просто в OpenCV.

Затем инициализируем видео поток (это может быть видеофайл или веб-камера). Сначала запускаем VideoStream (строка 35), затем мы ждём, пока камера включится (строка 36), и, наконец, начинаем отсчёт кадров в секунду (строка 37). Классы VideoStream и FPS являются частью пакета imutils.

Пишем код для работы с кадрами.

Теперь проходим по каждому кадру (чтобы увеличить скорость, можно пропускать кадры).

Первое, что мы делаем — считываем кадр (строка 43) из потока, затем заменяем его размер (строка 44).

Поскольку чуть позже нам понадобится ширина и высота, получим их сейчас (строка 47). Затем следует преобразование кадра в blob с модулем dnn (строки 48 и 49).

Теперь к сложному: мы устанавливаем blob как входные данные в нашу нейросеть (строка 53) и передаём эти данные через net (строка 54), которая обнаруживает наши предметы.

«Фильтруем» объекты.

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

Мы начинаем проходить циклами через наши detections, помня, что несколько объектов могут быть восприняты как единое изображение. Мы также делаем проверку на валидность (т.е. вероятность) для каждого обнаружения. Если валидность достаточно велика (т.е. выше заданного порога), отображаем предсказание в терминале, а также рисуем на видео потоке предсказание (обводим объект в цветной прямоугольник и вешаем лейбл).

Давайте разберём по строчкам:

Проходим по detections, получаем значение валидности (строка 60).

Если значение валидности выше заданного порога (строка 64), извлекаем индекс лейбла в классе (строка 68) и высчитываем координаты рамки вокруг обнаруженного объекта (строка 69).

Затем, извлекаем (x;y)-координаты рамки (строка 70), которые будем использовать для отображения прямоугольника и текста.

Делаем текстовый лейбл, содержащую имя из CLASS и значение валидности (строки 73 и 74).

Также, рисуем цветной прямоугольник вокруг объекта, используя цвета класса и раннее извлечённые (x;y)-координаты (строки 75 и 76).

В целом, нужно, чтобы лейбл располагался над цветным прямоугольником, однако, может возникнуть такая ситуация, что сверху будет недостаточно места, поэтому в таких случаях выводим лейбл под верхней стороной прямоугольника (строка 77).

Наконец, мы накладываем цветной текст и рамку на кадр, используя значение ‘y’, которое мы только что вычислили (строки 78 и 79).

Оставшиеся задачи:

  1. Отображение кадра
  2. Проверка ключа выхода
  3. Обновление счётчика FPS

Код вверху довольно очевиден: во-первых, выводим кадр (строка 82). Затем фиксируем нажатие клавиши (строка 83), проверяя, не нажата ли клавиша «q» (quit). Если условие истинно, мы выходим из цикла (строки 86 и 87).

Наконец, обновляем наш счётчик FPS (строка 90).

Если происходит выход из цикла (нажатие клавиши «q» или конец видео потока), у нас есть вещи, о которых следует позаботиться:

При выходе из цикла, останавливаем счётчик FPS (строка 92) и выводим информацию о конечном значении FPS в терминал (строки 93 и 94).

Закрываем окно программы (строка 97), прекращая видео поток (строка 98).

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

Часть 2: тестируем распознавание объектов в реальном времени на веб-камере

Чтобы увидеть детектор объектов в реальном времени в действии, убедитесь, что вы скачали исходники и предварительно подготовленную Convolutional Neural Network.

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

При условии, что OpenCV может получить доступ к вашей веб-камере, вы должны увидеть выходной кадр с любыми обнаруженными объектами. Я привёл примеры результатов в видео ниже:

Заметьте, что распознаватель объектов может обнаруживать не только меня (человека), но и диван, на котором я сижу и стул рядом со мной. И всё это в реальном времени.

Код здесь

Оригинал здесь

Интересуетесь программированием на Python?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Комментариев: 25

  1. Возможно ли брать видео-поток не с вебки, а с экрана в данном случае?

    1. Да, конечно, это такой же поток. Есть, например, такие варианты https://stackoverflow.com/questions/35097837/capture-video-data-from-screen-in-python

  2. Где скачать исходники и предварительно подготовленную Convolutional Neural Network?

  3. Заранее спасибо за ответы!
    Вопросы:
    1) заведется ли все это под windows7? Бегло пробежался — вроде должно, но лучше спрошу)
    2) заведется ли это под raspberry pi? Интересует как usb-камера, так и через оцифровывание av-сигнала через usb-конвертеры.
    3) модели, которые используются для распознавания (допфайлы) — где о них почитать? Как создавать свои?

    1. разобрался
      работает нормально если detections вынести в отдельный поток, под виндой поставить 2.7 и прочее ничего сложного
      ставим pip и через него уже все что нужно

      1. А как на счет raspberry pi: хватит ли вычислительных ресурсов на реалтайм распознавание?

        1. Nikolay Matsievsky

          если у вас картинка не более 640ч480, то да. На Rpi 4 ядра 1,2 Ghz. Как вариант, можно брать 1 кадр в секунду — и его анализировать. Rpi тянет motion detection 4 камер на 1 кадр в 10 секунд, картинка 1920×1080 — но это примерно предел.

  4. надо в самом файле прописать путь или в командной строке?

  5. перешел в директорию где лежит .py фаил и оттуда запустил

  6. D:\real-time-object-detection>python real_time_object_detection.py\—prototxt MobileNetSSD_deploy.prototxt.txt \—model MobileNetSSD_deploy.caffemodel
    python: can’t open file ‘real_time_object_detection.py\—prototxt’: [Errno 2] No such file or directory

    D:\real-time-object-detection>
    не могу разобраться в чем проблема. все попробовал помогите

    1. Вы выставили путь в соответствии со своими адресами или просто их скопировали?

  7. Здравствуйте, помогите с ошибкой пожалуйста!

    [INFO] loading model…
    Traceback (most recent call last):
    File «real_time_object_detection.py», line 33, in
    net = cv2.dnn.readNetFromCaffe(args[«prototxt»], args[«model»])
    AttributeError: module ‘cv2’ has no attribute ‘dnn’

    1. У вас могут быть проблемы с библиотеками из-за версии самого Python. Если вы используете 2.x, попробуйте перейти на 3.x, желательно на 3.6

  8. Помогите, пожалуйста, с ошибкой:
    usage: real_time_object_detection.py [-h] -p PROTOTXT -m MODEL [-c CONFIDENCE]
    real_time_object_detection.py: error: argument -p/—prototxt is required

    Являюсь новичком в питоне и затрудняюсь решить.
    Спасибо.

    1. Здравствуйте!

      Столкнулся с такой же проблемой.
      Как Вам удалось ее решить?
      Заранее спасибо за ответы.

      1. Разобрался.
        У автора оригинальной статьи есть удобный туториал с примером.

    2. Если вы имеете в виду ошибку в командной строке (терминале), то вы просто не указываете путь к proto.txt. Или ошибка в коде?

      1. Уже решил ту, сейчас ругается на prototxt:
        python real_time_object_detection.py
        —prototxt MobileNetSSD_deploy.prototxt.txt
        —model MobileNetSSD_deploy.caffemodel —source webcam
        SyntaxError: invalid syntax

        1. Проверьте, правильно ли написание. Что касается терминала, добавили фрагмент в виде кода, а не картинки, чтобы было проще (код в конце):
          $ python real_time_object_detection.py \

          1. Напишите в Телеграм автору: @ohmaigawd

          2. Не могли бы вы оставить какие-то контактные данные?
            Заранее спасибо

  9. как добавить статью в избранное, чтобы почитать в свободное удобное время?

Добавить комментарий