这是一篇如何使用DeepSORT的学习记录,依据https://github.com/nwojke/deep_sort的内容写出。注意这不是deep_sort_pytorch或deep_sort_yolov3的这2个git仓库介绍,也不是DeepSORT的实现原理介绍。这篇文章面向和笔者一样从未接触过相关内容,只是想看一看这些较新算法的效果和使用方法的人。或者说,这篇文章更像“操作指南”。
1.环境配置
1.1 建议使用VirtualEnv
笔者在依据原作者教程使用DeepSORT算法时,遇到了与环境配置有关的诸多问题。譬如,已经安装的package的版本和所需版本不同,且没有向下兼容。因此,使用VirtualEnv管理不同版本的包会比较方便。(当然,Conda也是可以的,而且可能效果更好。)
如果你不想使用虚拟环境,而是使用各个pip包的最新版本,请直接看1.3节的相关说明。
1.2 VirtualEnv安装与使用
Windows用户请用管理员身份允许命令提示符或者Powershell,Linux用户请自行添加sudo或者以root用户运行,必要时将pip换成pip3。
由于DeepSORT的依赖库版本较旧(如必须安装旧版Scikit-learn),所需Python版本也较旧。可以在下列网址下载旧版Python:https://www.python.org/downloads/windows/。这里我们使用Python 3.6版本。如果您安装了更新的版本,并不需要卸载,另找一个地方安装即可。
如果你的设备连接官方pip源下载较慢,可以考虑更换源,例如换成国内的清华源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装VirtualEnv:
pip install virtualenv
到您希望创建虚拟环境的文件夹下,输入virtualenv [-p <使用Python的路径>] <环境名>
,例如:
virtualenv -p D:\Python36\Python.exe deepsort
上述命令假定将Python 3.6版本安装在了D:\Python36
文件夹,并创建一个名为deepsort
的虚拟环境。
为了进入虚拟环境,我们需要输入下列命令:
cd deepsort\Scripts
activate
其中,deepsort
是刚刚创建的环境名称,请换成您实际使用的名称。
此时,命令行最前面出现了(deepsort)
字样,表明我们已经进入了虚拟环境。
输入pip list
指令,可以看到该虚拟环境中只有最基本的3个包:
环境内的包安装、卸载使用正常的pip命令即可。
为了退出环境,在Scripts文件夹下输入deactivate
即可,此时命令行最前面的(deepsort)
字样消失,表明退出虚拟环境。
1.3 安装依赖包
原作者使用了NumPy,Sklearn、OpenCV和Tensorflow等包。推荐使用如下命令以安装指定版本:
pip install numpy==1.19.5
pip install opencv-python
pip install scipy
pip install scikit-learn==0.19.2
pip install matplotlib
pip install tensorflow==1.15
scikit-learn此处安装0.19.2,参考自这里。
兼容性问题说明
NumPy
(可选修改)需要将代码中的np.int
更换为int
。
Scikit-learn
(必须修改)使用Scikit-learn(版本>=0.23)时,由于sklearn.utils.linear_assignment_
模块弃用,需要使用 scipy.optimize.linear_sum_assignment
替代,并适当调整代码。需要修改deep_sort\linear_assignment.py
:
#第4行附近
#from sklearn.utils.linear_assignment_ import linear_assignment
from scipy.optimize import linear_sum_assignment as linear_assignment
#第59行附近
#indices = linear_assignment(cost_matrix)
indices = np.array(linear_assignment(cost_matrix)).transpose()
Tensorflow
(必须修改)使用Tensorflow 2时(Tensorflow 1系列不受影响),需要额外安装tf_slim
,并修改如下代码,才能正常使用freeze_model.py和generate_detections.py:
#tools/freeze_model.py:第3,4行附近
#import tensorflow as tf
#import tensorflow.contrib.slim as slim
import tf_slim as slim
import tensorflow.compat.v1 as tf
#tools/generate_detections.py:第7行附近
#import tensorflow as tf
import tensorflow.compat.v1 as tf
#第80,81行附近,参考自https://github.com/nwojke/deep_sort/issues/217
#self.input_var = tf.get_default_graph().get_tensor_by_name("net/%s:0" % input_name)
#self.output_var = tf.get_default_graph().get_tensor_by_name("net/%s:0" % output_name)
self.input_var = tf.get_default_graph().get_tensor_by_name("%s:0" % input_name)
self.output_var = tf.get_default_graph().get_tensor_by_name("%s:0" % output_name)
1.4 配置DeepSORT环境
如果您安装了git,您可以使用下列命令获取DeepSORT源码:
git clone https://github.com/nwojke/deep_sort.git
cd deep_sort
Github访问困难时,可选择gitee替代:
git clone https://gitee.com/godycc/deep_sort
cd deep_sort
如果您没有安装git,可以直接在https://github.com/nwojke/deep_sort或https://gitee.com/godycc/deep_sort下载源码并解压。
接下来,我们需要下载预生成的detections和checkpoint文件:链接
考虑到下载困难,这里提供两个备用链接:
百度网盘:链接,提取码:8dwh
我们还需要下载多目标跟踪检测数据集(MOT Benchmark)中的MOT16数据集:链接
如果直接下载有困难,也可使用如下备用链接:
百度网盘:链接,提取码:782p
下载后解压,您应该保持如下的文件夹结构:
2 DeepSORT实践
2.1 快速体验
我们之前下载好的文件包含了DeepSORT使用的模型(networks文件夹),MOT数据集的目标检测结果(detections文件夹),而deep_sort_app.py
模块可以标记各个目标并跟踪它们的运动。
输入python deep_sort_app.py -h
可以查看使用方法和各种选项,以下是原作者给出的一个跟踪器运行示例。该示例运行了MOT16-06数据集的多目标跟踪的结果。
python deep_sort_app.py --sequence_dir=./MOT16/test/MOT16-06 --detection_file=./resources/detections/MOT16_POI_test/MOT16-06.npy --min_confidence=0.3 --nn_budget=100 --display=True
接下来您会看到一个动画窗口,显示跟踪效果:
2.2 自己生成detections
上一节我们使用了原作者预先生成好的detections文件直接进行跟踪。在这一节中,我们将继续使用MOT16数据集,但是自行目标检测并生成detections文件。(此时你已经可以删除原有的detections文件夹了。当然也可以不删除,毕竟没有必要。)
输入以下命令,你将使用原作者提供mars-small128.pb描述的模型,对./MOT16/test
路径中所有的图片序列进行目标检测,并将检测结果以npy文件形式存储到./resources/detections/MOT16_train
路径中:
python tools/generate_detections.py --model=resources/networks/mars-small128.pb --mot_dir=./MOT16/test --output_dir=./resources/detections/MOT16_test
这一步的时间会较长,需要耐心等待。
上述npy文件中存储了每一帧中的目标特征,以便deep_sort_app.py
确定不同帧中某目标是同一个物体运动产生的。文件的具体格式请参见原作者的Github仓库。
这一次我们使用MOT16-01数据集。运行下列命令,可以看到和上一节类似的效果:
python deep_sort_app.py --sequence_dir=./MOT16/test/MOT16-01 --detection_file=./resources/detections/MOT16_test/MOT16-01.npy --min_confidence=0.3 --nn_budget=100 --display=True