在我们进行交流谈话时,人与人之间总要保持一定的距离,尤其是在疫情的情况下,人与人之间更要保持一定的安全距离,今天给大家来介绍一个检测社交距离的项目,实现社交距离检测器。

社交距离(Social Distance)

社会隔离是一种控制传染病传播的方法,保持一定的社交距离,可以让我们减少亲密接触,从而减少传染病的传播,在疫情期间,我们用人与人之间的实际距离,比如人与人之间相隔2米来衡量,作为一个阈值,超过2米远,则是安全距离,反之违反了安全距离,在计算机中如何做到这样的检测呢?如何构建这样社交距离检测器呢?

构建社交距离检测器

我们首先使用Opencv和常见的目标检测算法,如:yolov3检测我们要检测的视频流中的所有人,然后再计算所有检测到的人之间的相互“ 距离 ”,和我们现实生活中用“米”这样的单位衡量距离不一样的是,在计算机中,简单的方法是我们用检测到的两个人的质心,也就是检测到的目标框的中心之间相隔的像素值作为计算机中的“距离”来衡量视频中的人之间的距离是否超过安全距离。

构建步骤:

  • 使用目标检测算法检测视频流中的所有人,得到位置信息和质心位置
  • 计算所有检测到的人质心之间的相互距离
  • 设置安全距离,计算每个人之间的距离对,检测两个人之间的距离是否小于N个像素,小于则处于安全距离,反之则不处于。

项目架构:

pyimagesearch目录:

social_distancing_config.py:配置文件,定义初始化最小概率来过滤弱检测和非极大抑制阈值,定义最小安全社交社会距离,单位:像素。detection.py: 使用目标检测算法yolov3对视频流中的目标进行检测,得到目标的位置(左上右下)以及质心位置。

yolo-coco目录:coco.names: 定义目标检测算法要检测的类别,这里使用目标检测算法yolov3-coco训练的初始化权重,所以分类数为80yolov3.cfg: yolov3网络结构的定义文件,利用yolov3模型检测,得到目标位置信息。yolov3.weights :yolov3模型的初始化权重

social_distance_detector.py: 对视频文件或者网络摄像头视频流,借助detection.py得到的检测结果,计算成对人之间的距离并进行阈值判断是否处于安全社交距离之内,最终将结果进行展示绘制 ,输入视频street.mp4,输出outputstreet.mp4。

整体实现流程图

代码讲解

detect_people.py

使用yolov3目标检测器来检测视频流中的行人,得到视频中每一个人的位置信息,并进行处理,最终返回的results列表,包含5个信息:目标人的置信度、目标人位置、目标的质心位置。

social_distance_detector.py
根据检测算法的结果进行处理,绘制展现最终输出结果。

环境搭建

  • Windows 10
  • Anaconda + Pycharm
  • Python ==3.6
  • Opencv-Python==4.1.2.30
  • imutils + scipy +numpy

结果展示

在控制台输入命令:

python social_distance_detector.py --input street.mp4 --output outputstreet.avi

视频中的数字即代表违反社交安全距离的人数。

 
Yolov3算法实现社交距离安全检测项目讲解和实战

 

总结

为了获得最准确的结果,你应该通过内部/外部参数校准摄像机,以便可以将像素映射到可测量的单位;一种更简单的替代方法(但准确度低)是应用三角相似度校准(链接)。这些方法都可以将像素映射到可测量的单位。

如果你不想用相机校准来实现社交距离检测器,那你必须严格依赖像素距离,但像素距离不一定那么准确。在这里我们社交距离检测器使用像素距离。

更多有关python、深度学习和计算机编程和电脑知识的精彩内容,可以关注微信公众号:码农的后花园

Opencv+Yolov3算法实现社交距离安全检测讲解和实战(Social Distance Detector)的更多相关文章

  1. ModelArts 与HiLens Kit联合开发丨行人社交距离风险提示Demo

    摘要:本Demo使用YOLOv3_Resnet18模型来检测的视频流中的行人,获取行人坐标(即图中蓝色方框),然后计算所有检测到的人之间的相互"距离". 前情提要 听到行人社交距离 ...

  2. OpenCV 学习笔记03 直线和圆检测

    检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...

  3. Opencv分水岭算法——watershed自动图像分割用法

    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...

  4. 腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式

    腾讯公司数据分析岗位的hadoop工作 线性回归 k-means算法 朴素贝叶斯算法 SpringMVC组件 某公司的广告投放系统 KNN算法 社交网络模型 SpringMVC注解方式 某移动公司实时 ...

  5. Acwing 社交距离 分类讨论+贪心

    一种新型疾病,COWVID-19,开始在全世界的奶牛之间传播. Farmer John 正在采取尽可能多的预防措施来防止他的牛群被感染. Farmer John 的牛棚是一个狭长的建筑物,有一排共 N ...

  6. 【OpenCV文档】用于角点检测的Fast算法

    原文地址:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm- ...

  7. 基于YOLOv3和Qt5的车辆行人检测(C++版本)

    概述 YOLOv3: 车辆行人检测算法 GitHub Qt5: 制作简单的GUI OpenCV:主要用于putText.drawRec等 Step YOLOv3检测结果 Fig 1. input im ...

  8. MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

    目录 写在前面 算法Pipeline详解 如何训练 损失函数 训练数据准备 多任务学习与在线困难样本挖掘 预测过程 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 主 ...

  9. Python+OpenCV图像处理(十四)—— 直线检测

    简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...

随机推荐

  1. Hotspot GC研发工程师也许漏掉了一块逻辑

    本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 今天要说的这个问题,是我经常面试问的一个问题,只是和我之前排查过的场景有些区别,属于另外一种情况.也许我这里讲了这个之后,会成为不 ...

  2. MySQL--->高级对象

    本章目标: 掌握MySQL视图 掌握MySQL存储过程 掌握MySQL触发器 1.视图: 视图就是一条select语句执行后返回的结果集. 使用场景:权限控制的时候不希望用户访问表中某些敏感信息的列 ...

  3. MySQL--->数据库的简介和安装

    1.什么是MySQL: MySQL是一个小型关系型数据库管理系统,开发者伟瑞典MySQL AB公司. 目前MySQL被广泛的应用在Internet上的中小型网站中.由于体积小,速度快,总体拥有成本低, ...

  4. CSS表单与数据表(上)

    表单在现代Web应用中占据着重要地位. 表单可以很简单,也可以非常复杂,要横跨几个页面. 除了从用户哪里获得数据,Web应用还需要以容易看懂的方式展示数据.表格是展示复杂数据的最佳方式. 1.设计数据 ...

  5. redis(一)内部机制的介绍和启动过程

    redis(一)内部机制的介绍和启动过程 redis的基本介绍 redis服务端 redis客户端 redis的持久化 redis中的文件事件和时间时间 redis的启动过程 redis的基本介绍 r ...

  6. ReentrantLock与synchronized 源码解析

    一.概念及执行原理   在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并 ...

  7. 2020-04-28:工作中如何解决MQ消息堆积和消息重复的问题?

    福哥答案2020-04-28:此答案来自群员,感谢群员支持. 消息堆积 只能考虑 增多消费者 以及后端其他服务 组件的吞吐能力 别的有办法吗 如果更彻底一点 分撒单个队列里的消息 队列 更分门别类 或 ...

  8. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  9. C#LeetCode刷题之#83-删除排序链表中的重复元素(Remove Duplicates from Sorted List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3820 访问. 给定一个排序链表,删除所有重复的元素,使得每个元素 ...

  10. 用python爬虫监控CSDN博客阅读量

    作为一个博客新人,对自己博客的访问量也是很在意的,刚好在学python爬虫,所以正好利用一下,写一个python程序来监控博客文章访问量 效果 代码会自动爬取文章列表,并且获取标题和访问量,写入exc ...