首页 > 技术知识 > 正文

上一篇文章AI社交距离检测器:计算被检测人的中心点我们学习了如何计算在视频序列中检测到的人的中心位置。

在本文中,将计算每个对象边界框中心点的位置,并且使用这些中心来估计人与人之间的距离,并指出那些距离太近的人。

接下来,就要将AI模型与计算人们违反社交距离的规则联系起来。

在本文中,我们继续为AI社交距离检测器开发Python控制台应用程序。在学习了如何在图像中检测人的位置后,我们就可以计算出它们之间的距离,并指出哪些人太近了。

如下图所示,如果两个人之间的距离低于一个预定义的阈值,那么这些人将被用红色矩形勾画出来。

AI社交距离检测器:寻找过于接近的人

计算两点之间的距离

我们首先创建一个方法来计算两个人之间的距离。为此,我使用了Euclidean(欧几里德算法)计算了两个包围盒中心之间距离:

def calculate_distance_between_rectangle_centers(rect_center_1, rect_center_2): # Calculate absolute difference between x and y coordinates x_abs_diff = abs(rect_center_1[0] – rect_center_2[0]) y_abs_diff = abs(rect_center_1[1] – rect_center_2[1]) # Calculate Euclidean distance return math.sqrt(x_abs_diff**2 + y_abs_diff**2)

上面的函数是distance_analyzer模块。

找那些太亲近的人

为了找到太近的人,我们需要检查每个人之间的距离。实际上,我们需要执行一个双循环。嵌套for循环中的迭代次数从j=1..N减少到j=i+1..N。这里是一个方法的完整实现,该方法给定检测人员的列表,查找那些太近的人:

def find_people_that_are_too_close(detection_results, distance_threshold): # Prepare results list results = [] # Get rectangle centers rectangle_centers = DistanceAnalyzer.get_rectangle_centers(detection_results # Analyze distance between each object N = len(detection_results) for i in range(N): for j in range(i+1, N): rect_center_1 = rectangle_centers[i] rect_center_2 = rectangle_centers[j] distance = DistanceAnalyzer.calculate_distance_between_rectangle_centers( rect_center_1, rect_center_2) # If distance between objects is too close # append centers to the results list if(distance <= distance_threshold): results.append((detection_results[i][rectangle], detection_results[j][rectangle])) return results
<

该方法接受两个参数:

detection_results-AI返回的被检测人员名单。注意,该列表中的每个元素都包含一个保存检测信任值、边界框和标签的对象。 distance_threshold-指定人们在图像中的距离(以像素为单位)。如果计算出的人与人之间的距离低于此值,则将边框添加到返回的results名单。

给定输入参数,该方法找出包围盒的中心,然后计算它们之间的距离。它返回围绕在太近的人周围的矩形。让我们看看如何在图像中显示这些矩形。

显示谁离得太近

为了表示太近的人,我们可以使用OpenCV的rectangle函数,如前所述。代码看起来可能非常类似于我们用来为图像中检测到的对象绘制边界框和标签的代码。该方法返回一个列表,其中每个元素包含两个矩形。这些矩形是违反社交距离规则的人的包围盒(distance_threshold).

我们需要迭代列表中的元素并一次显示两个矩形:

def indicate_people_that_are_too_close(image, people_that_are_too_close, delay=0): # Prepare window opencv.namedWindow(common.WINDOW_NAME, opencv.WINDOW_GUI_NORMAL) # Iterate over objects (that is a pair of rectangle_points) for i in range(len(people_that_are_too_close)): # Draw each rectangle for j in range(len(people_that_are_too_close[i])): rectangle_points = people_that_are_too_close[i][j] opencv.rectangle(image, rectangle_points[0], rectangle_points[1], common.RED, common.LINE_THICKNESS) # Display image opencv.imshow(common.WINDOW_NAME, image) # Wait until the user presses any key opencv.waitKey(delay)

如上所示,我们使用namedWindow函数来创建窗口和imshow以显示图像。其他组件几乎与指示检测对象的情况相同。

把东西放在一起

对于以上所有的部分,我们可以如下所示创建主脚本Main.py:

import sys sys.path.insert(1, ../Part_03/) sys.path.insert(1, ../Part_05/) sys.path.insert(1, ../Part_06/) from inference import Inference as model from image_helper import ImageHelper as imgHelper from video_reader import VideoReader as videoReader from distance_analyzer import DistanceAnalyzer as analyzer if __name__ == “__main__”: # Load and prepare model model_file_path = ../Models/01_model.tflite labels_file_path = ../Models/02_labels.txt # Initialize model ai_model = model(model_file_path, labels_file_path) # Initialize video reader video_file_path = ../Videos/01.mp4 video_reader = videoReader(video_file_path) # Detection and preview parameters score_threshold = 0.4 delay_between_frames = 5 # Perform object detection in the video sequence while(True): # Get frame from the video file frame = video_reader.read_next_frame() # If frame is None, then break the loop if(frame is None): break # Perform detection results = ai_model.detect_people(frame, score_threshold) # Find people that are too close proximity_distance_threshold = 50 people_that_are_too_close = analyzer.find_people_that_are_too_close( results, proximity_distance_threshold) # Indicate those objects in the image imgHelper.indicate_people_that_are_too_close( frame, people_that_are_too_close, delay_between_frames)
<

脚本设置AI模型,打开示例视频文件,然后查找太近的人。在这里,我将距离阈值设置为50像素。你可以自由试验这个参数。在运行Main.py,您将得到在导言中显示的结果。

总结

我们最终将AI与计算人们违反社会距离的规则联系起来。然而,我们一直使用的模型并不是非常健壮,有时解决方案不能正确地指示太近的人。我会在下一篇文章通过加入最先进的YOLO探测器来解决这个问题。

猜你喜欢