Social-distance-detection
基于YOLOv3的实时社交距离检测,用红绿框直观标注人群聚集情况
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于YOLOv3的实时社交距离检测,用红绿框直观标注人群聚集情况
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2020年,新冠疫情席卷全球,公共场所的「社交距离」成为防止病毒传播的关键手段。一群开发者开始思考:能否用计算机视觉自动检测人群聚集、实时预警违规行为?Abdullah Shoumik 正是这一波实践者之一——他在 GitHub 上开源了一个基于 YOLOv3 的社交距离检测项目,通过分析视频流中行人的位置关系,自动识别违反安全距离的行为,并用红绿颜色直观标注在画面上。
社交距离检测(Social Distancing Detection)并非全新的技术命题,但在 2020 年它被赋予了前所未有的社会价值。传统方案依赖人工巡逻或固定物理标记,效率低且覆盖范围有限。Shoumik 的项目提供了一个几乎零门槛的自动化替代方案:只需一段视频或一颗摄像头,就能实时分析画面中每个人之间的物理距离,一旦超出安全阈值立即报警。这种「AI 替代人工」的思路在疫情期间催生了数十个类似项目,但 Shoumik 的方案凭借代码结构清晰、注释详尽、YOLOv3 成熟稳定等优势,留存至今仍在被学习和引用。
该项目的核心逻辑分为两步:目标检测和距离计算。
项目使用 OpenCV 的 DNN(Deep Neural Networks)模块加载 YOLOv3 模型,对每一帧视频进行推理。YOLOv3 是 2018 年发布的经典单阶段目标检测器,在 COCO 数据集上训练了 80 个类别。项目仅关注「person」类别(classID=0),通过设置 MIN_CONF=0.3 过滤低置信度检测,再以 NMS_THRESH=0.3 非极大值抑制去除重叠框,最终输出一组人体边界框及其中心点坐标。输入图像被缩放至 416×416 以适配 YOLOv3 的默认输入尺寸。
检测到所有人体后,代码提取每个检测框的中心点坐标,存入 centroids 数组。随后利用 scipy.spatial.distance.cdist 计算所有中心点两两之间的欧氏距离矩阵 D。遍历矩阵上三角区域,若任意两人中心点距离小于配置阈值 config.MIN_DISTANCE(默认 50 像素),则将这两人标记为「违规」。最终在视频帧上用绿色绘制合规人员、用红色绘制违规人员,并在画面左下角实时显示违规人数统计。
核心违规判断逻辑如下:
# 核心违规判断逻辑(来自 social_distance_detector.py)
if D[i, j] < config.MIN_DISTANCE:
violate.add(i)
violate.add(j)
# 颜色编码:绿=安全,红=违规
color = (0, 0, 255) if i in violate else (0, 255, 0)
cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)
项目采用模块化目录结构:
Social-distance-detection/
├── social_distance_detector.py # 主程序入口
├── TheLazyCoder/
│ ├── social_distancing_config.py # 全局配置(路径/阈值/GPU开关)
│ └── detection.py # detect_people() 函数封装
└── yolo-coco/
├── yolov3.cfg # YOLOv3 网络结构配置
├── coco.names # COCO 类别标签
└── yolov3.weights # 预训练权重(需手动下载)
配置集中管理是此项目的一大优点:阈值、GPU开关、最小安全距离等参数全部集中在 social_distancing_config.py,修改行为无需改动核心推理代码。同时 detect_people() 函数高度内聚,接受帧图像、网络模型和输出层名即可返回标准化的检测结果,方便在其他项目中复用。
README 提供了详尽的分步骤指南,即使没有深度学习背景也能在 15 分钟内跑通 CPU 版本。核心流程为:创建 Python 虚拟环境 → 安装依赖 → 下载 YOLO 权重 → 运行脚本。GPU 加速版则提供了 Google Colab 链接,绕过本地环境配置。
然而有两个明显的痛点:
1. 权重文件需手动下载:YOLOv3 权重文件(yolov3.weights)超过 100MB,GitHub 不支持大文件存储,作者将权重放在 Google Drive 上。这造成了一个尴尬的困境——克隆仓库后无法直接运行,用户必须手动访问外部链接、下载、移动文件到指定目录,破坏了「开箱即用」体验。
2. 无容器化支持:项目没有提供 Dockerfile 或 docker-compose.yml,无法通过 Docker 一键部署。对于希望在服务器上长期运行的场景,用户需要自行处理 Python 依赖、OpenCV 系统依赖、CUDA 环境等一系列问题。
此外,当前代码仅支持 2D 平面距离判断,无法处理摄像机俯视角造成的透视变形。实际场景中,地面坐标和像素坐标并非线性对应,简单用像素距离判断会引入较大误差。
尽管存在上述局限,这个项目在 2020 年的技术背景下是合理的工程折中:YOLOv3 已是当时最成熟的目标检测方案,OpenCV DNN 模块提供开箱即用的推理能力,无需额外安装 PyTorch 或 TensorFlow。
从更长远的视角看,这个项目代表了一个重要趋势:用轻量级深度学习模型解决特定场景的视觉任务。它不是通用的人体检测库,而是专为「社交距离」这一具体问题定制——这种「小而专」的思路与后来 Agent 工具调用、垂直领域微调等趋势一脉相承。
此外,该项目也展示了 CV 应用的一个典型工程陷阱:把 2D 像素距离当作 3D 物理距离。更严谨的方案需要结合相机标定(Camera Calibration)和单应性变换(Homography),将像素坐标映射到真实世界坐标系,这也是后续研究者改进的方向。

图1:社交距离检测实时推理效果。绿色框表示安全距离内的人员,红色框表示违反最小距离的人员,底部显示违规计数。