如何使用 Python、OpenCV 和 InfluxDB 控制人群

导航至

正如我不久前提到的,我正在学习用 Python 开发;它似乎是一种非常容易理解的语言,到目前为止,在尝试用它做事情时,我还没有遇到过“不”。我很高兴,并且会继续学习。

在这个学习过程中,我开始使用 OpenCV(开源计算机视觉库)来检测人脸。OpenCV 是一个开源的、BSD 许可的库,包含数百种计算机视觉算法。我很快就理解了所有工作原理,并开始思考 InfluxDB 时序用例以及如何集成其他技术。

从那次搜索中,我产生了将 OpenCV 与 InfluxDB 集成的想法,以统计它检测到人脸的次数。我认为,时序和生物识别技术非常契合,开启了众多应用,包括但不限于以下应用:

  • 记录一天中特定时刻通过商店特定入口点的人数
  • 记录通过某条大街的汽车或其他车辆的数量。
  • 统计有多少人停下来观看特定类型的产品,以了解它是否对他们有吸引力
  • 衡量零售和酒店场所的客户转化率,例如比较走进餐厅的顾客与售出的餐盘数量
  • 监视限定空间和时间内的人群(资源分配、交通信号灯管理、基础设施改进等)

考虑到我们所处的全球背景,最后一点非常重要。在疫情时代,控制人群以确保公共安全对全球执法机构来说一直是一个挑战。

让我们看一些代码...

该项目的代码可以在这个 GitHub 存储库中找到。相关文件有

  • live.py
  • influxdb_config.ini
  • haarcascade_frontalface_default.xml

文件 live.py 如下所示。如果需要修改,唯一要修改的是存储桶的名称,以匹配我们在 InfluxDB 中创建的存储桶。

# This script will detect faces via your webcam and push the data to an InfluxDB instance.
# By Ignacio Van Droogenbroeck @hectorivand
 
import cv2
 
from datetime import datetime
 
from influxdb_client import Point, InfluxDBClient
from influxdb_client.client.write_api import SYNCHRONOUS
 
# Specify the InfluxDB bucket
 
bucket = "crowd-counter"
 
# In this file, you must set the parameters to connect to InfluxDB.
 
client = InfluxDBClient.from_config_file('influxdb_config.ini')
 
write_api = client.write_api(write_options=SYNCHRONOUS)
query_api = client.query_api()
 
cap = cv2.VideoCapture(0)
 
# Create the haar cascade
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
 
while(True):
	# Capture frame-by-frame
	ret, frame = cap.read()
 
	# Our operations on the frame come here
	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
	# Detect faces in the image
	faces = faceCascade.detectMultiScale(
		gray,
		scaleFactor=1.2,
		minNeighbors=5,
		minSize=(30, 100)
	)
 
	# Write the quantity of faces detected on InfluxDB
 
	p = Point("public-count").tag("cameras", "entry").field("people", '{0}'.format(len(faces)))
	write_api.write(bucket=bucket, record=p)
 
	# Draw a rectangle around the faces
	for (x, y, w, h) in faces:
		cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
 
	# Display the resulting frame
	cv2.imshow('frame', frame)
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
 
# When everything is done, release the capture
cap.release()
cv2.destroyAllWindows()

另一个要修改的文件是 influxdb_config.ini。此文件包含连接到 InfluxDB 的数据。如您所见,您需要定义连接到 InfluxDB 的值。

[influx2]
url=$INFLUX_URL
org=$INFLUX_ORG
token=$INFLUX_TOKEN
timeout=6000
verify_ssl=True

如果您没有正在运行的 InfluxDB OSS 实例,我建议您创建一个 InfluxDB Cloud 帐户(InfluxDB Cloud 是 InfluxDB 的托管、弹性、无服务器版本)。免费层足以进行一些测试。如果您已决定在生产环境中使用此解决方案,则可以保留您的 Cloud 帐户。

最后一个重要的文件是 haarcascade_frontalface_default.xml。此文件提供了检测人脸的模型。在 OpenCV:级联分类器 教程中,我建议阅读有关 haarcascade 的内容,以及为什么它是检测对象而无需训练 TensorFlow 模型的绝佳选择。

现在我们已经完成了所有设置,让我们运行代码。

让我们数数人脸...

一旦此脚本运行,如果您运行 live.py 脚本,它将激活您的网络摄像头以开始计数人脸并将该数据发送到 InfluxDB。

facial detection using python opencv influxdb

如您所见,这种人脸检测方法并不复杂。它可以用于控制高速公路或大街上的交通流量。

vehicle detection using influxdb and python

好吧,您可能会想——一切都很美好,您有一张漂亮的脸,汽车看起来也不错,但请告诉我如何使用这项技术控制人群。说得有道理!让我用这张截图回复您的评论。

crowd detection solution opencv, influxdb, python

在本例中,脚本检测到 110 张人脸并将该数据发送到 InfluxDB。想象一下,这个例子在公园、餐厅或集市中的多个设备上运行。

您可能会注意到,我使用了视频,因为,嗯,我家没有人群!但是输出将是相同的;在这种情况下,唯一的区别是数据的输入(视频与实时馈送)。

结论

这个软件解决方案并不完美;它是我学习之路的一部分。如果您发现任何问题,我鼓励您 fork 并提出 GitHub 存储库 中的改进建议。

我希望这篇文章为您提供了一个部署 InfluxDB 的全新用例。