(Компьютерное зрение – применение 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()

Отказ от ответственности: взгляды или мнения, выраженные в этой статье, принадлежат исключительно автору.