简介

FairMOT是今年很火的一个多目标跟踪算法,前不久也开放了最新版本的论文,并于最近重构了开源代码,我也在实际工程视频上进行了测试,效果是很不错的。不过,官方源码没有提高实时摄像头跟踪的编程接口,我在源码的基础上进行了修改,增加了实时跟踪模块。本文介绍如何进行环境配置和脚本修改,实现摄像头跟踪(本文均采用Ubuntu16.04进行环境配置,使用Windows在安装DCN等包的时候会有很多问题,不建议使用)。

环境配置

下述环境配置需要保证用户已经安装了git和conda,否则配置pytorch和cuda会诸多不便。

首先,通过下面的git命令从Github克隆源码到本地并进入该项目。访问链接(提取码uouv)下载训练好的模型,在项目根目录下新建models目录(和已有的assetssrc等目录同级),将刚刚下载好的模型文件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.pyLoadVideo修改如下。

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实时多目标跟踪相关推荐

  1. ByteTrack实时多目标跟踪

    去年的1024我写了一篇FairMOT实时多目标跟踪,兜兜转转,一年过去了,最近FairMOT原作者发布了更快更强的ByteTrack,也就有了这篇文章,有种恍如隔世之感. 简介 ByteTrack是 ...

  2. 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型

    内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 关键词:目标跟踪   计算机视觉    教程 目 ...

  3. 用 YOLO v5+DeepSORT,打造实时多目标跟踪模型

    内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 目标跟踪 (Object Tracking) 是 ...

  4. 业界首个实时多目标跟踪系统开源

    (图片由AI科技大本营付费下载自视觉中国) 作者 | CV君 来源 | 我爱计算机视觉(ID:aicvml) 相对业界研究比较多的单目标跟踪,多目标跟踪(Multi-Object Tracking,M ...

  5. 【论文阅读 - YolTrack】YolTrack:基于MTL的自动车辆实时多目标跟踪和分割

    本文2021.12发表于IEEE TRANSACTIONS ON NEURAL NETWORKS AND LEARNING SYSTEMS,作者来自哈工大.本文的主要贡献在于提出了一种新的神经网络模型 ...

  6. 【深度学习】Yolov5_DeepSort_Pytorch:基于 Yolov5 + Deep Sort 的实时多目标跟踪器

    简介 该存储库包含一个两阶段跟踪器.YOLOv5(一系列在 COCO 数据集上预训练的对象检测架构和模型)生成的检测被传递到跟踪对象的 Deep Sort 算法.它可以跟踪Yolov5 模型经过训练可 ...

  7. 恭喜!1024博客专家TOP 50榜单出炉!

    文章作者 文章标题 文章链接 A757291228 一篇文带你从0到1了解建站及完成CMS系统编写 https://blog.csdn.net/A757291228/article/details/1 ...

  8. 2020年1024活动Top50的博主名单总结分析,请为你喜欢的博主打Call!(精选文章整合)

    我整理了本次1024活动Top前50名博客专家的博文!毋庸置疑,定是官方精选!为你喜欢的博主打Call! 1. 可以在评论区评论: 我要为XXX博主打Call! 我会将TA放到前面!该博主本人也可以为 ...

  9. Cuda环境搭建并部署多目标跟踪模型FairMOT推理验证

    FairMOT(Fairness of Detection and Re-Identification in Multiple Object Tracking)是一种基于深度学习的多目标跟踪算法,采用 ...

最新文章

  1. 《程序员》2007第2期,新产品工具点评 特别推荐“万能数据库查询分析器”发布...
  2. 凡客即便走小米模式也很难
  3. 集群中几种session同步解决方案的比较[转]
  4. 百度VS谷歌?搜索质量评判也要讲基本法
  5. Yarn取代job/task tracker
  6. idea cloud bootstrap是啥_application.yml与bootstrap.yml的区别
  7. Linux 出现Permission denied的解决办法
  8. java 编译class_.java文件怎样编译成.class文件,你值得一看的技巧
  9. eclipse -xmx -xms_JVM 调优之 Eclipse 启动调优实战
  10. (2019.12.21已解决)pdf有密码如何打印
  11. 【hexo】fluid中文乱码问题解决
  12. wav音频文件转换为sbc音频文件
  13. 搜狗浏览器安装第三方插件(crx和zip)
  14. iOS 一键加入QQ群
  15. Spring Cloud入门+深入(十二)-Gateway网关(一)
  16. QTableWidget表格控件的用法
  17. 前端阿里矢量图的使用步骤
  18. 背景图通栏html,网页图片通栏实现的思路,谁能指导一下?_html/css_WEB-ITnose
  19. EasyUIdatetimebox使用
  20. [附源码]Nodejs计算机毕业设计宿舍人员签到管理系统Express(程序+LW)

热门文章

  1. Java领域的对象如何传输-基于 socket 进行对象传输
  2. fullyRelease
  3. Redis LRU 淘汰原理
  4. 发布订阅之direct
  5. Servlet_生命周期详解
  6. Idea缺少Version Control 底部菜单
  7. logback日志记录器讲解
  8. Zuul指定Path+url以及指定可用的服务节点时如何负载均衡
  9. 分贝(BD)的含义以及关系(有助于深刻理解)
  10. JAVA NIO知识点总结(2)——直接缓冲区和非直接缓冲区