python进阶:带你学习实时目标跟踪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python进阶:带你学习实时目标跟踪相关的知识,希望对你有一定的参考价值。

摘要:本程序主要实现了python的opencv人工智能视觉模块的目标跟踪功能。

本文分享自华为云社区《​​python进阶——人工智能实时目标跟踪,这一篇就够用了!​​》,作者:lqj_本人 。

前言

本程序主要实现了python的opencv人工智能视觉模块的目标跟踪功能。

项目介绍

区域性锁定目标实时动态跟踪(适用 警方追捕,无人机锁定拍摄等)

首先先介绍几种AI视觉算法

特性:

1.BOOSTING:算法原理类似于Harr cascdes(AdaBoost),是一种很老的算法。这个算法速度慢并且不准。

2.MIL:比BOOSTING准一点

3.KCF:速度比BOOSTING和MIL更快,与BOOSTING和MIL一样不能很好的处理遮挡问题。

4.CSRT:比KCF更准一些,但是速度比KCF慢

5.MedianFlow:对于快速移动的目标和外形比那花迅速的目标效果不好

6.TLD:会产生朵的false-posittives

7.MOSSE:算法速度非常快,但是准确率比不上KCF和CSRT,在一些追求算法的速度场合很适用

8.GOTURN:OpenCV中自带的唯一一个基于深度学习的算法,运行短发需要提前下载好模型文件

分别对应的伴生的函数:

kcf:cv2.legacy.TrackerKCF_create
csrt:cv2.legacy.TrackerCSRT_create
boosting:cv2.legacy.TrackerBoosting_create
mil:cv2.legacy.TrackerMIL_create
tld:cv2.legacy.TrackerTLD_create
medianflow:cv2.legacy.TrackerMedianFlow_create
mosse:cv2.legacy.TrackerMOSSE_create

详细代码讲解

导入cv模块

ret,frame = cap.read()
import cv2

使用csrt算法,引用伴生函数,并赋值给tracker

tracker = cv2.legacy.TrackerCSRT_create()

读取视频流

cap = cv2.VideoCapture(11.mp4)

先读取到第一帧

ret,frame = cap.read()

使用selectROI(前景),画框将目标框起,并赋值给bbox

bbox = cv2.selectROI(A,frame,fromCenter=False,showCrosshair=True)

初始化tracker,将上面的两个值传入

tracker.init(frame,bbox)

读取每一帧

ret,frame = cap.read()

根据每一帧来更新tracker

ok,box = tracker.update(frame)

若读取成功,就定位画框,并跟随

if ok :
(x,y,w,h) = [int(v) for v in box]
cv2.rectangle(frame,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=2)

显示视频流

cv2.imshow(A, frame)

等待50毫秒或按空格键退出

if cv2.waitKey(50) == ord( ):
break

释放视频流和释放窗口

cap.release()
cv2.destroyAllWindows()

完整代码及注释:

import cv2
tracker = cv2.legacy.TrackerCSRT_create()#使用csrt算法,引用伴生函数,并赋值给tracker

cap = cv2.VideoCapture(11.mp4)#读取视频流

ret,frame = cap.read()#先读取第一帧

bbox = cv2.selectROI(A,frame,fromCenter=False,showCrosshair=True)#使用selectROI(前景),画框将目标框起,并赋值给bbox

tracker.init(frame,bbox)#初始化tracker,将上面的两个值传入

while True:
ret,frame = cap.read()#读取每一帧

ok,box = tracker.update(frame)#根据每一帧来跟新tracker

# 若读取成功,我们就定位画框,并跟随
if ok :
(x,y,w,h) = [int(v) for v in box]
cv2.rectangle(frame,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=2)

cv2.imshow(A, frame)#显示视频流

if cv2.waitKey(50) == ord( ):#等待50毫秒或键盘按空格键退出
break

# 释放视频流,释放窗口
cap.release()
cv2.destroyAllWindows()

结果演示

python进阶:带你学习实时目标跟踪_视频流

区域性全部实时动态目标跟踪(适用夜视跟踪,范围性观察等)

思路构建

1.先将实时摄像流或录制视频流,灰度转化并高斯模糊

2.用二值化算法将流中的物体轮廓扩充

3.分别先读到第一帧和第二帧,让其对比

4.寻找对比后,流的轮廓位置,并开启简易模式

5.过滤物体的矩阵轮廓将其定位绘出

详细代码讲解

导入cv模块

import cv2

将视频流转换并让其高斯模糊

gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)

二值化扩充

_,thresh = cv2.threshold(blur,20,255,cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh,None,iterations=3)
return dilated

读取视频流或实时摄像流

cap = cv2.VideoCapture(11.mp4)

读取第一帧

ret,frame1 = cap.read()

读取第二帧

ret,frame2 = cap.read()

判断cap是否为打开状态

while cap.isOpened():

若为打开,则第一帧与第二帧比较

diff = cv2.absdiff(frame1,frame2)
mask = filter_img(diff)

寻找比较后的物体轮廓,并开启简易模式

contours,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

使用方框将视频流中的物体框出,得到矩阵的宽高

(x,y,w,h) = cv2.boundingRect(contour)

若矩阵的面积小于10(根据视频流中物体的大小来定义),直接无视

if cv2.contourArea(contour) < 10:

将过滤的物体的矩阵轮廓绘出(一定要用int整形)

cv2.rectangle(frame1,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=1)

将第一帧显示

cv2.imshow(A,frame1)

将上面赋值的mask显示

cv2.imshow(B,mask)

实现前后帧对比,并定位物体运动轨迹

1.将第二帧赋值给第一帧

frame1 = frame2

2.再将cap读到的赋值给第二帧()

ret,frame2 = cap.read()

等待50毫秒或者按空格结束

if cv2.waitKey(50) == ord( ):
break

释放视频流及释放窗口

cap.release()
cv2.destroyAllWindows()

完整代码及注释:

import cv2
def filter_img(frame):
#将视频流转换灰度并让其高斯模糊
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
#二值化将其扩充
_,thresh = cv2.threshold(blur,20,255,cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh,None,iterations=3)
return dilated
# 读取视频流
cap = cv2.VideoCapture(11.mp4)

ret,frame1 = cap.read()#读到第一帧
ret,frame2 = cap.read()#读到第二帧

while cap.isOpened():#判断cap是否打开
diff = cv2.absdiff(frame1,frame2)#若打开,则第一帧和第二帧作比较

mask = filter_img(diff)

contours,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#寻找视频流的轮廓,简单模式

#用方框将视频流中的物体用矩形框出
for contour in contours:
(x,y,w,h) = cv2.boundingRect(contour)#得到矩阵的宽高
if cv2.contourArea(contour) < 10:#若矩阵的面积小于200,就无视(太小了)
continue
cv2.rectangle(frame1,pt1=(int(x),int(y)),pt2=(int(x)+int(w),int(y)+int(h)),color=(0,255,0),thickness=1)#将过滤的物体的矩阵轮廓绘出

# cv2.drawContours(frame1,contours,-1,(0,255,0),2)#将视频流中的物体轮廓画出

cv2.imshow(A,frame1)#将第一帧显示
cv2.imshow(B,mask)#将mask也显示

frame1 = frame2#将第二帧赋值给第一帧
ret,frame2 = cap.read()#再将cap读到的赋值给第二帧

if cv2.waitKey(50) == ord( ):#等待五十毫秒或者按空格结束
break
#销毁cap流
cap.release()
#释放窗口
cv2.destroyAllWindows()

结果显示

python进阶:带你学习实时目标跟踪_python_02


点击关注,第一时间了解华为云新鲜技术~

卧槽!出了一个Python实时目标跟踪系统神器!

在当下自动驾驶、智慧城市、安防等领域对车辆、行人、飞行器等快速移动的物体进行实时跟踪及分析的需求可谓比比皆是, 但单纯的目标检测算法只能输出目标的定位+分类,无法对移动的目标具体的运动行为及特征进行分析,因此在具体的车辆行为分析、交通违章判别、嫌疑犯追踪、飞行器监管等场景,目标追踪发挥着不可替代的作用。

视频引用公开数据集[1][2][3][4]

但实际目标追踪的项目落地,往往面临被检目标多、相互遮挡、图像扭曲变形、背景杂乱、视角差异大、目标小且运动速度快等产业实际技术难题。

那如何快速实现高性能的目标跟踪任务呢?一个相对完善的目标跟踪任务实现, 往往需要融合目标检测、行人重识别、轨迹融合等多项技术能力,并对上述产业实际的技术难点,分别进行长时间深度优化,同时考虑跨镜头、多类别、小目标跟踪以及轻量化部署等实际业务诉求。

难么?别急,近日在GitHub社区发布的一个开源目标跟踪系统—PP-Tracking就能使开发者快速用Python完成一个高性能的目标跟踪任务,并实现服务器侧轻量化上线。

它的具体结构图如下:

关于详细的结构详解,可以前往具体项目链接查看:

https://github.com/PaddlePaddle/paddledetection

当然,如果你觉得项目确实实用,支持开源最好的方式就是点亮Star星标支持一下

本文作者也确实详细研究了一下这个项目,总结了它的一些特点,有耐心的老铁可以接着往下看:

1

功能丰富效果佳

PP-Tracking内置DeepSORT[6]、JDE[7]与FairMOT[8]三种主流高精度多目标跟踪模型,并针对产业痛点、结合实际落地场景进行一系列拓展和优化,覆盖多类别跟踪、跨镜跟踪、流量统计等功能与应用,可谓是精度、性能、功能丰富样样俱全~

  • 单镜头跟踪

单镜头下的单类别目标跟踪是指在单个镜头下,对于同一种类别的多个目标进行连续跟踪,是跟踪任务的基础。针对该任务,PP-Tracking基于端到端的One Shot高精模型FairMOT[8],替换为更轻量的骨干网络HRNetV2-W18,采用多种Tricks,如Sync_BN与EMA,保持性能的同时大幅提高了精度,并且扩大训练数据集,减小输入尺寸,最终实现服务端轻量化模型在权威数据集MOT17上精度达到MOTA 65.3,在NVIDIA Jetson NX上速度达到23.3FPS,GPU上速度可达到60FPS!同时,针对对精度要求较高的场景,PP-Tracking还提供了精度高达MOTA75.3的高精版跟踪模型~

视频引用公开数据集[3]

  • 多类别跟踪

PP-Tracking不仅高性能地实现了单镜头下的单类别目标跟踪,更针对多种不同类别的目标跟踪场景,增强了特征匹配模块以适配不同类别的跟踪任务,实现跟踪类别覆盖人、自行车、小轿车、卡车、公交、三轮车等上十种目标,精准实现多种不同种类物体的同时跟踪。

视频引用公开数据集[2]

  • 跨镜头跟踪

安防场景常常会涉及在多个镜头下对于目标物体的持续跟踪。当目标从一个镜头切换到另一个镜头,往往会出现目标跟丢的情况,这时,一个效果好速度快的跨镜头跟踪算法就必不可少了!PP-Tracking中提供的跨镜头跟踪能力基于DeepSORT[6]算法,采用了百度自研的轻量级模型PP-PicoDet和PP-LCNet分别作为检测模型和ReID模型,配合轨迹融合算法,保持高性能的同时也兼顾了高准确度,实现在多个镜头下紧跟目标,无论镜头如何切换、场景如何变换,也能准确跟踪目标的效果。

视频引用公开数据集[2]

  • 流量监测

与此同时,针对智慧城市中的高频场景—人/车流量监测,PP-Tracking也提供了完整的解决方案,应用服务器端轻量级版FairMOT[8]模型预测得到目标轨迹与ID信息,实现动态人流/车流的实时去重计数,并支持自定义流量统计时间间隔。

为了满足不同业务场景下的需求,如商场进出口人流监测、高速路口车流量监测等,PP-Tracking更是提供了出入口两侧流量统计方式~

视频引用公开数据集[2]

2

复杂场景覆盖全

  • 行人、车辆跟踪

智慧交通中,行人和车辆的场景尤为广泛,因此PP-Tracking针对行人和车辆,提供对应的预训练模型,大幅降低开发成本,节省训练时间和数据成本,实现业务场景直接推理,算法即应用的效果!不仅如此,PP-Tracking支持显示目标轨迹,更直观地辅助实现高效的路径规划分析。

视频引用公开数据集[2]

  • 人头跟踪

不仅如此,除了在日常跟踪任务中拥有极强的通用性,针对实际业务中常常出现目标遮挡严重等问题,PP-Tracking也进行了一系列优化,提供了基于FairMOT[8]训练的人头跟踪模型,并在Head Tracking 2021数据集榜单位居榜首,助力PP-Tracking灵活适配各类行人场景。

视频引用公开数据集[5]

  • 小目标跟踪

针对小目标出现在大尺幅图像中的产业常见难题场景,PP-Tracking进行了一系列的优化,提供专门针对小目标跟踪的预训练模型,实现在特殊场景,如无人机等航拍场景下,也能达到较为精准的效果~

视频引用公开数据集[2]

3

两种使用模式,训练推理灵活掌握

为了满足不同的开发需求,PP-Tracking支持两种使用方式,无论是想通过代码调用/训练模型,进行快速推理部署,还是想要零代码直接上手使用功能,PP-Tracking通通满足你!

  • API代码调用:API简洁易用,支持模型调用、训练与推理部署,最大程度降低开发成本的前提下,灵活适配各类场景与任务。

  • 可视化开发界面:支持单镜头下的单、多目标跟踪,并覆盖小目标、人/车流量统计等复杂场景及应用,无需任何开发,即可直接体验功能,便于集成于各类硬件。

更贴心的是,PP-Tracking支持Python、C++两种部署语言,同时提供使用飞桨原生推理库Paddle Inference和飞桨服务化推理框架Paddle Serving的保姆级部署教程,真正意义上打通从训练、推理到部署的全流程。

4

产业场景快速融合

这么厉害的实时跟踪系统在实际落地中的表现如何呢?接下来,让我们看看PP-Tracking的实际业务落地效果吧~

以人流量计数为例,在上海音智达公司的实际业务中,使用PP-Tracking中的服务端轻量化版FairMOT[8],结合人流量计数功能,快速实现商圈出入口的实时人流量去重计数。

视频引用公开数据集[3]

被应用于自动驾驶、安防、交通、城市等多种领域的目标跟踪你学会了么?想要深入了解案例细节?掌握跟踪的应用?快报名直播课程吧!

深入直播讲解

为了让开发者们更深入的了解PP-Tracking这套多功能的跟踪系统,解决产业应用难点以及掌握产业实践的核心能力,飞桨团队精心准备了为期四天的直播课程!

11月23日-26日19:00-20:00,百度资深高工将深入解读通用目标检测的基础理论与实践、超轻人体关键点模型的理论及应用,并全方位解析实时跟踪系统,对各类痛难点解决方案进行手把手拆解,更有直播现场为大家答疑解惑,还在等什么!抓紧扫码上车吧!

扫码报名直播课,加入技术交流群

精彩内容抢先看

图片数据引用说明

[1] Yu F, Chen H, Wang X, et al. Bdd100k: A diverse driving dataset for heterogeneous multitask learning[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2020: 2636-2645.

[2] Zhu P, Wen L, Du D, et al. Vision meets drones: Past, present and future[J]. arXiv preprint arXiv:2001.06303, 2020.

[3] Milan A, Leal-Taixé L, Reid I, et al. MOT16: A benchmark for multi-object tracking[J]. arXiv preprint arXiv:1603.00831, 2016.

[4] Bai H, Cheng W, Chu P, et al. GMOT-40: A Benchmark for Generic Multiple Object Tracking[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 6719-6728.

[5] Sundararaman R, De Almeida Braga C, Marchand E, et al. Tracking Pedestrian Heads in Dense Crowd[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021: 3865-3875.

模型引用说明

[6] DeepSORT: Veeramani B, Raymond J W, Chanda P. DeepSort: deep convolutional networks for sorting haploid maize seeds[J]. BMC bioinformatics, 2018, 19(9): 1-9.

[7] JDE: Wang Z, Zheng L, Liu Y, et al. Towards real-time multi-object tracking[C]//Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part XI 16. Springer International Publishing, 2020: 107-122.

[8] FairMOT: Zhang Y, Wang C, Wang X, et al. Fairmot: On the fairness of detection and re-identification in multiple object tracking[J]. International Journal of Computer Vision, 2021: 1-19.

以上是关于python进阶:带你学习实时目标跟踪的主要内容,如果未能解决你的问题,请参考以下文章

卧槽!出了一个Python实时目标跟踪系统神器!

实时车辆行人多目标检测与跟踪系统-上篇(UI界面清新版,Python代码)

大家沉迷短视频无法自拔?Python爬虫进阶,带你玩转短视频

超强实时跟踪系统首次开源 支持跨镜头多类别小目标跟踪

超强实时跟踪系统首次开源 支持跨镜头多类别小目标跟踪

[AI开发]基于深度学习的视频多目标跟踪实现