FairMOT实时多目标跟踪
简介
FairMOT是今年很火的一个多目标跟踪算法,前不久也开放了最新版本的论文,并于最近重构了开源代码,我也在实际工程视频上进行了测试,效果是很不错的。不过,官方源码没有提高实时摄像头跟踪的编程接口,我在源码的基础上进行了修改,增加了实时跟踪模块。本文介绍如何进行环境配置和脚本修改,实现摄像头跟踪(本文均采用Ubuntu16.04进行环境配置,使用Windows在安装DCN等包的时候会有很多问题,不建议使用)。
环境配置
下述环境配置需要保证用户已经安装了git和conda,否则配置pytorch和cuda会诸多不便。
首先,通过下面的git命令从Github克隆源码到本地并进入该项目。访问链接(提取码uouv)下载训练好的模型,在项目根目录下新建models
目录(和已有的assets
、src
等目录同级),将刚刚下载好的模型文件fairmot_dla34.pth
放到这个models
目录下。
git clone git@github.com:ifzhang/FairMOT.git
cd FairMOT
下面,通过conda创建适用于该项目的虚拟环境(环境隔离),国内用户速度慢可以参考我conda的文章配置国内源。创建之后通过activate
激活环境(该命令出错将conda
换为source
)。然后在当前虚拟环境下(后续关于该项目的操作都需要在该虚拟环境下)安装pytorch和cuda(这里也建议配置国内源后安装conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
)。最后,通过pip命令安装所需d的Python包(国内建议配置清华源),注意先安装cython。
conda create -n fairmot python=3.6
conda activate fairmot
conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0
pip install cython
pip install -r requirements.txt
pip install -U opencv-python==4.1.1.26
同时,用于项目使用了DCNv2所以需要安装该包,该包只能通过源码安装,依次执行下述命令即可(安装过程报warning是正常情况,不报error就行)。
git clone https://github.com/CharlesShang/DCNv2
cd DCNv2
./make.sh
cd ../
至此,所有的环境配置已经完成,由于这里还需要使用到ffmpeg来生成视频文件,所以系统需要安装ffmpeg(Ubuntu采用apt安装即可),教程很多,不多赘述。
想要试试项目是否正常工作,可以使用下面的命令在demo视频上进行跟踪测试(初次允许需要下载dla34模型,这个模型国内下载速度还可以,我就直接通过允许代码下载的)。
cd src
python demo.py mot --input-video ../videos/MOT16-03.mp4 --load_model ../models/fairmot_dla34.pth --conf_thres 0.4
默认文件输出在项目根目录的demos
文件夹下,包括每一帧的检测结果以及组合成的视频。
实时跟踪
实时跟踪主要在两个方面进行修改,一是数据加载器,二是跟踪器。首先,我们在src
目录下新建一个类似于demo.py
的脚本文件名为camera.py
,写入和demo.py
类似的内容,不过,我们把视频路径换位摄像机编号(这是考虑到JDE采用opencv进行视频读取,而opencv视频读取和摄像机视频流读取是一个接口)。具体camera.py
内容如下。
import osimport _init_paths
from opts import opts
from tracking_utils.utils import mkdir_if_missing
import datasets.dataset.jde as datasets
from track import eval_seqdef recogniton():result_root = opt.output_root if opt.output_root != '' else '.'mkdir_if_missing(result_root)print("start tracking")dataloader = datasets.LoadVideo(0, opt.img_size)result_filename = os.path.join(result_root, 'results.txt')frame_rate = dataloader.frame_rateframe_dir = None if opt.output_format == 'text' else os.path.join(result_root, 'frame')eval_seq(opt, dataloader, 'mot', result_filename,save_dir=frame_dir, show_image=False, frame_rate=frame_rate)if __name__ == '__main__':os.environ['CUDA_VISIBLE_DEVICES'] = '0'opt = opts().init()recogniton()
接着,原来JDE关于视频加载是针对真正的视频的,对于摄像头这种无限视频流,修改其帧数为无限大(很大很大的整数值即可),也就是将src/lib/datasets/dataset/jde.py
中LoadVideo
修改如下。
class LoadVideo:def __init__(self, path, img_size=(1088, 608)):self.cap = cv2.VideoCapture(path)self.frame_rate = int(round(self.cap.get(cv2.CAP_PROP_FPS)))self.vw = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))self.vh = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))if type(path) == type(0):self.vn = 2 ** 32else:self.vn = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))self.width = img_size[0]self.height = img_size[1]self.count = 0self.w, self.h = 1920, 1080print('Lenth of the video: {:d} frames'.format(self.vn))def get_size(self, vw, vh, dw, dh):wa, ha = float(dw) / vw, float(dh) / vha = min(wa, ha)return int(vw * a), int(vh * a)def __iter__(self):self.count = -1return selfdef __next__(self):self.count += 1if self.count == len(self):raise StopIteration# Read imageres, img0 = self.cap.read() # BGRassert img0 is not None, 'Failed to load frame {:d}'.format(self.count)img0 = cv2.resize(img0, (self.w, self.h))# Padded resizeimg, _, _, _ = letterbox(img0, height=self.height, width=self.width)# Normalize RGBimg = img[:, :, ::-1].transpose(2, 0, 1)img = np.ascontiguousarray(img, dtype=np.float32)img /= 255.0return self.count, img, img0def __len__(self):return self.vn # number of frames
至此,读取视频流也通过一个粗暴的方式实现了,然后就是窗口显示了,原来项目中跟踪器只会一帧一帧写入跟踪后的结果图像,然后通过ffmpeg
将这些图像组合为视频。不过,原项目已经设计了实时显示跟踪结果窗口的接口了,只需要调用track.py
中的eval_seq
函数时,参数show_image
设置为True
即可。不过,也许作者并没有测试过这个模块,这里显示会有些问题,务必将eval_seq
中下述代码段进行如下修改。
if show_image:cv2.imshow('online_im', online_im)cv2.waitKey(1)
调整完成后,输入下面的命令运行跟踪脚本(命令行Ctrl+C停止跟踪,跟踪的每一帧存放在指定的output-root
目录下的frame
目录中)。
python camera.py mot --load_model ../models/fairmot_dla34.pth --output-root ../results
上图是我实际测试得到的运行结果,摄像头分辨率比较低并且我做了一些隐私模糊处理,不过,整个算法的实用性还是非常强的,平均FPS也有18左右(单卡2080Ti)。
补充说明
本文对FairMOT源码进行了简单粗暴的修改以实现了一个摄像头视频实时跟踪系统,只是研究FairMOT代码闲暇之余的小demo,具体代码可以在我的Github找到。
FairMOT实时多目标跟踪相关推荐
- ByteTrack实时多目标跟踪
去年的1024我写了一篇FairMOT实时多目标跟踪,兜兜转转,一年过去了,最近FairMOT原作者发布了更快更强的ByteTrack,也就有了这篇文章,有种恍如隔世之感. 简介 ByteTrack是 ...
- 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 关键词:目标跟踪 计算机视觉 教程 目 ...
- 用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 目标跟踪 (Object Tracking) 是 ...
- 业界首个实时多目标跟踪系统开源
(图片由AI科技大本营付费下载自视觉中国) 作者 | CV君 来源 | 我爱计算机视觉(ID:aicvml) 相对业界研究比较多的单目标跟踪,多目标跟踪(Multi-Object Tracking,M ...
- 【论文阅读 - YolTrack】YolTrack:基于MTL的自动车辆实时多目标跟踪和分割
本文2021.12发表于IEEE TRANSACTIONS ON NEURAL NETWORKS AND LEARNING SYSTEMS,作者来自哈工大.本文的主要贡献在于提出了一种新的神经网络模型 ...
- 【深度学习】Yolov5_DeepSort_Pytorch:基于 Yolov5 + Deep Sort 的实时多目标跟踪器
简介 该存储库包含一个两阶段跟踪器.YOLOv5(一系列在 COCO 数据集上预训练的对象检测架构和模型)生成的检测被传递到跟踪对象的 Deep Sort 算法.它可以跟踪Yolov5 模型经过训练可 ...
- 恭喜!1024博客专家TOP 50榜单出炉!
文章作者 文章标题 文章链接 A757291228 一篇文带你从0到1了解建站及完成CMS系统编写 https://blog.csdn.net/A757291228/article/details/1 ...
- 2020年1024活动Top50的博主名单总结分析,请为你喜欢的博主打Call!(精选文章整合)
我整理了本次1024活动Top前50名博客专家的博文!毋庸置疑,定是官方精选!为你喜欢的博主打Call! 1. 可以在评论区评论: 我要为XXX博主打Call! 我会将TA放到前面!该博主本人也可以为 ...
- Cuda环境搭建并部署多目标跟踪模型FairMOT推理验证
FairMOT(Fairness of Detection and Re-Identification in Multiple Object Tracking)是一种基于深度学习的多目标跟踪算法,采用 ...
最新文章
- 《程序员》2007第2期,新产品工具点评 特别推荐“万能数据库查询分析器”发布...
- 凡客即便走小米模式也很难
- 集群中几种session同步解决方案的比较[转]
- 百度VS谷歌?搜索质量评判也要讲基本法
- Yarn取代job/task tracker
- idea cloud bootstrap是啥_application.yml与bootstrap.yml的区别
- Linux 出现Permission denied的解决办法
- java 编译class_.java文件怎样编译成.class文件,你值得一看的技巧
- eclipse -xmx -xms_JVM 调优之 Eclipse 启动调优实战
- (2019.12.21已解决)pdf有密码如何打印
- 【hexo】fluid中文乱码问题解决
- wav音频文件转换为sbc音频文件
- 搜狗浏览器安装第三方插件(crx和zip)
- iOS 一键加入QQ群
- Spring Cloud入门+深入(十二)-Gateway网关(一)
- QTableWidget表格控件的用法
- 前端阿里矢量图的使用步骤
- 背景图通栏html,网页图片通栏实现的思路,谁能指导一下?_html/css_WEB-ITnose
- EasyUIdatetimebox使用
- [附源码]Nodejs计算机毕业设计宿舍人员签到管理系统Express(程序+LW)