Covid-19 시대에 Social-distancing은 감염성 바이러스의 전파를 늦추는 효과적인 방법입니다. 사람들은 직접적인 접촉을 통해 전염되는 질병의 위험을 최소화하기 위해 서로의 접촉을 최소화하는 것이 좋습니다. 안전한 거리를 유지하는 것은 공장, 은행, 버스 또는 기차역 등과 같은 많은 장소에서 어려운 일입니다.
따라서 자동 살균기 및 비접촉식 온도 모니터링과 같은 이전 코로나 안전 프로젝트를 계속 진행하면서 OpenCV 및 Raspberry Pi를 사용하여 사회적 거리 탐지기 시스템 을 구축 할 것 입니다. 우리는 Deep Neural Network 모듈과 함께 YOLO v3 Object Detection Algorithm의 가중치를 사용할 것입니다.
Raspberry Pi는 다른 컨트롤러보다 더 많은 메모리와 속도를 가지고 있기 때문에 이미지 처리 프로젝트에 항상 좋은 선택입니다. 이전에는 얼굴 랜드 마크 감지 및 얼굴 인식 응용 프로그램과 같은 복잡한 이미지 처리 프로젝트에 Raspberry Pi를 사용했습니다.
필요한 구성 요소
- 라즈베리 파이 4
여기에서는 OpenCV가 설치된 RPi 4 만 필요합니다. OpenCV는 여기에서 디지털 이미지 처리에 사용됩니다. 디지털 이미지 처리의 가장 일반적인 응용 분야는 물체 감지, 얼굴 인식 및 인원 계수기입니다.
욜로
YOLO (You Only Look Once)는 실시간 객체 감지를위한 스마트 컨볼 루션 신경망 (CNN)입니다. 물체 감지 알고리즘의 최신 변형 인 YOLOv3, YOLO는 이미지와 비디오에서 80 개의 다른 물체를 인식 할 수 있으며, 매우 빠르고 정확성이 뛰어납니다. 알고리즘은 전체 이미지에 단일 신경망을 적용한 다음 이미지를 영역으로 분리하고 각 영역의 경계 상자와 확률을 계산합니다. 기본 YOLO 모델은 초당 45 프레임으로 실시간으로 이미지를 처리 할 수 있습니다. YOLO 모델은 SSD 및 R-CNN과 같은 다른 모든 감지 방법을 능가합니다.
이 프로젝트에서 사용할 YOLOV3 모델은 여기에서 다운로드 할 수 있습니다.
Raspberry Pi에 OpenCV 설치
OpenCV 및 기타 종속성을 설치하기 전에 Raspberry Pi를 완전히 업데이트해야합니다. 아래 명령을 사용하여 Raspberry Pi를 최신 버전으로 업데이트하십시오.
sudo apt-get 업데이트
그런 다음 다음 명령을 사용하여 Raspberry Pi에 OpenCV를 설치하는 데 필요한 종속성을 설치합니다.
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 설치 libqt4-test –y
마지막으로 아래 명령을 사용하여 Raspberry Pi에 OpenCV를 설치합니다.
pip3 install opencv-contrib-python == 4.1.0.25
OpenCV를 처음 사용하는 경우 Raspberry pi로 이전 OpenCV 자습서를 확인하십시오.
- CMake를 사용하여 Raspberry Pi에 OpenCV 설치
- Raspberry Pi 및 OpenCV를 사용한 실시간 얼굴 인식
- Raspberry Pi 및 OpenCV를 사용한 번호판 인식
- OpenCV 및 Raspberry Pi를 사용한 군중 크기 추정
우리는 또한 초급 레벨부터 시작하는 일련의 OpenCV 튜토리얼을 만들었습니다.
Raspberry Pi에 다른 필수 패키지 설치
Raspberry Pi for Social distance detector 를 프로그래밍하기 전에 다른 필수 패키지를 설치하겠습니다.
imutils 설치: imutils는 OpenCV에서 번역, 회전, 크기 조정, 골격 화 및 Matplotlib 이미지 표시와 같은 필수 이미지 처리 기능을 더 쉽게 만드는 데 사용됩니다. 아래 명령을 사용하여 imutils를 설치합니다.
pip3 설치 imutils
프로그램 설명
페이지 끝에 완전한 코드가 제공됩니다. 여기에서는 더 나은 설명을 위해 코드의 중요한 섹션을 설명합니다.
따라서 코드를 시작할 때이 프로젝트에서 사용할 모든 필수 라이브러리를 가져옵니다.
import numpy as np import cv2 import imutils import os import time
체크 () 함수는 비디오 프레임에서 두 개체 또는 두 점 사이의 거리를 계산하는데 사용된다. 점 a 와 b 는 프레임의 두 개체를 나타냅니다. 이 두 점은 물체 사이의 유클리드 거리 를 계산하는 데 사용됩니다.
def Check (a, b): dist = ((a-b) ** 2 + 550 / ((a + b) / 2) * (a-b) ** 2) ** 0.5 보정 = (a + b) / 2 if 0 <dist <0.25 * 보정: True 반환 그렇지 않으면: 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] for i in 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 중심, 너비 및 높이를 제공하는 경계 상자를 얻습니다.
scores = 감지 maxi_class = np.argmax (scores) 신뢰도 = LABELS == "person"인 경우 점수: 신뢰도> 0.5 인 경우: box = 감지 * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX-(너비 / 2)) y = int (centerY-(높이 / 2)) outline.append () Confidents.append (float (confidence))
그 후, 감지 된 다른 모든 상자와 현재 상자의 중심 사이의 거리를 계산합니다. 경계 상자가 닫혀 있으면 상태를 true로 변경하십시오.
for i in range (len (center)): for j in range (len (center)): close = Check (center, center) if close: pairs.append (, center]) status = True status = True index = 0
다음 줄에서는 모델에서받은 상자 치수를 사용하여 사람 주위에 직사각형을 그린 다음 상자가 안전한지 안전하지 않은지 확인합니다. 상자 사이의 거리가 가까우면 상자 색상이 빨간색으로 표시되고 상자는 녹색으로 표시됩니다.
(x, y) = (outline, outline) (w, h) = (outline, outline) if status == True: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) elif 상태 == False: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
이제 루프 기능 내에서 비디오의 모든 프레임을 읽은 다음 각 프레임을 처리하여 사람 사이의 거리를 계산합니다.
ret, frame = cap.read () if not 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 분이 걸렸습니다.
비디오를 사용하는 대신 코드의 98 번째 줄 에서 cv2.VideoCapture (input) 을 cv2.VideoCapture (0) 로 대체하여 Raspberry Pi 카메라로이 코드를 테스트 할 수도 있습니다. 링크를 따라 Raspberry Pi와 함께 PiCamera를 사용하는 방법에 대해 자세히 알아보십시오.
이것이 Raspberry Pi와 함께 OpenCV를 사용하여 사회적 거리두기 위반을 감지하는 방법입니다. 출력 비디오 및 코드는 다음과 같습니다.