一些坑点
pyenv与虚拟环境
首先,安装pyenv和
为什么要用不同版本?
用pyenv主要是为了切换py版本。论文用的是py3.8.10,但是py3.8支持的torch所使用的cuda toolkit最新也支持不到cu128。50系显卡目前只能使用cu128的版本,因此可能要为此使用py3.9以尝试支持50系显卡(但还没试)。虽然也能用CPU推理,但实在是太慢了
超过py3.9一定不可行,一堆库有版本冲突,除非全部自己重写一遍
下面都是暂时以40系显卡下的cu118为例。
创建和切换环境
TileClipper需要创建两个不同的虚拟环境,使用如下命令创建:
pyenv virtualenv 3.8.10 <env-name>两个环境分别用于TileClipper本体和GroundTruth,都用3.8.10
创建后,用以下命令切换环境:
# 激活环境
pyenv activate <env-name>
# 退出环境
deactivate其中<env-name>是环境名
如何修改site-packages?
在GT中,需要将作者提供的ffmpeg相关的py文件解压后复制到site-packages中。在pyenv中,和其他虚拟环境的site-packages路径不一样。
pyenv的site-packages路径为:
~/.pyenv/versions/<python-version>/envs/<env-name>/lib/python3.8/site-packages其中<python-version>是目标环境的python版本,<env-name>是环境名。复制到这个目录即可
GPAC测试tiled视频
tiled视频不能被常规播放器播放,需要使用gpac
但是gpac默认ffmpeg解码器(至少windows是这样),它不完全支持HEVC的tile拼接语法
因此需要用以下命令指定解码器来播放tiled视频:
gpac -i <video.mp4> ohevcdec vout:directx其中<video.mp4>是目标视频路径
实验流程
1. TileClipper与GT环境准备
首先准备TileClipper本体的环境:
# 使用自动脚本安装pyenv,会连带安装pyenv-virtualenv
curl https://pyenv.run | bash
git clone https://github.com/shubhamchdhary/TileClipper.git
cd TileClipper
# 初始化所有子模块
git submodule update --init --recursive
# 创建并激活tileclipper本体虚拟环境
pyenv virtualenv 3.8.10 tileclipper-3.8
pyenv activate tileclipper-3.8
# 安装依赖
pip install -r src/requirements.txt然后准备GT的环境:
cd src/GT/
# 创建并激活GT的虚拟环境,和前面的隔离开
pyenv virtualenv 3.8.10 tileclipper-GT-3.8
pyenv activate tileclipper-GT-3.8
# 确保StrongSORTYOLO子模块被正确初始化
git submodule update --init --recursive
# 将两个用于标注groundtruth的脚本复制过去
cp detectTiles_StrongSORT.py IoUBasedMotionTracker_StrongSORT.py StrongSORTYOLO/
cd StrongSORTYOLO
# 安装GT的依赖
pip install -r requirements.txt
# 必须要有版本比较新的ffmpeg,他推荐4.2.7,但应该更新的版本也可以
sudo apt install ffmpeg=4.2.7还要解压ffmpeg_lib.zip,将其中的两个文件夹复制到GT虚拟环境中的site-packages
2. FFmpeg、GPAC与Kvazaar构建
安装FFmpeg(linux)
运行如下命令即可:
sudo apt install ffmpeg安装gpac(linux)
linux下最好用源码构建的方式,这件事不难,gpt问一下就行。
无论是否进行播放测试都要在linux中安装gpac。只是如果条件受限,能用的linux中没有比较好的gui支持的话,就看下面的windows构建,在windows中播放测试视频
安装gpac(windows)
https://gpac.io/downloads/gpac-nightly-builds/
下载直接安装即可,会自动添加path
安装kvazaar(linux)
linux下最好用源码构建的方式,随便找个位置运行如下命令:
git clone --recursive https://github.com/ultravideo/kvazaar.git
cd kvazaar
./autogen.sh
./configure
make -j$(nproc)
sudo make install
sudo ldconfig3.视频数据准备
一个待处理的视频数据应该放在/video1/mp4内,video1对应一个待处理的视频
后续对该视频的tile处理所产生的中间数据与结果都会存放在video1内,比如:

这里面tiled_4x4_mp4和segmented_0.5两个文件夹内的数据后续会用到
注意,处理的视频必须大于30s,因为一个视频处理时会被按0.5s为单位分为多个segment,而前60个segment是用来进行阈值分析的。如果少于60个segment就无法继续下去
4.Tile Encoding
这是实验的第一步,在项目根目录,TileClipper环境下运行:
python3 ./utils/script.py --path-to-mp4 <视频目录> --tiles 4x4 --res 1280x720其中<视频目录>是待处理的视频目录,视频应该在<视频目录>/mp4中,上面的示例中<视频目录>就是video1
script.py会将目标视频以0.5s为单位进行切分,并按4x4的结构分块。
已切分但还未Tiled的视频位于/<video>/segmented_0.5中,格式为.y4m。为了继续后面的GroundTruth标注,这里需要将没tiled的.y4m视频转换为.mp4。
不记得怎么转换了,反正可以用ffmpeg转,记得问下GPT补全这里
临时用可以直接让codex帮忙转,放在同目录下的一个新文件夹就行切分并Tiled的视频位于/<video>/tiled_4x4_mp4中,格式为.mp4
script.py对tiled视频切片的目录名做了长度限制,但是这会影响后面和GroundTruth标注对应。将script.py中所有形似下面的代码:
Path(path/("tiled_4x4_mp4/"+str(d.stem)[:10]))改为:
Path(path/("tiled_4x4_mp4/"+str(d.stem)))可以解决这个问题,后面就不用再改文件名了
5.Tile级的GroundTruth标注
首先进入GT目录并切换到GT的环境:
cd src/GT
deactivate
pyenv activate tileclipper-GT-3.8然后运行如下命令进行GT标注:
src/GT/StrongSORTYOLO$> python detectTiles_StrongSORT.py \
--source <已切分但未tiled的视频切片目录> \
--save-txt \
--tiled-video <任意一个tiled后的mp4切片> \
--classes 0 1 2 3 4 5 6 7 \
--save-labelfolder-name <输出目录>/\
--yolo-weight weights/yolov5x.pt其中<已切分但未tiled的视频切片目录>是上一步中对y4m切片进行转换后的结果
6.运行TileClipper
Calibration
首先,我们需要对tiled后的视频切片做calibrate。
仓库readme提供了一个目录要求很模糊的脚本,最好直接用calibrate.py。在TileClipper环境下运行如下命令即可:
python src/calibrate.py \
--tiled-video-dir <tiled视频目录> \
--assets-folder assets \其中<tiled-video-folder>是tiled后的视频切片目录。它会自动生成calibration的.pkl数据在assets/F2s下。
一共有两个结果,后面都要用到:第一个是f2s_<视频名>_cluster<cluster-size>.pkl;第二个是<视频名>_cluster_indices.pkl
TileClipper
然后是最核心的部分,对进行过GT标注并进行过Calibration的切片视频进行tile remove,去除不关键的tile:
python3 src/tileClipper.py \
--tiled-video-dir <tiled视频目录> \
--percentile-array-filename assets/F2s/<calibration的结果1>.pkl \
--cluster-indices-file assets/F2s/<calibration的结果2>.pkl \
--gamma 1.75运行后,就可以在<tiled视频目录>的上层目录中找到remove tile后的结果,它们是去除了不关键的tile后的mp4切片
7.生成labels
实验数据
bitrates
实验没给出下载数据的方式,但是用bitrates间接给出了他们曾经的实验结果。
bitrates用来对比不同情况下的码流大小,论文和作者的代码中比较的是不同方法处理后能比处理前节省多少带宽。