目标检测、目标跟踪、重识别,这个项目里都有

标签: YOLO deepsort fastreid python yolov5 | 发表时间:2021-07-15 16:26 | 作者:迷途小书童
出处:https://xugaoxiang.com

环境

前言

前文 基于YOLOv5和DeepSort的目标跟踪 介绍过针对行人的检测与跟踪。本文介绍另一个项目,结合 FastReid 来实现行人的检测、跟踪和重识别。项目地址: https://github.com/zengwb-lx/Yolov5-Deepsort-Fastreid,作者给出的2个主要实例,也是非常的实用,包括行人流量的统计、人群中特定目标的查找与跟踪。

项目复现

首先,创建个全新的虚拟环境

  conda create -n pytorch1.6    python=3.7
conda activate pytorch1.6

接着去拉取源码

  git clone https://github.com/zengwb-lx/Yolov5-Deepsort-Fastreid.git
cd Yolov5-Deepsort-Fastreid

然后安装下其它的依赖包

  # 如果没有gpu的话,就按照requirements.txt安装即可
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html

# 编辑requirements.txt,注释掉torch和torchvision
pip install -r requirements.txt

# 使用cython加速
pip install cython
cd fast_reid/   fastreid/evaluation/rank_cylib
make all
cd ../../../../

先来跑个行人计数的 demo

     python person_count.py

yolov5 deepsort fastreid

yolov5的作者分别在 googleapigithub上都保存了模型文件,但是这2个 yolov5s.pt是不一样的,大家可以通过 md5sum去查看一下, github上的模型文件是对的

如果你在运行过程中出现下面的错误

  2021-07-13 14:22:20 [INFO]: Loading weights from ./deep_sort/deep/checkpoint/ckpt.t7... Done!
Traceback (most recent call last):
  File "person_count.py", line 244, in <module>
    yolo_reid.deep_sort()
  File "person_count.py", line 121, in deep_sort
    bbox_xywh, cls_conf, cls_ids, xy = self.person_detect.detect(video_path, img, ori_img, vid_cap)
  File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/person_detect_   yolov5.py", line 95, in detect
    pred = self.model(img, augment=self.augment)[0]
  File "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 111, in forward
    return self.forward_once(x, profile)  # single-scale inference, train
  File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 131, in forward_once
    x = m(x)  # run
  File "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 722, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 36, in forward
    self.training |= self.export
  File "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 772, in __getattr__
    type(self).__name__, name))
torch.nn.modules.module.ModuleAttributeError: 'Detect' object has no attribute 'export'

这个就是模型的问题,建议使用源码中自带的 shell脚本进行下载

  sh weights/download_weights.sh

我们来看看这个行人流量统计的基本原理:

首先,作者将 yolov5的目标检测封装成了一个类 Person_detect,通过它的 detect方法可以检测到视频中的每一个行人目标

然后,在画面中设定一条基准线,给定线条两端的坐标即可

  line = [(0, int(0.48 * ori_img.shape[0])), (int(ori_img.shape[1]), int(0.48 * ori_img.shape[0]))]
cv2.line(ori_img, line[0], line[1], (0, 255, 255), 4)

接着,创建跟踪器,开始对 yolov5检测出的每一个目标进行跟踪。这里以目标预测框的中心点为基准,下图是它的计算方法

yolov5 deepsort fastreid

如果前后帧的中心点所连成的直线和预先设定的基准线相交,则判定为越线,但是这里还有个方向的问题,向上还是向下?来看另一张图

yolov5 deepsort fastreid

作者利用了三角形的正切与反正切原理,使用 math模块中的 degrees方法来判断,如果这个角度 >0,说明是向上走,反之则为向下走

  def vector_angle(midpoint, previous_midpoint):
    x = midpoint[0] - previous_midpoint[0]
    y = midpoint[1] - previous_midpoint[1]
    return math.degrees(math.atan2(y, x))

看完行人计数的示例,我们再来看看特定目标的重识别示例

  python person_search_reid.py

报错了

  Fusing layers...
Traceback (most recent call last):
  File "person_search_reid.py", line 120, in <module>
    yolo_reid = yolo_reid(cfg, args, path=args.video_path)
  File "person_search_reid.py", line 35, in __init__
    self.   deepsort = build_tracker(cfg, args.sort, use_cuda=use_cuda)
  File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/deep_sort/__init__.py", line 18, in build_tracker
    max_age=cfg.DEEPSORT.MAX_AGE, n_init=cfg.DEEPSORT.N_INIT, nn_budget=cfg.DEEPSORT.NN_BUDGET, use_cuda=use_cuda)
  File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/deep_sort/deep_reid.py", line 29, in __init__
    self.extractor = Reid_feature()
  File "./fast_reid/demo/demo.py", line 84, in __init__
    cfg = setup_cfg(args)
  File "./fast_reid/demo/demo.py", line 35, in setup_cfg
    cfg.merge_from_file(args.config_file)
  File "./fast_reid/   fastreid/config/config.py", line 107, in merge_from_file
    cfg_filename, allow_unsafe=allow_unsafe
  File "./fast_reid/   fastreid/config/config.py", line 50, in load_yaml_with_base
    with PathManager.open(filename, "r") as f:
  File "./fast_reid/   fastreid/utils/file_io.py", line 357, in open
    path, mode, buffering=buffering, **kwargs
  File "./fast_reid/fastreid/utils/file_io.py", line 251, in _open
    opener=opener,
FileNotFoundError: [Errno 2] No such file or directory: '../../kd-r34-r101_ibn/config-test.yaml'

这是缺少配置文件,到下面的链接去下载

链接: https://pan.baidu.com/s/1bMG3qy7npecCh6AzNO-Zyw
提取码: hy1m

把这2个文件都存放在目录 kd-r34-r101_ibn下,然后修改源码 fast_reid/demo/demo.py中的第45行,将

  default='../../kd-r34-r101_ibn/config-test.yaml',

改成

  default='kd-r34-r101_ibn/config-test.yaml',

将第68行的

  default=['MODEL.WEIGHTS', '../../kd-r34-r101_ibn/model_final.pth'],

改成

  default=['MODEL.WEIGHTS', 'kd-r34-r101_ibn/model_final.pth'],

然后再次运行脚本 person_search_reid.py,可以得到

yolov5 deepsort fastreid

可以看到,由于事先已经提了2位行人( a1111111111b222222222222)的特征,所以,画面中能够识别出这2个人并进行跟踪。默认,特征文件保存在 fast_reid/query

特征提取

如果你也想要制作一个特征文件,可以按照下面的步骤进行

首先,需要截取目标人物的图片,存放在某个以特定目标命名的文件夹下,如我这里的 xugaoxiang.com,这样,后面进行识别的时候,就显示 xugaoxiang.com这个名字了。把这个文件夹拷贝到 fast_reid/query目录下,目录结构如下

  (pytorch1.6) xugaoxiang@1070Ti:~/Works/Yolov5-Deepsort-Fastreid/fast_reid/query$ tree
.
├── names.npy
├── query_features.npy
└── xugaoxiang.com
    ├── 10.png
    ├── 11.png
    ├── 12.png
    ├── 13.png
    ├── 14.png
    ├── 15.png
    ├── 1.png
    ├── 2.png
    ├── 3.png
    ├── 4.png
    ├── 5.png
    ├── 6.png
    ├── 7.png
    ├── 8.png
    └── 9.png

接下来执行

  cd fast_reid/demo
python person_bank.py

执行完毕后, query目录下的 query_features.npynames.npy就被更新了

最后,找个包含目标的视频测试下效果

yolov5 deepsort fastreid

yolov5 deepsort fastreid

工程下载

最后,将包含所需文件全部打包,需要的朋友自行下载

链接: https://pan.baidu.com/s/1JiFzo5_H7TKniZZPzjZK7A
提取码: nauu

参考资料

相关 [目标 目标 跟踪] 推荐:

目标检测、目标跟踪、重识别,这个项目里都有

- - YOLO – 迷途小书童的Note
ubuntu 18.04 64位. 前文 基于YOLOv5和DeepSort的目标跟踪 介绍过针对行人的检测与跟踪. 本文介绍另一个项目,结合 FastReid 来实现行人的检测、跟踪和重识别. 项目地址: https://github.com/zengwb-lx/Yolov5-Deepsort-Fastreid,作者给出的2个主要实例,也是非常的实用,包括行人流量的统计、人群中特定目标的查找与跟踪.

机器学习实践系列之5 - 目标跟踪 - 跟随技术的脚步-linolzhang的专栏 - CSDN博客

- -
目标跟踪(Object Tracking),很多专业人士都不陌生,它是计算机视觉里面 用于视频分析的一个很大的分类,就像目标检测一样,是视频分析算法的底层支撑.        目标跟踪的算法有很多,像 Mean-Shift、光流法、粒子滤波、卡尔曼滤波等 传统方法,也有 TLD、CT、Struct、KCF 等掺杂了某些 “外力”,不那么纯粹的方法.

下一个目标:广播

- yimin - It Talks-魏武挥的blog
从报纸杂志到书籍电视,传统媒体在全方位地受到数字媒体的冲击,数字革命的颠覆性正在横扫一切传统媒体的角落,现在看来,最后一个堡垒:广播业,也将迎来有力挑战. 美国著名传媒杂志《Media Life》在去年年底展望2011年全美传媒行业的时候,还很乐观地估计,广播行业将从09年的14%衰退中迎来复苏. 在当时,潘朵拉(Pandora.com)这类“网络电台”已经兴起,但该杂志依然满不在乎地说:“尽管Pandora互联网广播服务和其它网站可以依据个人喜好定制个性化网络电台服务,但那仍然属于小众市场.

我的愿望与目标

- bill boy - 嘉佑中文博客
中午,大学校友通过微信语音留言给我,说他要回家结婚了,7月5日走,要请我吃饭. 他们在台州本地的团购网站上预订了晚餐,我跟他们刚刚从九峰山下的某酒店吃完回来. 他们打算 10月2日 结婚,再三嘱咐我一定要过去参加他们的婚礼. 我肯定届时会去郑州,但是这很可能是最后一次在台州见他们. 又一个朋友,而且是很要好的朋友,就要走了,有点失落因为在台州又少了一个依靠,同时也让我多了一个离开黄岩的借口.

有目标?请闭嘴

- - Starming星光社最新更新
当你给了自己一个全新的目标,你会不会想要跟身边(亲密)的人分享它呢. 通常来讲,很多人都会说出来,在这种行为背后,有些是出于“期望获得来自他人的有效监督”的目的,而有些则纯粹是觉得“没什么好隐瞒的,不妨说出来”. 但如果效率天阶告诉你:当有一天你的目标宣告失败(或迟迟不能达成),其根本原因却仅仅是因为你“告诉别人了”,你会不会觉得难以置信呢.

谈技术团队目标

- - Tim[后端技术]
技术主管新年想得最多的一件事必定是如何比上一年做得更好. 宏大的目标设定每个团队都会做,谈几个不引人注意的小问题. 见过一些技术团队将计划定义为“按时完成需求”,需求驱动并没有什么不对,但是研发工作仅考虑被动需求的话是很难做好. 之前完成的许多需求有什么共性. 经常出问题/bug/故障的项目/功能/模块是哪些.

目标管理体系:OKR

- - 标点符
OKR体系的全称是Objectives & Key Results,即目标与关键成果. 所谓OKR,O = Objective 可以理解为企业目标,KR =Key Results 可以理解为关键结果. 浓缩在一起就是“为确保达成企业目标的关键结果分解与实施”. OKR是企业进行目标管理的一个简单有效的系统,能够将目标管理自上而下贯穿到基层.

一个网站,5个目标

- 韩叙 - 互联网的那点事...
这是最近看到的一篇很不错很实用的文章,主要侧重于设计前的思考、思路,看完有很大的启发,所以推荐给大家,因为是翻译的,翻译不准确的地方还请见谅~. 在生活中,拥有目标是非常重要的. 特别对于网站设计而言,因为没有目标就没有动力,更无法衡量你的成功与否. 目标有助于设计师专注于重要的事情,把握设计方案的走向.

42goals—目标追踪记录服务

- landy - 葡挞生活
42goals是一个目标执行记录(tracking)的服务,可以记录你的目标执行情况,比如你每周、每天的运动时间,跑步距离、起床时间等. 以前我也尝试过用google spreadsheet来就,但是现在google docs的服务不太稳定,就用42goals来替代. 42goals的界面比较简单,提供了每周、每月执行情况的统计功能,统计方式可以按照平均、求和、计数等方式来进行.