- Необходимые компоненты
- ЙОЛО
- Установка OpenCV в Raspberry Pi
- Установка других необходимых пакетов в Raspberry Pi
- Пояснение к программе
- Тестирование проекта детектора социальной дистанции
Во времена Covid-19 социальное дистанцирование является эффективным способом замедлить передачу инфекционного вируса. Людям рекомендуется свести к минимуму контакты друг с другом, чтобы свести к минимуму риск передачи болезни при прямом контакте. Поддержание безопасного расстояния является проблемой для многих мест, таких как фабрики, банки, автобусы, железнодорожные станции и т. Д.
Итак, в продолжение наших предыдущих проектов безопасности Corona, таких как автоматическая дезинфицирующая машина и бесконтактный мониторинг температуры, здесь мы собираемся создать систему детектора социального дистанцирования с использованием OpenCV и Raspberry Pi. Мы будем использовать веса алгоритма обнаружения объектов YOLO v3 с модулем глубокой нейронной сети.
Raspberry Pi всегда является хорошим выбором для проектов обработки изображений, поскольку у него больше памяти и скорости, чем у других контроллеров. Ранее мы использовали Raspberry Pi для некоторых сложных проектов по обработке изображений, таких как определение ориентиров на лице и приложение для распознавания лиц.
Необходимые компоненты
- Raspberry Pi 4
Здесь нам понадобится только RPi 4 с установленным OpenCV. OpenCV используется здесь для обработки цифровых изображений. Наиболее распространенными приложениями цифровой обработки изображений являются обнаружение объектов, распознавание лиц и счетчик посетителей.
ЙОЛО
YOLO (You Only Look Once) - это интеллектуальная сверточная нейронная сеть (CNN) для обнаружения объектов в реальном времени. YOLOv3, последний вариант алгоритма обнаружения объектов, YOLO может распознавать 80 различных объектов на изображениях и видео, и это очень быстро и имеет отличную точность. Алгоритм применяет одну нейронную сеть ко всему изображению, затем разделяет изображение на области и вычисляет граничные рамки и вероятности для каждой области. Базовая модель YOLO может обрабатывать изображения в реальном времени со скоростью 45 кадров в секунду. Модель YOLO превосходит все другие методы обнаружения, такие как SSD и R-CNN.
Модель YOLOV3, которую мы собираемся использовать в этом проекте, можно скачать здесь.
Установка OpenCV в Raspberry Pi
Перед установкой OpenCV и других зависимостей Raspberry Pi необходимо полностью обновить. Используйте следующие команды, чтобы обновить Raspberry Pi до последней версии:
sudo apt-get update
Затем используйте следующие команды, чтобы установить необходимые зависимости для установки OpenCV на Raspberry Pi.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
Наконец, установите OpenCV на Raspberry Pi, используя следующие команды.
pip3 установить opencv-contrib-python == 4.1.0.25
Если вы новичок в OpenCV, ознакомьтесь с нашими предыдущими руководствами по OpenCV с Raspberry pi:
- Установка OpenCV на Raspberry Pi с помощью CMake
- Распознавание лиц в реальном времени с помощью Raspberry Pi и OpenCV
- Распознавание номерных знаков с использованием Raspberry Pi и OpenCV
- Оценка размера толпы с использованием OpenCV и Raspberry Pi
Мы также создали серию руководств по OpenCV, начиная с начального уровня.
Установка других необходимых пакетов в Raspberry Pi
Прежде чем программировать Raspberry Pi для детектора социальной дистанции, давайте установим остальные необходимые пакеты.
Установка imutils: imutils используется для упрощения основных функций обработки изображений, таких как перевод, поворот, изменение размера, скелетонизация и отображение изображений Matplotlib с помощью OpenCV. Используйте команду ниже для установки imutils:
pip3 установить imutils
Пояснение к программе
Полный код приведен в конце страницы. Здесь мы объясняем важные разделы кода для лучшего объяснения.
Итак, в начале кода импортируйте все необходимые библиотеки, которые будут использоваться в этом проекте.
import numpy as np import cv2 import imutils import os import time
Функция Check () используется для расчета расстояния между двумя объектами или двумя точками в кадре видео. Точки a и b обозначают два объекта в кадре. Эти две точки используются для расчета евклидова расстояния между объектами.
def Проверка (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 калибровки = (a + b) / 2, если 0 <dist <0,25 * калибровка: вернуть True else: вернуть False
Функция настройки используется для установки путей для весов YOLO, файла cfg, файла имен COCO. Модуль os.path используется для управления обычными путями. Модуль os.path.join () является подмодулем os.path и используется для интеллектуального соединения одного или нескольких компонентов пути. Метод cv2.dnn.readNetFromDarknet () используется для загрузки сохраненных весов в сеть. После загрузки весов извлеките список всех слоев, используемых в сети, с помощью модели net.getLayerNames .
def Setup (yolo): global neural_net, ln, LABELS weights = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, weights) ln = neural_net.getLayerNames () ln = - 1] для i в neural_net.getUnconnectedOutLayers ()]
Внутри функции обработки изображений мы берем один кадр видео, а затем обрабатываем его для обнаружения социального дистанцирования между каждым человеком в толпе. В первых двух строках функции мы изначально устанавливаем размеры видеокадра (W, H) как (None, None). В следующей строке мы использовали метод cv2.dnn.blobFromImage () для загрузки кадров в пакете и прогона их по сети. Функция blob выполняет вычитание среднего значения, масштабирование и замену каналов в кадре.
(H, W) = (None, None) frame = image.copy (), если W равно None или H равно None: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Выходные данные слоя из YOLO состоят из набора значений. Эти значения помогают нам определить, какой объект принадлежит какому классу . Мы перебираем каждый вывод в layerOutputs и по мере обнаружения людей устанавливаем метку класса как «person». Из каждого обнаружения мы получаем ограничивающую рамку, которая дает нам центр X, центр Y, ширину и высоту рамки для обнаружения на выходе:
оценки = обнаружение maxi_class = np.argmax (баллы) уверенность = баллы, если МЕТКИ == "человек": если достоверность> 0,5: box = обнаружение * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX - (ширина / 2)) y = int (centerY - (height / 2)) outline.append () Confidences.append (float (уверенность))
После этого рассчитайте расстояние между центром текущего бокса и всеми остальными обнаруженными боксами. Если ограничивающие рамки закрыты, измените статус на true.
for i in range (len (center)): for j in range (len (center)): close = Check (center, center) if close: pair.append (, center]) status = True status = True index = 0
В следующих строках нарисуйте прямоугольник вокруг человека, используя размеры коробки, которые мы получили от модели, а затем проверьте, является ли коробка безопасным или небезопасным. Если расстояние между прямоугольниками близко, то цвет прямоугольника будет красным, иначе прямоугольник будет зеленым.
(x, y) = (схема, схема) (w, h) = (схема, схема), если status == True: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) elif status == False: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Теперь внутри функции цикла мы читаем каждый кадр видео, а затем обрабатываем каждый кадр, чтобы вычислить расстояние между людьми.
ret, frame = cap.read (), если не ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 или frameno == 1): Setup (yolo) ImageProcess (current_img) Frame = processingImg
В следующих строках используйте функцию cv2.VideoWriter () для сохранения выходного видео в месте, указанном opname, которое мы определили ранее.
если create равно None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Тестирование проекта детектора социальной дистанции
Когда ваш код будет готов, откройте терминал Pi и перейдите в каталог проекта. Код, модель Yolo и демонстрационное видео должны находиться в одной папке, как показано ниже.
Вы можете скачать каталог YoloV3 отсюда, видео с Pexels и скопировать код Python, указанный ниже, и поместить их в тот же каталог, что и показано выше.
Как только вы окажетесь в каталоге проекта, выполните следующую команду, чтобы запустить код:
Python3 Detector.py
Я пробовал этот код на видео-примере, полученном от Pexels. Для меня FPS был очень медленным, и на обработку всего видео ушло от 10 до 11 минут.
Вместо использования видео вы даже можете протестировать этот код с помощью камеры Raspberry Pi, заменив cv2.VideoCapture (input) на cv2.VideoCapture (0) в 98- й строке кода. Узнайте больше об использовании PiCamera с Raspberry Pi, перейдя по ссылке.
Вот как вы можете использовать OpenCV с Raspberry Pi для обнаружения нарушений социального дистанцирования. Выходное видео и код приведены ниже: