2、环境搭建与工具准备:Python虚拟环境配置、依赖库安装、数据集准备
说实话,每次开始一个新项目,我最怕的就是环境配置。明明代码写好了,换个机器就跑不起来,这种坑我踩过太多次了。所以这一章,咱们把地基打牢,后面才能跑得顺畅。
2.1 Python虚拟环境——给你的项目一个独立小窝
为什么要用虚拟环境?说白了,就是防止不同项目之间的依赖打架。我有个血的教训:之前做目标检测项目用了PyTorch 1.8,后来做另一个项目需要PyTorch 2.0,结果两个库在同一个环境里互相覆盖,折腾了我一整天。
我个人习惯用 conda 来管理环境,当然 venv 也行。这里我推荐 conda,因为后面装PyTorch时它会自动处理CUDA依赖,省心不少。
创建虚拟环境:
# 创建一个名为 mot_env 的环境,Python版本指定为3.8
conda create -n mot_env python=3.8
# 激活环境
conda activate mot_env
# 退出环境
conda deactivate
嗯,这里要注意:Python版本别选太新。我建议3.8或3.9,因为很多老一点的库(比如某些版本的OpenCV)对3.10以上支持不太好。你想想看,要是装个库报错半天,多影响心情。
2.2 核心依赖库安装
接下来我们装几个关键库。这些是SORT和DeepSORT的骨架,缺一不可。
2.2.1 NumPy & SciPy——科学计算的基础
NumPy不用多说,做矩阵运算的标配。SciPy里我们主要用它的线性代数和优化模块,特别是后面做匈牙利匹配时会用到。
pip install numpy==1.21.0
pip install scipy==1.7.0
版本号我建议锁定,别装最新的。我在项目中遇到过,NumPy 1.24改了某些API,导致老代码报错。稳定第一,功能够用就行。
2.2.2 Scikit-learn——机器学习工具箱
DeepSORT里会用到一个叫 NearestNeighbors 的类,做特征匹配。虽然我们自己也能写,但何必重复造轮子呢?
pip install scikit-learn==0.24.2
2.2.3 OpenCV——图像处理的老朋友
OpenCV负责读视频、画框、做图像预处理。我建议装带contrib扩展包的版本,有些高级功能(比如某些跟踪算法)在基础包里没有。
pip install opencv-python==4.5.3.56
pip install opencv-contrib-python==4.5.3.56
避坑指南:我曾经在Ubuntu上直接 pip install opencv-python,结果发现视频解码功能不全,因为没装ffmpeg。后来改用conda安装才解决。如果你也遇到类似问题,试试:
conda install -c conda-forge opencv
2.2.4 PyTorch——深度学习引擎
DeepSORT的核心——特征提取网络,就是用PyTorch跑的。安装时最关键的是选对CUDA版本。
先看看你的显卡支持什么:
nvidia-smi # 查看CUDA版本
然后去PyTorch官网选对应的命令。比如CUDA 11.3就用:
pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 -f https://download.pytorch.org/whl/torch_stable.html
如果没有GPU,也别慌,装CPU版本也能跑,就是慢点:
pip install torch==1.10.0 torchvision==0.11.0
2.3 一键安装脚本
为了省事,我写了个requirements.txt,你直接跑就行:
numpy==1.21.0
scipy==1.7.0
scikit-learn==0.24.2
opencv-python==4.5.3.56
opencv-contrib-python==4.5.3.56
torch==1.10.0
torchvision==0.11.0
matplotlib==3.4.2 # 可视化用
filterpy==1.4.5 # 卡尔曼滤波库,后面会用到
安装命令:
pip install -r requirements.txt
2.4 数据集准备——MOT16/17
数据集是算法的粮食。MOT Challenge系列是行人多目标跟踪的基准数据集,我们主要用MOT16和MOT17。
2.4.1 数据集结构
下载后你会看到这样的目录结构:
MOT16/
├── train/
│ ├── MOT16-02/
│ │ ├── det/
│ │ ├── gt/
│ │ ├── img1/
│ │ └── seqinfo.ini
│ ├── MOT16-04/
│ └── ...
└── test/
├── MOT16-01/
└── ...
每个子序列包含:
- img1/:所有图片帧,按6位数字命名(如000001.jpg)
- gt/:标注文件gt.txt,格式为:帧号, 目标ID, 左上角x, 左上角y, 宽, 高, 置信度, 类别, 可见性
- det/:检测结果,格式同gt.txt,但只有检测框没有ID
- seqinfo.ini:序列信息,包括帧率、图片尺寸等
2.4.2 下载与解压
MOT16/17数据集需要去官网注册下载:https://motchallenge.net/
下载后解压到项目目录:
mkdir -p datasets
cd datasets
# 假设下载的是 MOT16.zip
unzip MOT16.zip
小技巧:如果你只是学习算法,不需要下载全部数据。MOT16-02和MOT16-05这两个序列就够用了,一个场景简单,一个场景复杂,对比着看效果很明显。
2.4.3 验证数据集是否可用
写个简单脚本检查一下:
import cv2
import os
dataset_path = "datasets/MOT16/train/MOT16-02"
img_dir = os.path.join(dataset_path, "img1")
# 检查图片数量
img_files = sorted(os.listdir(img_dir))
print(f"图片总数: {len(img_files)}")
# 读取第一张图看看
first_img = cv2.imread(os.path.join(img_dir, img_files[0]))
print(f"图片尺寸: {first_img.shape}")
# 检查标注文件
gt_path = os.path.join(dataset_path, "gt", "gt.txt")
with open(gt_path, 'r') as f:
lines = f.readlines()
print(f"标注框总数: {len(lines)}")
如果输出正常,说明数据集准备好了。
2.5 环境验证
最后,跑个综合测试,确保所有库都能正常调用:
import numpy as np
import scipy
import sklearn
import cv2
import torch
print(f"NumPy版本: {np.__version__}")
print(f"SciPy版本: {scipy.__version__}")
print(f"Scikit-learn版本: {sklearn.__version__}")
print(f"OpenCV版本: {cv2.__version__}")
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA是否可用: {torch.cuda.is_available()}")
# 简单测试:创建一个随机张量
x = torch.randn(3, 224, 224)
print(f"测试张量形状: {x.shape}")
看到所有版本号都正确输出,恭喜你,环境搭建完成!
总结一下:这一章我们做了三件事:
- 用conda创建了独立的Python虚拟环境
- 安装了NumPy、SciPy、Scikit-learn、OpenCV、PyTorch等核心库
- 下载并验证了MOT16/17数据集
下一章,我们就开始动手写SORT算法的核心——卡尔曼滤波和匈牙利匹配。准备好了吗?
公众号:蓝海资料掘金营,微信deep3321