yolov5+Deepsort实现目标跟踪_oserror: /home/chen/anaconda3/envs/deepsort_copy/l-程序员宅基地

技术标签: yolov5  Deepsort  深度学习  目标跟踪  

一、参考资料

项目源码
pytorch yolo5+Deepsort实现目标检测和跟踪

工程落地

YoloV5 + deepsort + Fast-ReID 完整行人重识别系统(三)
yolov5-deepsort-pedestrian-counting
Yolov5-Deepsort-Fastreid

二、相关介绍

Deepsort是实现目标跟踪的算法,从sort(simple online and realtime tracking)演变而来。其使用卡尔慢滤波器预测所检测对象的运动轨迹,匈牙利算法将它们与新检测的目标匹配。Deepsort易于使用,且速度快,成为AI目标检测跟踪的热门算法。

三、重要说明

  1. yolov5可检测多种类型的目标,而Deepsort目标跟踪只能跟踪一种类型目标,例如person、car。所以,跟踪需要把yolov5的目标检测类型数量限制成单个类型检测。coco数据集定义:person=0,car=2。

    # 行人跟踪
    python track.py --classes 0 --source demo_person.mp4  
    
    # 小汽车跟踪
    python track.py --classes 2 --source demo_car.mp4
    
  2. yolov5提供不同检测精度的权重文件,yolov5x.pt比yolov5s.pt精度高。应用跟踪时,当两个目标重叠后再分离,yolov5s.pt会出现标注数改变。比如,目标10和目标20发生重叠分离,目标10变成了目标15,而目标20不变(目标20遮挡目标10)。此种情况,用yolov5x.pt会好很多,维持目标10不变。

  3. yolov5限定单个类型,不需要重新训练。faster rcnn、ResNet限定单个类型,单需要重新训练。

  4. yolov5的速度明显优于FastRCNN,且消耗GPU资源少。用FastRCNN,还没用到Deepsort,只看逐帧检测,速度比yolov5+Deepsort逐帧目标检测还要慢,且GPU使用率达到95%。

  5. yolov5的训练速度比Faster RCNN、ResNet50、FPN快。

四、实验环境

4.1 系统环境

Environment
Operating System + Version: Ubuntu + 16.04
GPU Type: GeForce GTX1650,4GB
Nvidia Driver Version: 470.63.01
CUDA Version: 10.2.300
CUDNN Version: 7.6.5
Python Version (if applicable): 3.6.14
virtualenv:20.13.0
gcc:7.5.0
g++:7.5.0

4.2 requirements-gpu.txt

absl-py==1.0.0
cached-property==1.5.2
cachetools==4.2.4
certifi==2021.10.8
charset-normalizer==2.0.10
cycler==0.11.0
Cython==0.29.26
dataclasses==0.8
distlib==0.3.4
easydict==1.9
filelock==3.4.1
flake8==4.0.1
future==0.18.2
gdown==3.10.1
google-auth==2.3.3
google-auth-oauthlib==0.4.6
grpcio==1.43.0
h5py==3.1.0
idna==3.3
imageio==2.13.5
importlib-metadata==4.2.0
importlib-resources==5.4.0
isort==4.3.21
kiwisolver==1.3.1
Markdown==3.3.5
matplotlib==3.3.4
mccabe==0.6.1
numpy==1.19.5
oauthlib==3.1.1
opencv-python==4.5.5.62
pandas==1.1.5
Pillow==8.4.0
platformdirs==2.4.0
protobuf==3.19.3
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycodestyle==2.8.0
pyflakes==2.4.0
pyparsing==3.0.6
PySocks==1.7.1
python-dateutil==2.8.2
pytz==2021.3
PyYAML==6.0
requests==2.27.1
requests-oauthlib==1.3.0
rsa==4.8
scipy==1.5.4
seaborn==0.11.2
six==1.16.0
tb-nightly==2.8.0a20220117
tensorboard-data-server==0.6.1
tensorboard-plugin-wit==1.8.1
torch==1.9.0+cu102
torchvision=0.10.0+cu102
tqdm==4.62.3
typing_extensions==4.0.1
urllib3==1.26.8
virtualenv==20.13.0
Werkzeug==2.0.2
yacs==0.1.8
yapf==0.32.0
zipp==3.6.0

五、关键步骤

5.1 下载 github 仓库代码

5.1.1 下载 Yolov5_DeepSort_Pytorch

git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git

5.1.2 项目目录

.
├── deep_sort
│   ├── configs
│   ├── deep
│   ├── deep_sort.py
│   ├── __init__.py
│   ├── LICENSE
│   ├── __pycache__
│   ├── README.md
│   ├── sort
│   └── utils
├── inference  # infer 推理的结果
│   └── output
├── LICENSE
├── MOT16_eval
│   ├── eval.sh
│   ├── track_all.gif
│   └── track_pedestrians.gif
├── README.md
├── requirementes-gpu.txt
├── requirements.txt
├── runs
│   └── track
├── track.py
├── venv  # virtualenv 创建的虚拟环境
│   ├── bin
│   ├── lib
│   └── pyvenv.cfg
├── yolov5  # clone yolov5 to this path
│   ├── CONTRIBUTING.md
│   ├── data
│   ├── detect.py
│   ├── Dockerfile
│   ├── export.py
│   ├── hubconf.py
│   ├── LICENSE
│   ├── models
│   ├── README.md
│   ├── requirements.txt
│   ├── setup.cfg
│   ├── train.py
│   ├── tutorial.ipynb
│   ├── utils
│   ├── val.py
│   └── weights

5.1.3 下载 yolov5

下载到 Yolov5_DeepSort_Pytorch根目录下,删除之前的yolov5文件夹。

git clone https://github.com/ultralytics/yolov5.git

5.1.4 修改文件夹名称

deep-person-reid
改为
reid

5.2 环境配置

5.2.1 (可选)创建virtualenv虚拟环境

# 进入项目路径
cd Yolov5_DeepSort_Pytorch

# 创建虚拟环境
virtualenv --system-site-packages -p /usr/bin/python venv

# 激活虚拟环境
source ./venv/bin/activate

5.2.2 安装依赖包

# 安装依赖包
pip install -r requirements.txt

5.3 下载预训练模型

选择目标检测模型:yolov5;
选择DeepSort模型:ReID;

5.3.1 下载yolov5预训练模型

下载地址,并放入目录 Yolov5_DeepSort_Pytorchyolo5/weights

比如, yolov5s.pt

python track.py --source 0 --yolo_model yolov5/weights/yolov5n.pt --img 640
                                        yolov5/weights/yolov5s.pt
                                        yolov5/weights/yolov5m.pt
                                        yolov5/weights/yolov5l.pt 
                                        yolov5/weights/yolov5x.pt --img 1280
                                        ...

5.3.2 下载Deepsort预训练模型

下载地址,放入目录 Yolov5_DeepSort_Pytorch/deep_sort_pytorch/deep_sort/deep/checkpoint

比如,osnet_x1_0

python track.py --source 0 --deep_sort_model osnet_x1_0
                                             nasnsetmobile
                                             resnext101_32x8d

5.4 infer推理测试

python track.py --source 0 --yolo_model yolov5/weights/yolov5n.pt --deep_sort_model osnet_x1_0 --img 640
(venv) yichao@yichao:~/MyDocuments/Yolov5_DeepSort_Pytorch$ python track.py --source 0 --yolo_model yolov5/weights/yolov5s.pt --deep_sort_model osnet_x1_0 --img 640
deep_sort/deep/reid/torchreid/metrics/rank.py:12: UserWarning: Cython evaluation (very fast so highly recommended) is unavailable, now use python evaluation.
  'Cython evaluation (very fast so highly recommended) is '
Successfully loaded imagenet pretrained weights from "/home/yichao/MyDocuments/Yolov5_DeepSort_Pytorch/deep_sort/deep/checkpoint/osnet_x1_0_imagenet.pth"
Selected model type: osnet_x1_0
YOLOv5  v6.0-193-gdb1f83b torch 1.9.0+cu102 CUDA:0 (NVIDIA GeForce GTX 1650, 3904MiB)

YOLOv5  v6.0-193-gdb1f83b torch 1.9.0+cu102 CUDA:0 (NVIDIA GeForce GTX 1650, 3904MiB)

weight_path: yolov5/weights/yolov5s.pt
weight_path: yolov5/weights/yolov5s.pt
Fusing layers... 
Model Summary: 224 layers, 7266973 parameters, 0 gradients
1/1: 0...  Success (inf frames 640x480 at 30.00 FPS)

0: 480x640 1 person, Done. YOLO:(0.428s), DeepSort:(0.220s)
0: 480x640 1 person, Done. YOLO:(0.023s), DeepSort:(0.020s)
0: 480x640 1 person, Done. YOLO:(0.010s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
...
...
...

5.5 修改源码

由于预训练模型是手动下载的,所以需要修改源码中的路径。

修改 osnet_ain.py 源码

# 源码路径
Yolov5_DeepSort_Pytorch/deep_sort/deep/reid/torchreid/models/osnet.py

cached_file = os.path.join(model_dir, filename)
改为
cached_file = "/home/yichao/MyDocuments/Yolov5_DeepSort_Pytorch/deep_sort/deep/checkpoint/osnet_x1_0_imagenet.pth"

5.6 infer推理速度

0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.010s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.010s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.011s), DeepSort:(0.013s)
0: 480x640 1 person, Done. YOLO:(0.010s), DeepSort:(0.013s)

# yolov5+Deepsort,大约24ms,即41FPS
# DeepSort 的速度取决于画面中目标的数目,上述数据是在单目标的情况下进行统计的。

5.7 显存占用情况

Tue Jan 18 16:06:27 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.63.01    Driver Version: 470.63.01    CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
| 27%   43C    P0    44W /  75W |   1895MiB /  3903MiB |     79%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1529      G   /usr/lib/xorg/Xorg                218MiB |
|    0   N/A  N/A      5928      C   python                           1673MiB |
+-----------------------------------------------------------------------------+

六、TensorRT加速目标跟踪

YoloV5+DeepSort+TensorRT 目标检测、跟踪
yolov5_deepsort_tensorrt_cpp

七、可能存在的问题

Q1: 缺少 _bz2 文件

  File "/usr/local/lib/python3.6/bz2.py", line 23, in <module>
    from _bz2 import BZ2Compressor, BZ2Decompressor
ModuleNotFoundError: No module named '_bz2'
错误原因:
缺少 _bz2.cpython-36m-x86_64-linux-gnu.so 文件

解决办法:
把系统自带Python3.6的“_bz2.cpython-36m-x86_64-linux-gnu.so”文件,放到Python3.8的文件夹中。

如果是Python3.8版本,也可以把文件改名后,放到Python3.6的文件夹中。

sudo cp /home/yichao/miniconda3/envs/compress_model/lib/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-linux-gnu.so /usr/local/lib/python3.6/lib-dynload/

Q2: 缺少 DetectMultiBackend

Traceback (most recent call last):
  File "track.py", line 24, in <module>
    from yolov5.models.common import DetectMultiBackend
ImportError: cannot import name 'DetectMultiBackend'
错误原因:
博主使用的不是最新版本的yolov5,且使用的分支是v5.0,yolov5/models/common文件中暂不支持DetectMultiBackend。

解决办法:
下载最新版本的yolov5,切换到最新的分支v6.0。
git clone https://github.com/ultralytics/yolov5.git

git checkout -b 新分支名称(创建) tag_name

Q3: CUDA错误

  File "./yolov5/models/yolo.py", line 222, in fuse
    m.conv = fuse_conv_and_bn(m.conv, m.bn)  # update conv
  File "./yolov5/utils/torch_utils.py", line 207, in fuse_conv_and_bn
    fusedconv.weight.copy_(torch.mm(w_bn, w_conv).view(fusedconv.weight.shape))
RuntimeError: CUDA error: CUBLAS_STATUS_INTERNAL_ERROR when calling `cublasCreate(handle)`
错误原因:
pytorch的版本问题,博主由于粗心,安装了CPU版本的Pytorch和pytorchvision。
torch-1.8.0-cp36-cp36m-linux_x86_64.whl
torchvision-0.9.0-cp36-cp36m-linux_x86_64.whl

解决办法:
安装GPU版本的pytorch和pytorchvison。

torch-1.9.0+cu102-cp36-cp36m-linux_x86_64.whl
torchvision-0.10.0+cu102-cp36-cp36m-linux_x86_64.whl

pytorch与pytorchvision版本对齐,参考 [Pytorch安装教程](https://blog.csdn.net/m0_37605642/article/details/117855911)

Q4: pytorch版本问题

File "/home/yichao/MyDocuments/Yolov5_DeepSort_Pytorch/venv/lib/python3.6/site-packages/torchvision/extension.py", line 63, in _assert_has_ops
    "Couldn't load custom C++ ops. This can happen if your PyTorch and "
RuntimeError: Couldn't load custom C++ ops. This can happen if your PyTorch and torchvision versions are incompatible, or if you had errors while compiling torchvision from source. For further information on the compatible versions, check https://github.com/pytorch/vision#installation for the compatibility matrix. Please check your PyTorch version with torch.__version__ and your torchvision version with torchvision.__version__ and verify if they are compatible, and if not please reinstall torchvision so that it matches your PyTorch install.
错误原因:
博主由于粗心,安装了cpu版本的torchvision,与GPU版本的pytorch不匹配。
torchvision-0.10.0-cp36-cp36m-linux_x86_64.whl

解决办法:
卸载pytorchvision,安装GPU版本的pytorchvison。
torchvision-0.10.0+cu102-cp36-cp36m-linux_x86_64.whl
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37605642/article/details/122590352

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签