Deepsort + Yolo 实现行人检测和轨迹追踪
作者 | 李秋键
出品 | 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竞赛获奖等。
相关文章:

推荐15个国外使用 CSS3 制作的漂亮网站
今天分享的作品集网站有些特别,因为他们都是使用 CSS3 技术制作的。对于设计师来说,为了吸引注意力,作品集必须展示出你的能力,这有点像制作简历,要让人们看到你所擅长的,突出的部分,这是一次推…
7_2判断两个单链表是否相交,若相交,求出第一个交点
转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,…

对抗软件系统复杂性①:如无必要,勿增实体
作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能,软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能,人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要,勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone
今天分析别人网站的时候,注意到国内的chinacache服务商的CDN加速,把squid默认的X-Cache修改为Powered-By-ChinaCache,如下图:以前注意了但是没去研究过,今天刚好有点空挡自己就来研究看看。我的squid版本:s…

NginxApachePHP参数汇总
1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别
含义:intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。…

Squid如何提高命中率
缓存命中1.缓存时间设置,顾名思义,缓存时间设置的越长那么命中率也会相对较高。缓存与更新是一对矛盾的概念,既要做到高命中又要做到快速更新这个就需要自己对自己网站内容的了解然后指定合适的缓存策略。2.缓存能缓存的内容,什么…

海量秋招面试资料等你来拿!你离大厂也许并不远
秋招在即,你还在为秋招如何准备而发愁吗?你还在为拿不到大厂offer而苦恼吗?工欲善其事,必先利其器。金秋开学季,CSDN助力你的技术学习与成长,为你免费提供海量大厂面试资料,让你的秋招不再慌乱&…

Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
Microsoft Dynamics CRM server 2013 中业务规则,我的理解就是有点像C#的正则表达式, 如方某个字段,必须输入什么范围的数值,其它字符不能乱输入。 打开方式有二种: 1. 种像上篇文章中写的那样, 在系统视图…

cCodeforces Round #286 (Div. 2)
A题。。暴力枚举在每个位置添加字符,然后检查一下是不是回文串 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <cmath>6 #include <vector>7 8 using namespace std;9 10 #…

Sarg安装配置使用
SARG的全称是:Squid Analysis Report GeneratorSARG作为一款Squid日志分析工具,它采用html格式,详细列出了每一位用户访问internet的站点信息,时间占用信息,排名,连接次数,访问量,访…

OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) OpenAI 如何以 10 亿美元的价格出售其灵魂:GPT-3 和 Codex 背后的公司并不像它声称的那样开放。 当金钱成为障碍时,最好的意图可能会被破坏。 近日,一篇“How Open…

IBM IMM默认ID 及修改默认IP 方法
默认ID: http://192.168.70.125 用户名:USERID 密码:PASSW0RD (数字0) BIOS 下更改IP方法:(另一种可进IMM 进行修改,此处不再介绍) 本文转自easy80851CTO博客,原文链接:http://blog.51cto.com/6…

squid 优化指南
很多squid 优化只限于在 squid参数和系统参数上面的调整。但是这个实在只是细枝末节的事情,只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对squid 进行一些调整,squi…

Android TextView
2019独角兽企业重金招聘Python工程师标准>>> 1、TextView不用获取焦点也能实现跑马灯 public class MarqueeTextView extends TextView { Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) …

人脸识别模型的动手实践!
作者:宋志龙 来源:Datawhale人脸识别已经成为生活中越来越常见的技术,其中最关键的问题就是安全,而活体检测技术又是保证人脸识别安全性的一个重要手段,本文将向大家简单介绍活体检测,并动手完成一个活体检…

Pyqt5学习系列
最近在学习Pyqt5做界面,找到了一个非常棒的博主的学习系列 在此记录下来: http://blog.csdn.net/zhulove86/article/category/6381941

编程方式刷新Squid缓存服务器的五种方法
网站进行内容更新是常有的事情,当被缓存的资源更新时,前端Squid 缓存服务器内容也必须要相应的更新,否则用户就可能会看到过期的数据。当没有程序支持时就需要每次登录到服务器上执行刷新操作,在服务器数量小的的时候这种方式还可…

Android 实时文件夹
实时文件夹是一种用来显示由某个ContentProvider提供的数据信息的桌面组件。要创建一个实时文件夹,必须要有两个方面的支持。 1,要定义一个用来创建实时文件夹的Activity。 2,所指定数据信息URI的ContentProvider必须支持实时文件夹时文件夹查…

《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”
20年前,伴随着互联网打开信息化大门,技术人成为新时代的开拓者。在时代的召唤下,CSDN于2001年推出国内首个面向IT人员的专业杂志——《程序员》,成为一代代开发者的技术启蒙。20年后的今天,人工智能、云计算、大数据等…

Xtrabackup bug记录
xtrabackup 2.1.2 2.1.3 均出现以下问题: 123xtrabackup: warning: Log block checksum mismatch (block no 191401143 at lsn 3946288081920):expected 800836998, calculated checksum 800832263xtrabackup: warning: this is possible when the log block has n…

RHEL5上配置VNCSERVER
VNC一个远程显示系统,管理员通过它不仅仅可以在运行程序的本地机上察看桌面环境,而且可以从 Internet上的任何地方察看远程机器的运行情况,而且它具有跨平台的特性。 Linux 要使用远程桌面需要安装VNC,Centos5,RHCE5 已经自带了VN…

勒索软件层出不穷,Veeam “3-2-1-1-0”助力构建数据防护
随着 AI、IoT、云原生等前沿技术的发展,近年来勒索病毒的攻击手段不断升级,赎金也越来越高:例如今年美国最大燃油管道受攻击导致美国17个州和华盛顿特区进入紧急状态,2020 年 Ripple20 0day 漏洞曝光,波及数亿台联网设…

大数据架构和模式(一)——大数据分类和架构简介
概述 大数据可通过许多方式来存储、获取、处理和分析。每个大数据来源都有不同的特征,包括数据的频率、量、速度、类型和真实性。处理并存储大数据时,会涉及到更多维度,比如治理、安全性和策略。选择一种架构并构建合适的大数据解决方案极具挑…

Windows 7 开发新特性
10月25日在西安举行的Windows 7 社区发布活动中我讲了Session1 -- Windows 7 概览。参会的人员达到62人,这个参加人数超过了我的预期,非常开心. 主要讲了一下内容: 一 构建于稳固的基础平台 1 . 改进的基础平台 兼容性: 兼容基于Windows Vista构建的应用程序与设备 …

GitHub 的 AI 编程工具漏洞高达 40% ,再次陷入争议……
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 在近日发表的一篇论文中,研究人员对 GitHub Copilot 人工智能编程辅助工具进行了深入调查。结果发现,仍处于测试预览阶段的 Copilot 具有高达 40% 的错误代码率,意味…

centos中mysql重置密码
1 . 用空密码方式使用root用户登录 MySQL; mysql -u root 2. 修改root用户的密码; mysql> update mysql.user set passwordPASSWORD(’新密码’) where User’root’; mysql> flush privileges; mysql> quit 3. 重新启动MySQLÿ…

Centos 内存占满 释放内存
2019独角兽企业重金招聘Python工程师标准>>> 一台服务器,今天用 free -m 查看,发现内存跑满了。 再 top,然后按下shiftm,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,…

Android开发实践:为什么要继承onMeasure()
首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: 12345678910111213141516171819202122package com.titcktick.customview; import android.content.Context; import android.util.AttributeSet;…

Android_CodeWiki_01
记录常用代码片,以备不时之需..wkakak,开始: 1、 精确获取屏幕尺寸(例如:3.5、4.0、5.0寸屏幕) 1 public static double getScreenPhysicalSize(Activity ctx) { 2 DisplayMetrics dm new Displ…