技术标签: 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目标检测跟踪的热门算法。
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
yolov5提供不同检测精度的权重文件,yolov5x.pt比yolov5s.pt精度高。应用跟踪时,当两个目标重叠后再分离,yolov5s.pt会出现标注数改变。比如,目标10和目标20发生重叠分离,目标10变成了目标15,而目标20不变(目标20遮挡目标10)。此种情况,用yolov5x.pt会好很多,维持目标10不变。
yolov5限定单个类型,不需要重新训练。faster rcnn、ResNet限定单个类型,单需要重新训练。
yolov5的速度明显优于FastRCNN,且消耗GPU资源少。用FastRCNN,还没用到Deepsort,只看逐帧检测,速度比yolov5+Deepsort逐帧目标检测还要慢,且GPU使用率达到95%。
yolov5的训练速度比Faster RCNN、ResNet50、FPN快。
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
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
git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git
.
├── 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
下载到 Yolov5_DeepSort_Pytorch
根目录下,删除之前的yolov5文件夹。
git clone https://github.com/ultralytics/yolov5.git
deep-person-reid
改为
reid
# 进入项目路径
cd Yolov5_DeepSort_Pytorch
# 创建虚拟环境
virtualenv --system-site-packages -p /usr/bin/python venv
# 激活虚拟环境
source ./venv/bin/activate
# 安装依赖包
pip install -r requirements.txt
选择目标检测模型:yolov5;
选择DeepSort模型:ReID;
下载地址,并放入目录 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
...
下载地址,放入目录 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
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)
...
...
...
由于预训练模型是手动下载的,所以需要修改源码中的路径。
修改 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"
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 的速度取决于画面中目标的数目,上述数据是在单目标的情况下进行统计的。
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 |
+-----------------------------------------------------------------------------+
YoloV5+DeepSort+TensorRT 目标检测、跟踪
yolov5_deepsort_tensorrt_cpp
_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/
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
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)
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
文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。
文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退
文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet
文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程
文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据
文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端
文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库
文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密
文章浏览阅读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
文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库
文章浏览阅读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
文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量