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}")

看到所有版本号都正确输出,恭喜你,环境搭建完成!

总结一下:这一章我们做了三件事:

  1. 用conda创建了独立的Python虚拟环境
  2. 安装了NumPy、SciPy、Scikit-learn、OpenCV、PyTorch等核心库
  3. 下载并验证了MOT16/17数据集

下一章,我们就开始动手写SORT算法的核心——卡尔曼滤波和匈牙利匹配。准备好了吗?


公众号:蓝海资料掘金营,微信deep3321