Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用TensorFlow物体检测模型、Python和OpenCV的社交距离检测器

使用TensorFlow物体检测模型、Python和OpenCV的社交距离检测器

作者头像
小白学视觉
发布于 2020-07-22 07:35:00
发布于 2020-07-22 07:35:00
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

0.介绍

疫情期间,我们在GitHub上搜索TensorFlow预训练模型,发现了一个包含25个物体检测预训练模型的库,并且这些预训练模型中包含其性能和速度指标。结合一定的计算机视觉知识,使用其中的模型来构建社交距离程序会很有趣。

学习OpenCV的过程中,小伙伴们应该知道对于一些小型项目OpenCV具有很强大的功能,其中一个就是对图片进行鸟瞰转换,鸟瞰图是对一个场景自上而下的表示,也是构建自动驾驶应用程序时经常需要执行的任务。

车载摄像头鸟瞰系统的实现

这说明将鸟瞰转换的技术应用到监视社交距离的场景中可以提高监视质量。

本期我们将介绍了如何使用深度学习模型以及计算机视觉方面的一些知识来构建强大的社交距离检测器。

本文的结构如下:

·模型选择

·人员检测

·鸟瞰图转换

·社交距离测量

·结果与改进

所有代码及安装说明可以以下链接中找到:https://github.com/basileroth75/covid-social-distancing-detection

1.模型选择

在TensorFlow物体检测模型zoo中的所有可用模型已经在COCO数据集(Context中的通用物体)上进行了预训练。COCO数据集包含120000张图像,这些图像中总共包含880000个带标签的物体。这些模型经过预训练可以检测90种不同类型的物体,物体类型的完整列表可以在GitHub的data部分得到,地址为:https://github.com/tensorflow/models/blob/master/research/object_detection/data/mscoco_complete_label_map.pbtxt

可用模型的非详尽清单

模型的预测速度不同,性能表现也不同。为了决定如何根据模型的预测速度来利用模型,我进行了一些测试。由于社交距离检测器的目标不是执行实时分析,因此最终选择了fast_rcnn_inception_v2_coco ,它的mAP(验证集上检测器的性能)为28,执行速度为58ms,非常强大,下载地址为:

http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

2.人员检测

使用上述模型检测人员,必须完成一些步骤:

·将包含模型的文件加载到TensorFlow图中,并定义我们想从模型获得的输出。

·对于每一帧,将图像输入到TensorFlow图以获取所需的输出。

·过滤掉弱预测和不需要检测的物体。

加载并启动模型:

TensorFlow模型的工作方式是使用graphs(图)。第一步意味着将模型加载到TensorFlow图中,该图将包含所需检测。下一步是创建一个session会话),该会话是负责执行定义在图中操作的一个实体。有关图和会话的更多说明,参见https://danijar.com/what-is-a-tensorflow-session/ 。在这里我们实现了一个类,将与TensorFlow图有关的所有数据关联在一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Model:
"""
    Class that contains the model and all its functions
    """
def __init__(self, model_path):
"""
        Initialization function
        @ model_path : path to the model 
        """

# Declare detection graph
        self.detection_graph = tf.Graph()
# Load the model into the tensorflow graph
with self.detection_graph.as_default():
            od_graph_def = tf.compat.v1.GraphDef()
with tf.io.gfile.GFile(model_path, 'rb') as file:
                serialized_graph = file.read()
                od_graph_def.ParseFromString(serialized_graph)
                tf.import_graph_def(od_graph_def, name='')

# Create a session from the detection graph
        self.sess = tf.compat.v1.Session(graph=self.detection_graph)

def predict(self,img):
"""
        Get the predicition results on 1 frame
        @ img : our img vector
        """
# Expand dimensions since the model expects images to have shape: [1, None, None, 3]
        img_exp = np.expand_dims(img, axis=0)
# Pass the inputs and outputs to the session to get the results 
        (boxes, scores, classes) = self.sess.run([self.detection_graph.get_tensor_by_name('detection_boxes:0'), self.detection_graph.get_tensor_by_name('detection_scores:0'), self.detection_graph.get_tensor_by_name('detection_classes:0')],feed_dict={self.detection_graph.get_tensor_by_name('image_tensor:0'): img_exp})
return (boxes, scores, classes)

通过模型传递每一帧

对于需要处理的每个帧,都会启动一个新会话,这是通过调用run()函数完成的。这样做时必须指定一些参数,这些参数包括模型所需的输入类型以及我们要从中获取的输出。在我们的案例中所需的输出如下:

·每个物体的边界框坐标

·每个预测的置信度(0到1)

·预测类别(0到90)

·过滤弱预测和不相关物体

人员检测结果

模型能检测到的很多物体类别,其中之一是人并且与其关联的类为1。为了排除弱预测(阈值:0.75)和除人以外的所有其他类别的物体,我使用了if语句,将这两个条件结合起来以排除任何其他物体,以免进一步计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if int(classes[i]) == 1 and scores[i] > 0.75

但是因为这些模型已经经过预训练,不可能仅检测此类(人)。因此,这些模型要花很长时间才能运行,因为它们试图识别场景中所有90种不同类型的物体。

3.鸟瞰图转换

如引言中所述,执行鸟瞰图转换可为我们提供场景的俯视图。值得庆幸的是OpenCV具有强大的内置函数,此函数可以将从透视图角度拍摄的图像转换为俯视图。我使用了Adrian Rosebrock的教程 来了解如何做到这一点:https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/

第一步选择原始图像上的4个点,这些点将成为要转换的图的角点。这些点必须形成一个矩形,至少两个相对的边平行,如果不这样做,则转换发生时的比例将不同。我已经在我的仓 库中 实现了一个脚本,该脚本使用OpenCV的setMouseCallback()函数来获取这些坐标。计算变换矩阵的函数还需要使用图像的image.shape属性计算图像尺寸。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
width, height, _ = image.shape

这将返回宽度、高度和其他不相关的颜色像素值。让我们看看如何使用它们计算变换矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def compute_perspective_transform(corner_points,width,height,image):
""" Compute the transformation matrix
  @ corner_points : 4 corner points selected from the image
  @ height, width : size of the image
  return : transformation matrix and the transformed image
  """
# Create an array out of the 4 corner points
  corner_points_array = np.float32(corner_points)
# Create an array with the parameters (the dimensions) required to build the matrix
  img_params = np.float32([[0,0],[width,0],[0,height],[width,height]])
# Compute and return the transformation matrix
  matrix = cv2.getPerspectiveTransform(corner_points_array,img_params) 
  img_transformed = cv2.warpPerspective(image,matrix,(width,height))
return matrix,img_transformed

注意函数的返回值是矩阵,因为在下一步中将使用这个矩阵计算每个被检测到的人的新坐标,新坐标是帧中每个人的“ GPS”坐标,使用这些新坐标而不是使用原始基点结果更为准确,因为在透视图中当人们处于不同平面时,距离是不一样的,并且距相机的距离也不相同。与使用原始检测框中的点相比,这可以大大改善社会距离的测量。

对于检测到的每个人,将返回构建边界框所需的2个点,这两个点是边界框的左上角和右下角。通过获取两点之间的中点来计算边界框的质心,使用此结果,计算位于边界框底部中心的点的坐标,我认为这一点(称为“基点”)是图像中人坐标的最佳表示。

然后使用变换矩阵为每个检测到的基点计算变换后的坐标。在检测到人之后,在每一帧上使用cv2.perspectiveTransform()完成此操作。实现此任务的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def compute_point_perspective_transformation(matrix,list_downoids):
""" Apply the perspective transformation to every ground point which have been detected on the main frame.
  @ matrix : the 3x3 matrix 
  @ list_downoids : list that contains the points to transform
  return : list containing all the new points
  """
# Compute the new coordinates of our points
  list_points_to_detect = np.float32(list_downoids).reshape(-1, 1, 2)
  transformed_points = cv2.perspectiveTransform(list_points_to_detect, matrix)
# Loop over the points and add them to the list that will be returned
  transformed_points_list = list()
for i in range(0,transformed_points.shape[0]):
    transformed_points_list.append([transformed_points[i][0][0],transformed_points[i][0][1]])
return transformed_points_list

4.社交距离测量

在每帧上调用此函数后,将返回一个包含所有新转换点的列表,从这个列表中,计算每对点之间的距离。这里我使用了itertools库的Combination()函数,该函数允许在列表中获取所有可能的组合而无需保留双精度。在https://stackoverflow.com/questions/104420/how-to-generate-all-permutations-of-a-list 堆栈溢出问题中对此进行了 很好的解释。其余的是简单的数学运算:使用math.sqrt()函数计算两点之间的距离。选择的阈值为120像素,因为它在我们的场景中大约等于2英尺。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Check if 2 or more people have been detected (otherwise no need to detect)
if len(transformed_downoids) >= 2:
    # Iterate over every possible 2 by 2 between the points combinations 
list_indexes = list(itertools.combinations(range(len(transformed_downoids)), 2))
for i,pair in enumerate(itertools.combinations(transformed_downoids, r=2)):
      # Check if the distance between each combination of points is less than the minimum distance chosen
if math.sqrt( (pair[0][0] - pair[1][0])**2 + (pair[0][1] - pair[1][1])**2 ) < int(distance_minimum):
        # Change the colors of the points that are too close from each other to red
change_color_topview(pair)
        # Get the equivalent indexes of these points in the original frame and change the color to red
index_pt1 = list_indexes[i][0]
index_pt2 = list_indexes[i][1]
change_color_originalframe(index_pt1,index_pt2)

一旦确定两个点之间的距离太近,标记该点的圆圈的颜色将从绿色更改为红色,原始框架上的边界框的颜色也做相同的颜色变换操作。

5.结果

回顾项目的工作原理:

·首先获取图的4个角点,然后应用透视变换获得该图的鸟瞰图并保存透视变换矩阵。

·获取原始帧中检测到的每个人的边界框。

·计算这些框的最低点,最低点是位于人双脚之间的点。

·对这些点应用变换矩阵,获取每一个人的真实“ GPS”坐标。

·使用itertools.combinations()测量帧中每个点到所有其它点的距离。

·如果检测到违反社交距离,将边框的颜色更改为红色。

我使用来自PETS2009 数据集http://www.cvg.reading.ac.uk/PETS2009/a.html#s0 的视频,该视频由包含不同人群活动的多传感器序列组成,它最初是为诸如人群中人员计数和密度估计之类的任务而构建的。我决定从第一个角度使用视频,因为它是最宽的一个,具有最佳的场景视角。该视频介绍了获得的结果:

https://youtu.be/3b2GPwN2_I0

6.结论与改进

如今,隔离以及其他基本卫生措施对抑制Covid-19的传播速度非常重要。但该项目仅是概念的证明,并且由于道德和隐私问题,不能用于监视公共或私人区域的社交距离。

这个项目存在一些小的缺陷,改进思路如下:

·使用更快的模型来执行实时社交距离分析。

·使用对遮挡更具鲁棒性的模型。

·自动校准是计算机视觉中一个众所周知的问题,可以在不同场景上极大地改善鸟瞰图的转换。

7.参考资料

https://towardsdatascience.com/analyse-a-soccer-game-using-tensorflow-object-detection-and-opencv-e321c230e8f2

https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/

https://developer.ridgerun.com/wiki/index.php?title=Birds_Eye_View/Introduction/Research

http://www.cvg.reading.ac.uk/PETS2009/a.html#s0

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MaskRCNN 基于OpenCV DNN的目标检测与实例分割
这里主要记录基于 OpenCV 4.x DNN 模块和 TensorFlow MaskRCNN 开源模型的目标检测与实例分割 的实现.
AIHGF
2019/05/13
1.8K0
MaskRCNN 基于OpenCV DNN的目标检测与实例分割
实战 | 基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
本文主要介绍如何使用YOLOv8+BYTETrack+OpenCV实现车辆速度的计算(详细步骤 + 代码)。
Color Space
2024/02/21
6.8K3
实战 | 基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
基于点检测的物体检测方法(一):CornerNet
CornerNet: Detecting Objects as Paired Keypointsarxiv.org
小白学视觉
2021/08/05
3830
基于点检测的物体检测方法(一):CornerNet
LPCG:用激光点云指导单目的3D物体检测
在自动驾驶和计算机视觉领域,单目3D物体检测是一项极具挑战性的任务。以前大多数的工作都是手动标注的3D标签框,标注成本很高。
一点人工一点智能
2022/12/24
5310
LPCG:用激光点云指导单目的3D物体检测
Python OpenCV3 计算机视觉秘籍:6~9
变量之间的线性相关性是所有可能选项中最简单的。 从近似和几何任务到数据压缩,相机校准和机器学习,它可以在许多应用中找到。 但是,尽管它很简单,但是当现实世界的影响发挥作用时,事情就会变得复杂。 从传感器收集的所有数据都包含一部分噪声,这可能导致线性方程组具有不稳定的解。 计算机视觉问题通常需要求解线性方程组。 即使在许多 OpenCV 函数中,这些线性方程也是隐藏的。 可以肯定的是,您将在计算机视觉应用中面对它们。 本章中的秘籍将使您熟悉线性代数的方法,这些方法可能有用并且实际上已在计算机视觉中使用。
ApacheCN_飞龙
2023/04/27
2.5K0
Python OpenCV3 计算机视觉秘籍:6~9
Opencv实现透视形变
计算机视觉现在很流行,世界各地的人们都在从事某种形式的基于深度学习的计算机视觉项目。但在深度学习出现之前,图像处理技术已被用来处理和转换图像,以获得有助于我们完成任务的见解。今天,让我们看看如何实现一种简单而有用的技术,即透视投影来扭曲图像。
小白学视觉
2022/02/14
7670
Opencv实现透视形变
浣熊检测器实例, 如何用TensorFlow的Object Detector API来训练你的物体检测器
这篇文章是“用Tensorflow和OpenCV构建实时对象识别应用”的后续文章。具体来说,我在自己收集和标记的数据集上训练了我的浣熊检测器。完整的数据集可以在我的Github repo上看到。 看一
AiTechYun
2018/03/02
1.7K0
浣熊检测器实例, 如何用TensorFlow的Object Detector API来训练你的物体检测器
Python OpenCV 蓝图:1~5
本章的目的是开发许多图像处理过滤器,并将其实时应用于网络摄像头的视频流。 这些过滤器将依靠各种 OpenCV 函数来通过拆分,合并,算术运算以及为复杂函数应用查找表来操纵矩阵。
ApacheCN_飞龙
2023/04/27
1.8K0
Python OpenCV 蓝图:1~5
基于OpenCV和Tensorflow的深蹲检测器
在检疫期间,我们的体育活动非常有限,这样并不好。在进行一些居家运动时,我们必须时刻保持高度的注意力集中,以便记录自己每天的运动量。因此我们希望建立一个自动化的系统来实现运动量计算。考虑到我们在深蹲时,有明确阶段和大幅度变化的基本运动,实现对深蹲的计数会相对比较简单。
小白学视觉
2020/07/22
1.2K0
基于OpenCV和Tensorflow的深蹲检测器
CornerNet: 成对关键点物体检测 | CSDN博文精选
5、用于Grouping Corners的 embedding vector的工作原理
AI科技大本营
2019/10/31
9680
Qt5 和 OpenCV4 计算机视觉项目:6~9
在上一章中,我们了解了光学字符识别(OCR)技术。 我们借助 Tesseract 库和预训练的深度学习模型(EAST 模型)来识别扫描文档和照片中的文本,该模型已随 OpenCV 一起加载。 在本章中,我们将继续进行对象检测这一主题。 我们将讨论 OpenCV 以及其他库和框架提供的几种对象检测方法。
ApacheCN_飞龙
2023/04/27
3.3K0
Qt5 和 OpenCV4 计算机视觉项目:6~9
TensorFlow 目标检测模型转换为 OpenCV DNN 可调用格式
在 OpenCV4.X 版本(OpenCV3.4.1之后版本) 可以采用 cv2.dnn.readNetFromTensorflow(pbmodel, pbtxt) 函数直接调用 TensorFlow 训练的目标检测模型.
AIHGF
2019/05/13
2.5K0
TensorFlow 目标检测模型转换为 OpenCV DNN 可调用格式
向「假脸」说 No:用OpenCV搭建活体检测器
这样的用户可能会拿到另一个人的照片。甚至可能他们的手机上就有其他人的照片或视频,他们可以用这样的照片或视频来欺骗识别人脸的相机(就像本文开头的图片那样)。
机器之心
2019/04/29
1.6K0
向「假脸」说 No:用OpenCV搭建活体检测器
值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)
【导读】上周,我们在《激光雷达,马斯克看不上,却又无可替代?》一文中对自动驾驶中广泛使用的激光雷达进行了简单的科普,今天,这篇文章将各大公司和机构基于激光雷达的目标检测工作进行了列举和整合。由于文章列举方法太多,故作者将其分成上下两部分,本文为第一部分。
AI科技大本营
2019/09/19
2.7K0
值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)
用PyTorch做物体检测和追踪
在我之前的工作中,我尝试过用自己的图像在PyTorch中训练一个图像分类器,然后用它来进行图像识别。现在,我将向你们展示如何使用预训练的分类器在一张图像中检测多个目标,之后在整个视频中跟踪他们。
AI研习社
2019/01/08
1.9K0
用 OpenCV 检测图像中各物体大小
在图像中测量物体的大小与计算从相机到物体之间的距离是相似的,在这两种情况下,我们需要定义一个比值,它测量每个给定指标的像素个数。
AI研习社
2018/07/26
3.9K0
用 OpenCV 检测图像中各物体大小
干货 | tensorflow模型导出与OpenCV DNN中使用
Deep Neural Network - DNN 是OpenCV中的深度神经网络模块,支持基于深度学习模块前馈网络运行、实现图像与视频场景中的
OpenCV学堂
2019/04/29
5K0
干货 | tensorflow模型导出与OpenCV DNN中使用
使用Pytorch和OpenCV实现视频人脸替换
“DeepFaceLab”项目已经发布了很长时间了,作为研究的目的,本文将介绍他的原理,并使用Pytorch和OpenCV创建一个简化版本。
deephub
2023/08/30
5690
使用Pytorch和OpenCV实现视频人脸替换
实战|OpenCV实时弯道检测(详细步骤+源码)
本文主要介绍如何使用 Python 和 OpenCV实现一个实时曲线道路检测系统。(公众号:OpenCV与AI深度学习)
Color Space
2022/09/26
2K0
自动驾驶中基于光流的运动物体检测
文章:Optical Flow Based Motion Detection for Autonomous Driving
点云PCL博主
2022/09/13
1.6K0
自动驾驶中基于光流的运动物体检测
推荐阅读
相关推荐
MaskRCNN 基于OpenCV DNN的目标检测与实例分割
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验