无脑019——MTMC代码复现 AI CITY CHALLENGE 2023 TRACK 1 TOP1 UWIPL_ERTI

2023-12-27 20:43:05

参考官网:
https://github.com/ipl-uw/AIC23_Track1_UWIPL_ETRI
下载code到这个文件夹下:
AIC23_Track1_UWIPL_ETRI-main
准备好100GB左右的硬盘空间,配置环境1天,代码运行1天,时间大概两天
在这里插入图片描述

1. conda 环境

创建环境,
注意,这个项目的环境,
既可以是一个conda环境,例如跟我一样,uwipl_etri,
也可以是相互独立的,比如mmyolo一个,mmpose一个,bot-sort一个
我这里比较懒,使用了一个

conda create -n uwipl_etri python==3.8
conda activate uwipl_etri

总共需要4个框架:
Installation for mmyolo*
Installation for mmpose
Installation for torchreid*
Installation for BoT-SORT

注意:咱们复现跑它的代码,这些环境不一定全部用上,但是最好全部安装,方便以后大家理解。其实也可以需要哪一部分就安装哪一部分,例如我只是学习,只安装BoT-SORT部分就可以了,就能使用它提供的初始模型,实现他们的效果。

1.1. mmyolo

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=10.2 -c pytorch
pip install openmim
mim install "mmengine>=0.6.0"
mim install "mmcv>=2.0.0rc4,<2.1.0"
mim install "mmdet>=3.0.0,<4.0.0"
#git clone https://github.com/open-mmlab/mmyolo.git
cd G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main
# Install albumentations
pip install -r requirements/albu.txt
# Install MMYOLO
mim install -v -e .

这个时候应该已经安装完成了,为了验证安装是否成功,可以进行如下测试:

mim download mmyolo --config yolov5_s-v61_syncbn_fast_8xb16-300e_coco --dest .
python demo/image_demo.py demo/demo.jpg yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth

# Optional parameters
# --out-dir ./output *The detection results are output to the specified directory. When args have action --show, the script do not save results. Default: ./output
# --device cuda:0    *The computing resources used, including cuda and cpu. Default: cuda:0
# --show             *Display the results on the screen. Default: False
# --score-thr 0.3    *Confidence threshold. Default: 0.3

如果报错,可以自己去解决,例如我的报错:

ImportError: DLL load failed while importing _imaging: 找不到指定的模块

说明pillow模块安装有问题,重新覆盖安装低版本的pillow

pip install pillow==8.3

报错mmdet等级过高:

AssertionError: MMDetection==3.2.0 is used but incompatible. Please install mmdet>=3.0.0rc6, <3.1.0.

于是重新安装mmde低等级版本

mim install "mmdet==3.0.0rc6"

如果运行成功,会在mmyolo/output文件夹下产出一张图片,就是一张椅子的预测结果
在这里插入图片描述
至此,mmyolo安装完成
此刻显示一下我的mim list版本

(uwipl_etri) G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main\mmyolo>mim list
Package    Version    Source
---------  ---------  -----------------------------------------------------------------------------------------
mmcv       2.0.1      https://github.com/open-mmlab/mmcv
mmdet      3.0.0rc6   https://github.com/open-mmlab/mmdetection
mmengine   0.10.1     https://github.com/open-mmlab/mmengine
mmyolo     0.5.0      g:\mtmc\ai_city_top_code\aic23_track1_uwipl_etri-main\aic23_track1_uwipl_etri-main\mmyolo

1.2. mmpose

因为这个团队的代码是单独的conda环境,所以跟我的还不一样,我是一开始不懂可以单独使用,更推荐大家安装单独的环境。
这个团队提供的mmpose版本有点低,不能在一个环境里用,所以我去官网下载的,解压出来mmpose-main

先进入文件夹
cd G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main\mmpose-main>
#git clone https://github.com/open-mmlab/mmpose.git
#cd mmpose
pip install -r requirements.txt
pip install -v -e .
# "-v" means verbose, or more output
# "-e" means installing a project in editable mode,
# thus any local modifications made to the code will take effect without reinstallation.

验证安装是否成功:

python demo/image_demo.py tests/data/coco/000000000785.jpg configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_hrnet-w48_8xb32-210e_coco-256x192.py https://download.openmmlab.com/mmpose/top_down/hrnet/hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth --out-file vis_results.jpg --draw-heatmap

结果保存到mmpose下的vis_results.jpg
在这里插入图片描述
目前安装的版本

(uwipl_etri) G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main\deep-person-reid>mim list
Package    Version    Source
---------  ---------  ----------------------------------------------------------------------------------------------
mmcv       2.0.1      https://github.com/open-mmlab/mmcv
mmdet      3.0.0rc6   https://github.com/open-mmlab/mmdetection
mmengine   0.10.1     https://github.com/open-mmlab/mmengine
mmpose     1.2.0      g:\mtmc\ai_city_top_code\aic23_track1_uwipl_etri-main\aic23_track1_uwipl_etri-main\mmpose-main
mmyolo     0.5.0      g:\mtmc\ai_city_top_code\aic23_track1_uwipl_etri-main\aic23_track1_uwipl_etri-main\mmyolo

1.3. torchreid

直接使用作者提供的安装包:
cd 进入目录

# cd to your preferred directory and clone this repo
#git clone https://github.com/KaiyangZhou/deep-person-reid.git

# create environment
cd  G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main\deep-person-reid
#conda create --name torchreid python=3.7
#conda activate torchreid

# install dependencies
# make sure `which python` and `which pip` point to the correct path
pip install -r requirements.txt

# install torch and torchvision (select the proper cuda version to suit your machine)
#conda install pytorch torchvision cudatoolkit=9.0 -c pytorch

# install torchreid (don't need to re-build it if you modify the source code)
python setup.py develop

运行最后一行代码报错:

AttributeError: module 'setuptools._distutils' has no attribute 'version'

覆盖安装

pip install setuptools==59.5.0

然后就可以正常安装了。

这个还不会验证,因为是可选项,先不仔细研究,先把整体模型跑通

1.4. Bot-SORT

因为这个队伍作者的代码已经修改了demo.py文件,无法测试是否安装成功,我更推荐使用BOT-SORT官方的代码来安装,最后只使用比赛队伍的tools文件夹里的内容。
例如我从官网下载代码:
https://github.com/NirAharon/BOT-SORT
解压到BOT-SORT-MAIN文件夹中

cd G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main\BoT-SORT-main
pip install -r requirements.txt
pip install cython
pip install cython_bbox
pip faiss-cpu #因为GPU版本的很麻烦,我直接用的cpu版本的

测试:
从bot-sort官网下载预训练模型到新建的文件夹/
G:\mtmc\ai_city_top_code\AIC23_Track1_UWIPL_ETRI-main\AIC23_Track1_UWIPL_ETRI-main\BoT-SORT-main\pretrained
在这里插入图片描述

然后运行我的测试代码:

官网的运行规范
#python tools/demo.py video --path <path_to_video> -f yolox/exps/example/mot/yolox_x_mix_det.py -c pretrained/bytetrack_x_mot17.pth.tar --with-reid --fuse-score --fp16 --fuse --save_result
它的测试
#python tools/demo.py video --path 1.mp4 -f yolox/exps/example/mot/yolox_x_mix_det.py -c pretrained/bytetrack_x_mot17.pth.tar --with-reid --fuse-score --fp16 --fuse --save_result

我的测试
python tools/demo.py video --path 1.mp4 -f yolox/exps/example/mot/yolox_m_mix_det.py -c pretrained/bytetrack_m_mot17.pth.tar --with-reid --fuse-score --fp16 --fuse --save_result

报错:

AttributeError: module 'numpy' has no attribute 'float'

因为numpy版本过高,降级就好了

pip install numpy==1.23

测试结果:
在这里插入图片描述
测试成功

2. 该队伍的代码测试

这部分按照它提示的流程进行
https://github.com/ipl-uw/AIC23_Track1_UWIPL_ETRI
可以直接把所需要的npy文件、模型等文件下载好,直接从2.2.3开始

2.1. 训练Training(可跳过)

2.1.1. (可跳过)训练目标检测模型

因为现有的目标检测模型对于真实世界的视频可以检测,但是比赛用的一部分数据是来自合成的数据,也就是NVIDIA 平台的元宇宙的数据,如下图所示,所以要使用yolov7目标检测模型继续训练一个检测人物的模型,来适配合成的数据,也可以跳过,直接使用目标检测的模型即可
在这里插入图片描述

2.1.2. (可跳过)训练ReID模型:

ReID模型也是同样的道理,这两部分我都没有训练,我想直接测试

2.2. 推理Inferencing

2.2.1. (可跳过)获取检测结果Get Detection

直接使用文件夹中的txt文件data/test_det

2.2.2. (可跳过)获取嵌入结果Get Embedding

https://drive.google.com/drive/folders/1qbwu37PlFSxmJIBLzJq1L9cAwryahAj7
从这个google云盘下载文件放在data/test_emb
一共11个文件 15GB左右,下载时间不短,

2.2.3. 获取脚点(但是我跳过了)

这部分用于继续优化,效果区别不大,我就没用。

2.2.4. 运行跟踪run_track.py

打开tools/run_tracking.py文件,可以看到他执行了三个命令:
在这里插入图片描述
分别是tools/aic_track.py
tools/aic_hungarian_cluster.py
tools/aic_hungarian_cluster_soo1.py
这三个文件,我们拆分来看这三个文件是什么作用。

2.2.4.1. tools/aic_track.py

这段代码是一个目标跟踪系统的实现,主要通过BoT-SORT(Bounding Box Tracker with Single Object Tracker)算法来进行目标跟踪。

该代码的目标跟踪结果保存在两个文件中:

SCT结果文件包含了每帧中检测到的目标的信息,而Tracklet结果文件包含了完整的目标轨迹信息。

SCT(Single Camera Tracking)结果文件:

文件路径:<root_path>/SCT/_.txt
结果格式:每行表示一个检测框的信息,包括帧号、目标ID、左上角坐标、宽度、高度、置信度等信息。
文件里的内容长这样子:
在这里插入图片描述
每一行都代表:
frame_id,person_id,x,y,w,h,conf,-1-1-1
帧号、目标ID、左上角坐标、宽度、高度、置信度等信息。注意看,这里有置信度,并且有三个-1

Tracklet结果文件:

文件路径:<root_path>/tracklet/_.pkl
结果格式:一个二进制文件,包含了跟踪轨迹的详细信息,可以使用pickle库进行反序列化。
我没有对这个文件详细了解,大家自行研究。

这个代码,正常运行,从22:17开始,到22:47才只把s001的test的frame处理完,就第一个s001大约4GB,处理的慢,后边比较快,用时40分钟,处理完test文件夹的所有图片,产生SCT和tracklet两个文件夹。
在这里插入图片描述

2.2.4.2. tools/aic_hungarian_cluster.py

聚类合成数据,因为我没有加入脚点,所以要修改代码中的enable_feet=False:

        _track_file.split('_')[-1][:-4]: load_tracking(_track_file, enable_feet=False) for _track_file in

这段代码的主要目标是对行人进行聚类,以获得每个行人的全局ID,并在后续分析中使用。、结果将被写入 hungarian_cluster 文件夹下
这部分产生的是S003-S022的场景,虽然没有用

2.2.4.3. tools/aic_hungarian_cluster_001.py

这个代码跟上一个差不多,就是生成的是真实数据的,生成的文件在 hungarian_cluster_001 文件夹下

2.2.5. 生成最终结果Generate final submission

cd ../BoT-SORT
python tools/aic_interpolation.py <root_path>
python tools/boundaryrect_removal.py <root_path>
python tools/generate_submission.py <root_path>

这部分其实提升的效果也不多,所以我就没继续研究,大家感兴趣可以自己看。

3. 可视化代码

其实到2.2.4就已经结束了,
这里插一个代码脚本,因为作者的代码中没看见,所以我写一下:来显示聚类后的txt对应视频的显示:
效果如下:
在这里插入图片描述
只有人物出现的帧,才会再submission.txt中,
这个代码是使用bot_sort 跟踪算法结果绘制到视频上的,要求你的txt文件中的内容是这样的:
0,4,1219.87,175.98,89.43,243.91,-1,-1,-1,-1
0,3,225.09,163.6,67.81,236.63,-1,-1,-1,-1
2,4,1219.51,173.51,89.41,247.18,-1,-1,-1,-1
2,3,224.97,163.17,67.82,237.36,-1,-1,-1,-1
2,2,361.32,313.33,131.7,448.91,-1,-1,-1,-1
每一行代表着:
frame_id,person_id,x,y,w,h,-1-1-1-1
如果没有人物出现的帧,是不会显示的。
使用下边的代码可以绘制并保存结果,你要自己创建一个output文件夹。

import cv2
import numpy as np
from tqdm import tqdm

def draw_boxes_on_frame(frame, boxes):
    for box in boxes:
        person_id, x, y, w, h = map(float, box[1:6])
        x, y, w, h = int(x), int(y), int(w), int(h)
        frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        # Display person_id as text in the top-left corner of the bounding box
        text = f'ID: {int(person_id)}'
        frame = cv2.putText(frame, text, (x, y - 10),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    return frame

def process_video(video_path, annotation_path,out_path):
    cap = cv2.VideoCapture(video_path)
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    with open(annotation_path, 'r') as f:
        annotations = [line.strip().split(',') for line in f.readlines()]

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(out_path, fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))

    for i in tqdm(range(total_frames)):
        ret, frame = cap.read()
        if not ret:
            break

        frame_boxes = [anno for anno in annotations if int(anno[0]) == i]
        if frame_boxes:
            frame = draw_boxes_on_frame(frame, frame_boxes)

        out.write(frame)

    cap.release()
    out.release()

if __name__ == "__main__":
    video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c001/video.mp4"
    annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c001.txt'
    out_path = "output/out_S001_C001.mp4"
    process_video(video_path, annotation_path,out_path)

    video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c002/video.mp4"
    annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c002.txt'
    out_path = "output/out_S001_C002.mp4"
    process_video(video_path, annotation_path, out_path)

    video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c003/video.mp4"
    annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c003.txt'
    out_path = "out_S001_C003.mp4"
    process_video(video_path, annotation_path, out_path)
    #
    # video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c004/video.mp4"
    # annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c004.txt'
    # out_path = "output/out_S001_C004.mp4"
    # process_video(video_path, annotation_path, out_path)
    #
    video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c005/video.mp4"
    annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c005.txt'
    out_path = "output/out_S001_C005.mp4"
    process_video(video_path, annotation_path, out_path)

    video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c007/video.mp4"
    annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c007.txt'
    out_path = "output/out_S001_C007.mp4"
    process_video(video_path, annotation_path, out_path)

    video_path = "/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/test/S001/c006/video.mp4"
    annotation_path = '/media/dell/t5/ai_city/AIC23_Track1_UWIPL_ETRI-main/data/final_n=15_dist200_pk_filter_margin_2/S001_c006.txt'
    out_path = "output/out_S001_C006.mp4"
    process_video(video_path, annotation_path, out_path)

祝大家,看的开心,也可以点个赞~👍

文章来源:https://blog.csdn.net/weixin_44298961/article/details/135122858
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。