在Covid-19时代,社交隔离是减慢传染性病毒传播的有效方法。建议人们尽量减少彼此之间的接触,以最大程度地减少通过直接接触传播疾病的风险。对于工厂,银行,公共汽车或火车站等许多地方来说,保持安全距离是一个挑战。
因此,在继续我们之前的Corona安全项目(例如自动消毒机和非接触式温度监控)之后,我们将使用OpenCV和Raspberry Pi构建社交距离检测器系统。我们将通过深度神经网络模块使用YOLO v3对象检测算法的权重。
Raspberry Pi始终是图像处理项目的理想选择,因为它比其他控制器具有更多的内存和速度。我们以前使用Raspberry Pi进行一些复杂的图像处理项目,例如面部标志检测和面部识别应用程序。
所需组件
- 树莓派4
在这里,我们只需要安装了OpenCV的RPi 4。OpenCV在这里用于数字图像处理。数字图像处理的最常见应用是对象检测,面部识别和人物计数器。
YOLO
YOLO(您只看一次)是用于实时对象检测的智能卷积神经网络(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安装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编程之前,让我们安装其他必需的软件包。
安装imutils: imutils用于通过OpenCV使基本的图像处理功能(例如平移,旋转,调整大小,框架化和显示Matplotlib图像)更容易。使用以下命令安装imutils:
pip3安装imutils
程序说明
完整的代码在页面末尾给出。在这里,我们正在解释代码的重要部分,以进行更好的解释。
因此,在代码开始时,导入将在此项目中使用的所有必需库。
导入numpy as np导入cv2导入imutils导入os导入时间
的 检查() 函数用于计算在视频的一帧的两个对象或两个点之间的距离。点a和b表示框架中的两个对象。这两个点用于计算对象之间的欧几里得距离。
def Check(a,b):dist =((a-b)** 2 + 550 /((a + b)/ 2)*(a-b)** 2)** 0.5校准=(a + b )/ 2如果0 <dist <0.25 *校准:返回True否则:返回False
设置功能用于设置YOLO重量,cfg文件,COCO名称文件的路径。 os.path 模块用于常见的路径名操作。 os.path.join() 模块是 os.path 的子模块,用于智能地连接一个或多个路径组件。 cv2.dnn.readNetFromDarknet() 方法用于将保存的权重加载到网络中。加载权重后,使用 net.getLayerNames 模型提取网络中使用的所有图层的列表。
def设置(yolo):全局Neuro_net,ln,LABELS权重= os.path.sep.join()config = os.path.sep.join()labelsPath = os.path.sep.join()LABELS = open(labelsPath ).read()。strip()。split(“ \ n”)Neuro_net = cv2.dnn.readNetFromDarknet(config,weights)ln = neuro_net.getLayerNames()ln =-1] for in in Neuro_net.getUnconnectedOutLayers()]
在图像处理功能内部,我们拍摄一帧视频,然后对其进行处理以检测每个人群之间的社会距离。在函数的前两行中,我们最初将视频帧的尺寸(W,H)设置为(None,None)。在下一行中,我们使用 cv2.dnn.blobFromImage() 方法批量加载帧并通过网络运行它们。Blob函数对一帧执行均值减, 缩放和通道交换。
(H,W)=(无,无)如果W为None或H为None,frame = image.copy():(H,W)= frame.shape blob = cv2.dnn.blobFromImage(frame,1 / 255.0, (416,416),swapRB = True,作物= False)Neuro_net.setInput(blob)开始时间= time.time()层输出= Neuro_net.forward(ln)
YOLO的图层输出由一组值组成。这些值有助于我们定义哪个 对象 属于哪个 类 。我们遍历 layerOutputs中的 每个输出,并在检测人员时,将类标签设置为“人员”。从每个检测中,我们得到一个边界框,该边界框为我们提供了X中心,Y中心,宽度和高度,以便在输出中进行检测:
分数=检测maxi_class = np.argmax(分数)置信度=如果LABELS ==“ person”则得分:如果置信度> 0.5:box =检测* np.array()(centerX,centerY,宽度,高度)= box.astype( “ int”)x = int(centerX-(width / 2))y = int(centerY-(height / 2))outline.append()confidence.append(float(confidence))
之后,计算当前框的中心与所有其他检测到的框之间的距离。如果边界框关闭,则将状态更改为true。
对于i在范围内(len(中心)):对于j在范围内(len(中心)):close =检查(中心,中心)是否关闭:pairs.append(,center])status =真实状态=真实索引= 0
在接下来的几行中,使用从模型中收到的盒子尺寸在人周围绘制一个矩形,然后检查盒子是否安全。如果框之间的距离很近,则框颜色将变为红色,否则框将变为绿色。
(x,y)=(轮廓,轮廓)(w,h)=(轮廓,轮廓)如果状态==真: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()(如果没有返回):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 =已处理Img
在接下来的 几 行中,使用 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代码,然后将它们放在与上图相同的目录中。
进入项目目录后,执行以下命令以启动代码:
python3detector.py
我在从Pexels获得的视频示例中尝试了此代码。对我而言,FPS非常慢,大约需要10到11分钟才能处理整个视频。
代替使用视频,则可以甚至通过更换测试此代码与树莓裨相机 cv2.VideoCapture(输入) 与 cv2.VideoCapture(0) 在98个代码的行。通过以下链接了解有关将PiCamera与Raspberry Pi结合使用的更多信息。
这是将OpenCV与Raspberry Pi一起使用的方法,可以检测到社交距离冲突。输出的视频和代码如下: