(Компьютерное зрение – применение CascadeClassifier и OpenCV)
COVID-19 познакомил нас с такими терминами, как «социальное дистанцирование» и «физическое дистанцирование».
Компьютерное зрение предоставляет огромные возможности для изучения применения алгоритмов обнаружения объектов в этой области. Вот приложение «классификатора HaarCascade» и «OpenCV» для разработки алгоритма обнаружения нарушений физического дистанцирования.
Открыть резюме
OpenCV расшифровывается как «Библиотека компьютерного зрения с открытым исходным кодом».
«Это библиотека программного обеспечения для компьютерного зрения и машинного обучения с открытым исходным кодом. OpenCV был создан, чтобы обеспечить общую инфраструктуру для приложений компьютерного зрения и ускорить использование машинного восприятия в коммерческих продуктах».
Источник-opencv.org/about/
Классификатор HaarCascade
Это алгоритм обнаружения объектов для определения особенностей человеческого лица, глаз (левого или правого), верхней части тела, нижней части тела, всего тела, лица спереди и т. д.
Исследовательская работа «Быстрое обнаружение объектов с использованием усиленного каскада простых функций», написанная П. Виолой и М. Джонсом и опубликованная в 2001 году, описывает подход машинного обучения к визуальному обнаружению объектов, способный чрезвычайно быстро обрабатывать изображения и достигать высоких показателей обнаружения.
Источник — https://ieeexplore.ieee.org/document/990517
Методология: Детектор нарушений социального дистанцирования
Вот пошаговая процедура выявления и подсчета нарушений. Вы можете обратиться к репозиторию GitHub для получения более подробной информации.
1) Загрузите видео с помощью cv2.VideoCapture
2) Захватите несколько кадров из этого видео, используя cap.read()
3) OpenCV читает изображение в BGR, а для CascadeClassifier нам нужно преобразовать его в серый, используя cv2.cvtColor
4) Передайте кадры шкалы серого в CascadeClassifier.
4.1) Масштабный коэффициент 1,2 означает, что размер изображения уменьшается на 20% при каждом масштабе изображения.
4.2) minNeighbors, равное 1, означает, сколько соседей должен иметь каждый прямоугольник-кандидат.
5) Для сделанных обнаружений мы затем сохраним соответствующие координаты в списке как координаты. Это дает местоположение людей, обнаруженных в кадрах
6) Перебрать обнаруженные объекты и рассчитать расстояние между ними. Это сохраняется как «расстояние»
7) «Social_distance_threshold» — это минимальное расстояние в пикселях, ниже которого нарушения помечаются.
8) Если «dist» «Social_distance_threshold», то мы сохраняем цвет ограничивающей рамки желтым, иначе он будет выделен красным.
9) На следующих шагах мы создаем счетчик в верхнем левом углу видео, который перебирает кадры и подсчитывает количество обнаруженных людей и нарушений в одном кадре.
10) Перейдите по ссылке https://docs.opencv.org/4.x/dc/da5/tutorial_py_drawing_functions.html, чтобы увидеть приложения для рисования прямоугольников или других фигур на изображении с использованием cv2.
11) cv2.VideoWriter_fourcc экспортирует вывод в виде видео.
Сведения о коде:
Для получения дополнительной информации см. репозиторий ниже.
https://github.com/AshishPandey88/Social-Distancing-Detector
import numpy as np import cv2 import matplotlib.pyplot as plt %matplotlib inline People_classifier = cv2.CascadeClassifier('haarcascades/haarcascade_fullbody.xml') #We will go ahead and make additions to the above code to make detections cap=cv2.VideoCapture('pedestrian2.mp4') while cap.isOpened(): ret,frame=cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Pass frame to our classifier people = People_classifier.detectMultiScale(gray, 1.2, 1) #for (x,y,w,h) in people: # cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 255), 2) Social_distance_threshold=150 coordinates=[] for i in range(len(people)): coordinates.append([people[i][0],people[i][1]]) dist=[] for i in people: for j in people: dist.append([i,j,((i[1]-j[1])**2 + (i[0]-j[0])**2)**(0.5)]) for i in range(len(dist)): if dist[i][2]>0 and dist[i][2]<Social_distance_threshold : cv2.rectangle(frame, (dist[i][1][0], dist[i][1][1]), (dist[i][1][0]+dist[i][1][2], dist[i][1][1]+dist[i][1][3]), (0, 0, 255), 2) cv2.rectangle(frame, (dist[i][0][0], dist[i][0][1]), (dist[i][0][0]+dist[i][0][2], dist[i][0][1]+dist[i][0][3]), (0, 0, 255), 2) else: cv2.rectangle(frame, (dist[i][1][0], dist[i][1][1]), (dist[i][1][0]+dist[i][1][2], dist[i][1][1]+dist[i][1][3]), (0, 255, 255), 2) #Setup status box cv2.rectangle(frame, (0,0), (360,120), (0,255,255), -1) # People-Detected data cv2.putText(frame, 'People-Detected', (20,50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1, cv2.LINE_AA) cv2.putText(frame, str(len(people)), (300,60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 2, cv2.LINE_AA) violations=[] for i in range(len(dist)): if dist[i][2]<Social_distance_threshold and dist[i][2]>0: violations.append(dist) cv2.putText(frame, 'Social distancing-Violations', (20,100), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 1, cv2.LINE_AA) cv2.putText(frame, str(round(len(violations)**0.5)),(300,100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2, cv2.LINE_AA) #for i in range(len(dist)): # cv2.putText(frame, str(len(dist[dist[i][2]<200])),(300,90),cv2.FONT_HERSHEY_SIMPLEX, 2, (255,255,255), 2, cv2.LINE_AA) fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('Social_distancing.avi', fourcc , 20.0, (640,480)) out.write(frame) cv2.imshow('Social distancing', frame) if cv2.waitKey(10)& 0xFF==ord('q'): break cap.release() cv2.destroyAllWindows()
Отказ от ответственности: взгляды или мнения, выраженные в этой статье, принадлежат исключительно автору.