如何使用 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 的一个托管、弹性、无服务器版本)。免费层级足以进行一些测试。如果您决定在生产环境中使用此解决方案,您可以保留您的云账户。

最后一个重要的文件是haarcascade_frontalface_default.xml。此文件提供了用于检测人脸的模型。在OpenCV: Cascade Classifier教程中,我建议阅读关于 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。想象一下,这个例子在公园、餐厅或集市上运行多个设备。

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

结论

这个软件解决方案并不完美;它是我的学习路径的一部分。如果您发现了一些问题,我鼓励您在GitHub 仓库中进行分叉并提出改进建议。

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