作者 | 李秋键

出品 | AI科技大本营(ID:rgznai100)

引言

行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人,在许多领域中都有广泛的应用。交通安全方面,无人驾驶汽车通过提前检测到行人及时避让来避免交通事故的发生;安防保护方面,通过行人检测来防止可疑人员进入;公共场所管理方面,通过行人检测统计人流量数据,优化人力物力等资源的分配。

对于目标检测的方法,从2013年Ross Girshick提出R-CNN开始,人们在短短几年内相继提出Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO等算法,其中两步检测的目标检测方法(R-CNN系列算法)需要先产生大量候选框之后再用卷积神经网络对候选框进行分类和回归处理;单步检测的方法(SSD、YOLO系列算法)则直接在卷积神经网络中使用回归的方法一步就预测出目标的位置以及目标的类别。虽然两步检测的目标检测方法在大多数的场景下精确率更高,但是它需要分两个步骤进行,因此,这种方法将耗费大量的时间成本和昂贵的硬件成本,不适合对视频文件进行实时的检测。而YOLO系列的网络速度更快,可以适应实时视频的检测,泛化能力更强。

对于人员跟踪,2016年Alex Bewley提出了简单在线实时跟踪算法,这种算法把传统的卡尔曼滤波和匈牙利算法结合到一起, 能在视频帧序列中很好地进行跨检测结果的关联, 而且它的速度比传统的算法快20倍左右,可以快速地对目标检测反馈的数据进行处理。

故本项目通过采用深度学习方法实现YOLO算法行人检测和deepsort算法对人员定位的和轨迹跟踪。其最终实现效果如下图可见:

基本介绍

1.1 环境要求

本次环境使用的是python3.6.5+windows平台。主要用的库有:

opencv模块。在计算机视觉项目的开发中,opencv作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。

pillow模块。PIL是理想的图像存档和批处理应用程序。您可以使用库创建缩略图,在文件格式、打印图像等之间进行转换。它提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。为通用图像处理工具提供了坚实的基础。

Scipy库。Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

keras模块。Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 。

1.2 算法设计

使用卷积神经网络对视频中的行人进行检测和跟踪。视频帧输入之后首先进入YOLOv3目标检测的网络,经过Darknet-53提取特征;其次,进行上采样和特征融合,再进行回归分析;再次,把得出的预测框信息输入SORT算法进行目标特征建模,匹配和跟踪;最后,输出结果。下图为算法流程设计图:

行人检测

2.1 YOLO行人检测

常见的两阶段检测首先是使用候选区域生成器生成的候选区集合,并从每个候选区中提取特征,然后使用区域分类器预测候选区域的类别。而YOLO作为单阶段检测器,则不用生成候选区域,直接对特征图的每个位置上的对象进行分类预测,效率更高。

在这里使用labelme标注行人数据集,然后通过搭建好的YOLO算法产生模型并进行训练即可。

def yolo_body(inputs, num_anchors, num_classes):"""Create YOLO_V3 model CNN body in Keras."""darknet = Model(inputs, darknet_body(inputs))x, y1 = make_last_layers(darknet.output, 512, num_anchors*(num_classes+5))x = compose(DarknetConv2D_BN_Leaky(256, (1,1)),UpSampling2D(2))(x)x = Concatenate()([x,darknet.layers[152].output])x, y2 = make_last_layers(x, 256, num_anchors*(num_classes+5))x = compose(DarknetConv2D_BN_Leaky(128, (1,1)),UpSampling2D(2))(x)x = Concatenate()([x,darknet.layers[92].output])x, y3 = make_last_layers(x, 128, num_anchors*(num_classes+5))return Model(inputs, [y1,y2,y3])

2.2 Deepsort行人跟踪

行人多目标跟踪算法设计的步骤如下:

(1) 检测阶段:目标检测算法会分析每一个输入帧,并识别属于特定类别的对象,给出分类和坐标。

(2) 特征提取/运动轨迹预测阶段:采用一种或者多种特征提取算法用来提取表观特征,运动或者交互特征。此外,还可以使用轨迹预测器预测该目标的下一个位置。

(3) 相似度计算阶段:表观特征和运动特征可以用来计算两个目标之间的相似性。

(4) 关联阶段:使用计算得到的相似性作为依据,将属于同一目标的检测对象和轨迹关联起来,并给检测对象分配和轨迹相同的 ID。

使用卡尔曼滤波类跟踪的估计状态系统和估计的方差或不确定性。用于预测。

这里dist_thresh为距离阈值。当超过阈值时,轨道将被删除,并创建新的轨道;Max_frames_to_skip为允许跳过的最大帧数对于跟踪对象未被检测到;max_trace_length为跟踪路径历史长度;trackIdCount为每个轨道对象的标识。

def Update(self, detections):if (len(self.tracks) == 0):for i in range(len(detections)):track = Track(detections[i], self.trackIdCount)self.trackIdCount += 1self.tracks.append(track)N = len(self.tracks)M = len(detections)cost = np.zeros(shape=(N, M)) for i in range(len(self.tracks)):for j in range(len(detections)):try:diff = self.tracks[i].prediction - detections[j]distance = np.sqrt(diff[0][0]*diff[0][0] +diff[1][0]*diff[1][0])cost[i][j] = distanceexcept:passcost = (0.5) * costassignment = []for _ in range(N):assignment.append(-1)row_ind, col_ind = linear_sum_assignment(cost)for i in range(len(row_ind)):assignment[row_ind[i]] = col_ind[i]un_assigned_tracks = []for i in range(len(assignment)):if (assignment[i] != -1):if (cost[i][assignment[i]] > self.dist_thresh):assignment[i] = -1un_assigned_tracks.append(i)passelse:self.tracks[i].skipped_frames += 1del_tracks = []

综合结果显示

将YOLO行人检测和deepsort算法结合,并通过设置基本阈值参数控制轨迹预测的欧式距离。通过搭建本项目可应用于城市商业街道、人行道、校园道路场景,使用其得出的人员流动数据,帮助公共交通和安全管理。最终得到的使用效果如下:

track_colors = get_colors_for_classes(max_colors)
result = np.asarray(image)
font = cv2.FONT_HERSHEY_SIMPLEX
result0 = result.copy()
result1=result.copy()
img_position=np.zeros([result.shape[0],result.shape[1],3])
if (len(centers) > 0):tracker.Update(centers)for i in range(len(tracker.tracks)):if (len(tracker.tracks[i].trace) > 1):x0, y0 = tracker.tracks[i].trace[-1][0][0], tracker.tracks[i].trace[-1][1][0]cv2.putText(result0, "ID: "+str(tracker.tracks[i].track_id-99), (int(x0), int(y0)), font, track_id_size,(255, 255, 255), 2)cv2.putText(result1, "ID: " + str(tracker.tracks[i].track_id - 99), (int(x0), int(y0)), font,track_id_size,(255, 255, 255), 2)color_random = tracker.tracks[i].track_id % 9cv2.circle(img_position, (int(x0), int(y0)), 1, track_colors[color_random], 8)cv2.putText(img_position, str(tracker.tracks[i].track_id - 99), (int(x0), int(y0)), font,track_id_size,(255, 255, 255), 2)result0=result0.copy()for j in range(len(tracker.tracks[i].trace) - 1):x1 = tracker.tracks[i].trace[j][0][0]y1 = tracker.tracks[i].trace[j][1][0]x2 = tracker.tracks[i].trace[j + 1][0][0]y2 = tracker.tracks[i].trace[j + 1][1][0]clr = tracker.tracks[i].track_id % 9distance = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5if distance < max_point_distance:cv2.line(result1, (int(x1), int(y1)), (int(x2), int(y2)),track_colors[clr], 4)result1=result1.copy()

完整代码:

链接:https://pan.baidu.com/s/1KHEbPwCrjsS_3wBdUrtdtQ

提取码:pe5m

作者简介:

李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

Deepsort + Yolo 实现行人检测和轨迹追踪相关推荐

  1. 基于CNN目标检测方法(RCNN,Fast-RCNN,Faster-RCNN,Mask-RCNN,YOLO,SSD)行人检测,目标追踪,卷积神经网络

    一.研究意义 卷积神经网络(CNN)由于其强大的特征提取能力,近年来被广泛用于计算机视觉领域.1998年Yann LeCun等提出的LeNet-5网络结构,该结构使得卷积神经网络可以端到端的训练,并应 ...

  2. 计算机视觉之目标检测与轨迹追踪

    学习笔记 在上一篇中,已经大致阐述了yolo的原理,现在在检测的基础上实现目标的追踪,我使用yolov5+deepsort进行追踪轨迹. 不进行训练,只是使用官方给定的权重文件以及实验视频. 一个浪费 ...

  3. Python+OpenCV利用KNN背景分割器进行静态场景行人检测与轨迹跟踪

    前言 视频图像中的目标检测与跟踪,是计算机视觉的基础课题,同时具有广泛的应用价值.视觉目标(单目标)跟踪任务就是在给定某视频序列初始帧的目标大小与位置的情况下,预测后续帧中该目标的大小与位置.本篇文章 ...

  4. 信号检测与估计理论 pdf_CVPR2020|行人检测与重识算法推荐论文源码大盘点

    本文收集了CVPR 2020 一些行人检测与人员重识别优秀论文,我们知道在视频监控相关领域这些技术方向可以得到很好得广泛应用. 行人检测及人群计数从内容来看主要解决行人与行人.行人与物体间的遮挡透视, ...

  5. CVPR 2020 论文大盘点-行人检测与重识别篇

    本文盘点CVPR 2020 所有行人检测(Pedestrian Detection)与人员重识别(Person Re-Identification,ReID)相关论文,在视频监控领域该方向技术应用广泛 ...

  6. 【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数

    [小白CV教程]YOLOv5+Deepsort实现车辆行人的检测.追踪和计数 本文禁止转载! 项目简介: YOLOv5检测器: DeepSort追踪器: 运行demo: 训练自己的模型: 调用接口: ...

  7. 【高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画】

    [高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画] 背景需求 可参考的方法 1. opencv + python 实现目标跟踪的方法: 主要代码 ① main.py ② items.py 检测效果 ...

  8. 23年 车辆检测+车距检测+行人检测+车辆识别+车距预测(附yolo v5最新版源码)

    我们先看一下效果2023年最新版 yolo车距 行人识别yolov5和v7对比 yolo车距 其他步骤参考另外一篇文章: yolo 车辆测距+车辆识别+单目测距(双目测距)_SYBH.的博客-CSDN ...

  9. WiderPerson行人检测数据集转yolo格式

    widerPerson数据集属于密集人群标注类型数据集 内部图片看标记为网络收集,很多带有水印 数据集对行人检测,分为5个类别,分别为1正常行人,2骑车人,3遮挡部分的人体,4人形物体,5无法区分的密 ...

最新文章

  1. flex 布局实现 横穿线效果 自适应文字内容,自适应调整线宽
  2. Linux 定时任务crontab_014
  3. 【转】程序员健康建议
  4. 当我们在谈论HTTP缓存时我们在谈论什么
  5. 一般图最大匹配——带花树
  6. 树莓派(TCP客户端 )和Wemos(TCP服务端连接红外模块)通讯实现对红外设备的控制
  7. A tutorial video for MindManager for free
  8. mysql mgr 配置_MySQL5.7 MGR安装配置
  9. ARMA模型的性质之MA模型
  10. 知乎万赞回答!如何在一周内快速摸清一个行业?
  11. java swing 知乎_java swing 界面开发
  12. Java中常量定义在interface和class的区别(转)
  13. 统计自然语言处理(第二版)学习笔记:第一章
  14. 电脑录音软件如何录制YY语音
  15. 联想用u盘重装系统步骤_如何使用U盘重装系统?使用U盘重装系统步骤详解
  16. 群联2251-07 海力士TLC-16K 颗粒 U盘重新量产记录
  17. java开发加入购物车功能_java web开发——购物车功能实现
  18. 使用VS Code远程连接服务器,在VS Code上编辑服务器文件。超级简单
  19. 解决C#界面假死问题
  20. 活码二维码免费平台有哪些呢?

热门文章

  1. Eclipse for Tricore 的安装方法
  2. 1.5s~0.02s,期间我们可以做些什么?
  3. 【NOIP2016】愤怒的小鸟
  4. XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证
  5. 《Android应用开发攻略》——1.3 从命令行创建 “Hello, World”应用程序
  6. 归于软银帐下,ARM需要接受的变与不变
  7. WinAPI: Arc - 绘制弧线
  8. mysql5.7 sql监控_MySQL5.7中 performance和sys schema中的监控参数解释
  9. pandas.io.data 获得金融数据失败
  10. matlab视频保存为图片