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

智能推荐

艾美捷Epigentek DNA样品的超声能量处理方案-程序员宅基地

文章浏览阅读15次。空化气泡的大小和相应的空化能量可以通过调整完全标度的振幅水平来操纵和数字控制。通过强调超声技术中的更高通量处理和防止样品污染,Epigentek EpiSonic超声仪可以轻松集成到现有的实验室工作流程中,并且特别适合与表观遗传学和下一代应用的兼容性。Epigentek的EpiSonic已成为一种有效的剪切设备,用于在染色质免疫沉淀技术中制备染色质样品,以及用于下一代测序平台的DNA文库制备。该装置的经济性及其多重样品的能力使其成为每个实验室拥有的经济高效的工具,而不仅仅是核心设施。

11、合宙Air模块Luat开发:通过http协议获取天气信息_合宙获取天气-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。  我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气

EasyMesh和802.11s对比-程序员宅基地

文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s

线程的几种状态_线程状态-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态

stack的常见用法详解_stack函数用法-程序员宅基地

文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法

2018.11.16javascript课上随笔(DOM)-程序员宅基地

文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树:  节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...

随便推点

layui.extend的一点知识 第三方模块base 路径_layui extend-程序员宅基地

文章浏览阅读3.4k次。//config的设置是全局的layui.config({ base: '/res/js/' //假设这是你存放拓展模块的根目录}).extend({ //设定模块别名 mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名 ,mod1: 'admin/mod1' //相对于上述 base 目录的子目录}); //你也可以忽略 base 设定的根目录,直接在 extend 指定路径(主要:该功能为 layui 2.2.0 新增)layui.exten_layui extend

5G云计算:5G网络的分层思想_5g分层结构-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构

基于二值化图像转GCode的单向扫描实现-程序员宅基地

文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。

算法随笔:强连通分量-程序员宅基地

文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量

Django(2)|templates模板+静态资源目录static_django templates-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates

linux下的GPU测试软件,Ubuntu等Linux系统显卡性能测试软件 Unigine 3D-程序员宅基地

文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...

推荐文章

热门文章

相关标签