复现FairMot踩坑记录

这篇博客详细介绍了如何在Ubuntu系统中配置环境并使用FairMOT进行多目标跟踪。首先,从GitHub上下载FairMOT代码并用VSCode打开。接着,创建名为FairMOT的conda环境,安装必要的库和依赖,包括PyTorch、CUDA和ffmpeg。在遇到lap安装错误时,通过更新和安装build-essential解决。随后,下载预训练模型并放置于models文件夹中。最后,运行测试脚本来验证模型性能,观察demos文件夹中的跟踪结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)打开官方的网站:

GitHub - ifzhang/FairMOT: [IJCV-2021] FairMOT: On the Fairness of Detection and Re-Identification in Multi-Object Trackinghttps://github.com/ifzhang/FairMOT(2)然后下载代码到本地

(3)打开vscode 读取文件

(4)创建环境

conda create -n FairMOT
conda activate FairMOT
conda install pytorch==1.7.0 torchvision==0.8.0 cudatoolkit=10.2 -c pytorch
cd ${FAIRMOT_ROOT}
pip install cython
pip install -r requirements.txt
git clone -b pytorch_1.7 https://github.com/ifzhang/DCNv2.git
cd DCNv2
./make.sh

 问题1: 

ERROR: Command errored out with exit status 1:
   command: /home/se8502/anaconda3/envs/fairmot/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-loqfqgxu/lap_27d2b6fda8f14025af34865b05f8ff1c/setup.py'"'"'; __file__='"'"'/tmp/pip-install-loqfqgxu/lap_27d2b6fda8f14025af34865b05f8ff1c/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-bqxx55fu

解決:

sudo apt update
sudo apt install build-essential

安装ffmpeg

打开终端

输入:

sudo apt update

sudo apt install ffmpeg

ffmpeg -version

输出应如下所示:

ffmpeg version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)

(5)下载模型

创建一个文件夹叫models

放入模型文件

(6)测试

cd src
python demo.py mot --load_model ../models/fairmot_dla34.pth --conf_thres 0.4
 
#指定GPU 因为我只有一个gpu所以是0 作者说 --conf_thres 可以设置为 0.3 到 0.7,具体取决于您自己的视频。
CUDA_VISIBLE_DEVICES=0 python demo.py mot --load_model ../models/fairmot_dla34.pth --conf_thres 0.4

在文件夹demos里面可以看到结果

结束

 

 

<think>嗯,用户想复现FairMOT模型的训练过程,但可能需要更具体的指导。首先,我需要回忆一下FairMOT的结构和训练步骤。FairMOT结合了目标检测和ReID特征提取,是一个联合检测与跟踪的模型。根据用户提供的引用,他们可能已经熟悉了YOLOv5和DeepSORT,但FairMOT有所不同,需要特定的数据集准备和训练流程。 首先,用户需要准备数据集。根据引用[4],训练跟踪模型通常需要MOT格式的数据集,比如MOT17。用户可能需要下载这些数据集,并按照指定的结构组织文件夹。比如,图像序列放在images文件夹,标注文件在annotations中。此外,数据预处理可能包括调整图像大小、归一化等,这需要参考FairMOT的官方代码。 接下来是模型结构。FairMOT使用CenterNet作为检测器,同时学习ReID特征。用户需要搭建双分支网络,一个用于检测,一个用于特征提取。这可能需要修改现有的检测模型,如将YOLOv5替换为CenterNet,并添加ReID分支。但根据引用[2]和[3],用户可能已经有用YOLOv5训练检测模型的经验,但FairMOT的结构不同,可能需要调整网络架构。 然后是训练过程。用户需要同时训练检测和ReID部分。损失函数包括检测的焦点损失和ReID的交叉熵损失。优化器设置和学习率调度也很重要,引用[3]中提到修改训练轮数和数据集路径,这可能同样适用于FairMOT。用户需要配置多任务损失,并平衡两者的权重,防止一方主导训练。 验证与调优部分,用户需要了解MOT评估指标,如MOTA、IDF1等。引用[4]中提到使用TrackEval进行评估,这可能同样适用于FairMOT。用户需要生成跟踪结果,并与基准真值比较。此外,调试过程中可能需要调整ReID特征的维度或数据增强策略,以提高跟踪的准确性。 可能遇到的挑战包括数据集格式的转换、多任务训练的平衡,以及模型收敛问题。例如,如果检测部分不够准确,跟踪效果会受影响。用户需要分阶段训练,可能先训练检测部分,再联合训练ReID,或者采用预训练的检测权重。 用户提供的引用主要涉及DeepSORT和YOLOv5的结合,但FairMOT是另一种方法,可能需要不同的处理流程。需要确保用户清楚FairMOT与DeepSORT的区别,比如联合检测和跟踪的方式。此外,用户可能需要参考FairMOT的官方实现,调整数据加载器和模型结构。 最后,生成相关问题时要覆盖数据集准备、模型结构、训练细节、评估方法以及常见问题,这样用户能全面了解复现过程的关键点。</think>### FairMOT模型训练复现步骤 #### 一、数据集准备 1. **数据集格式要求** FairMOT使用**MOT Challenge**格式数据集(如MOT17),需包含以下内容: - `images`文件夹:按视频序列存储图像帧(如`MOT17/train/MOT17-02/img1/*.jpg`) - `annotations`文件夹:包含标注文件`gt.txt`,每行格式为`<frame>,<id>,<x1>,<y1>,<w>,<h>,<conf>,<class>,<visibility>`[^4] - 数据预处理需将图像尺寸统一调整为$1088 \times 608$,并进行归一化处理 2. **数据集划分** 参考MOT官方划分方式: ```text MOT17/ ├── train/ │ ├── MOT17-02/ │ └── ... └── test/ ``` #### 二、模型结构搭建 1. **骨干网络选择** 使用HRNet-W18作为特征提取器,其输出包含: - 检测分支:生成热图$H \in \mathbb{R}^{H/4 \times W/4 \times C}$ - ReID分支:输出128维特征向量$\mathbf{f} \in \mathbb{R}^{128}$ 2. **联合训练结构** ```python class FairMOT(nn.Module): def __init__(self): super().__init__() self.backbone = HRNet() self.det_head = DetectionHead(64) # 检测头 self.reid_head = ReIDHead(128) # ReID头 def forward(self, x): features = self.backbone(x) det_output = self.det_head(features) reid_feat = self.reid_head(features) return det_output, reid_feat ``` #### 三、训练流程实现 1. **损失函数配置** - 检测损失:Focal Loss + L1损失 $$L_{det} = \lambda_{hm}L_{hm} + \lambda_{wh}L_{wh} + \lambda_{off}L_{off}$$ - ReID损失:交叉熵损失 $$L_{reid} = -\sum_{i=1}^{N} y_i \log(p_i)$$ - 总损失:$L_{total} = L_{det} + 0.1 \times L_{reid}$[^3] 2. **训练参数设置** ```yaml optimizer: type: Adam lr: 1e-4 weight_decay: 5e-4 scheduler: type: CosineAnnealingLR T_max: 30 ``` #### 四、验证与调优 1. **评估指标** | 指标 | 计算公式 | 目标值 | |--------|----------------------------|----------| | MOTA | $1-\frac{\sum(FN+FP+IDS)}{\sum GT}$ | >60% | | IDF1 | $\frac{2IDTP}{2IDTP+IDFP+IDFN}$ | >70% | 2. **训练监控** 使用TensorBoard观察关键指标变化: ```python writer.add_scalar('Train/Loss', loss.item(), global_step) writer.add_scalar('Val/MOTA', mota_score, epoch) ``` #### 五、完整代码框架 ```python # 数据加载 train_loader = DataLoader( MOTDataset(config.DATA_PATH), batch_size=32, shuffle=True ) # 模型初始化 model = FairMOT().cuda() optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) # 训练循环 for epoch in range(100): for imgs, targets in train_loader: pred_det, pred_reid = model(imgs) loss = calculate_loss(pred_det, pred_reid, targets) optimizer.zero_grad() loss.backward() optimizer.step() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高高呀~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值