/LVC-CC

Primary LanguagePython

简介

本项目用于LVC相关的crosscheck

安装依赖项

以下为我们目前使用的Dockerfile指令,仅供参考

FROM debian:12-slim AS builder

RUN sed -i 's/deb\.debian\.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list.d/debian.sources
RUN apt-get update && \
    apt-get install -y --no-install-recommends build-essential cmake unzip && \
    apt-get install -y git

# VTM
ADD VVCSoftware_VTM-VTM-11.0.tar.bz2 ./
RUN cd VVCSoftware_VTM-VTM-11.0 && \
    find . -type f -exec sed -i 's/-Werror//g' {} + && \
    cmake -S . -B build && \
    cmake --build build --config Release --parallel $($(nproc)-1) --target EncoderApp && \
    cmake --install build

# OpenCV
ADD opencv-4.10.0.tar.gz ./
RUN cd opencv-4.10.0 && \
    cmake -S . -B build -DBUILD_LIST="imgcodecs,imgproc" -DBUILD_SHARED_LIBS=OFF -DCV_TRACE=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DCPU_BASELINE=AVX2 -DCPU_DISPATCH=AVX2 -DBUILD_OpenCV_apps=OFF -DWITH_ADE=OFF -DWITH_DSHOW=OFF -DWITH_FFMPEG=OFF -DWITH_FLATBUFFERS=OFF -DWITH_GSTREAMER=OFF -DWITH_IMGCODEC_HDR=OFF -DWITH_IMGCODEC_PFM=OFF -DWITH_IMGCODEC_PXM=OFF -DWITH_IMGCODEC_SUNRASTER=OFF -DWITH_IPP=OFF -DWITH_JASPER=OFF -DWITH_JPEG=OFF -DWITH_LAPACK=OFF -DWITH_MSMF=OFF -DWITH_MSMF_DXVA=OFF -DWITH_OPENCL=OFF -DWITH_OPENEXR=OFF -DWITH_OPENJPEG=OFF -DWITH_PROTOBUF=OFF -DWITH_VTK=OFF -DWITH_WEBP=OFF -DWITH_TIFF=OFF && \
    make -C build -j$($(nproc)-1) && \
    make -C build install

# FFMpeg
ADD ffmpeg-release-amd64-static.tar.xz ./

# argparse
ADD argparse-3.1.tar.gz ./

# pugixml
ADD pugixml-1.14.tar.gz ./

# RLC4.0
RUN git clone --depth 1 https://github.com/SIGS-TZ/TLCT.git && \
    cd TLCT && \
    git checkout 97246a6 && \
    cmake -S . -B build -DTLCT_ENABLE_LTO=ON -DTLCT_ARGPARSE_PATH=/argparse-3.1 -DTLCT_PUGIXML_PATH=/pugixml-1.14 && \
    cmake --build build --config Release --parallel $($(nproc)-1) --target RLC40

# MCA
RUN git clone --depth 1 https://github.com/SIGS-TZ/MCA.git && \
    cd MCA && \
    git checkout a3fed08 && \
    cmake -S . -B build -DMCA_ENABLE_LTO=ON -DMCA_ARGPARSE_PATH=/argparse-3.1 -DTLCT_PUGIXML_PATH=/pugixml-1.14 -DMCA_TLCT_PATH=/TLCT && \
    cmake --build build --config Release --parallel $($(nproc)-1) --target mca-preproc mca-postproc

# LVC-CC
RUN mkdir LVC-CC-Wrap && \
    cd LVC-CC-Wrap && \
    git clone --depth 1 https://github.com/SIGS-TZ/LVC-CC.git && \
    cd LVC-CC && \
    git checkout 13b716b


FROM mcr.microsoft.com/devcontainers/python:3.12 AS prod

COPY --from=builder /ffmpeg-7.0.1-amd64-static/ffmpeg /usr/bin
COPY --from=builder VVCSoftware_VTM-VTM-11.0/bin/EncoderAppStatic /usr/bin
COPY --from=builder TLCT/build/src/bin/RLC40 /usr/bin
COPY --from=builder MCA/build/src/bin/mca-preproc /usr/bin
COPY --from=builder MCA/build/src/bin/mca-postproc /usr/bin
COPY --from=builder LVC-CC-Wrap ./

RUN cd LVC-CC && \
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
    pip install -U pip && \
    pip install .

WORKDIR /LVC-CC
CMD ["/bin/zsh"]

运行脚本

配置文件config.toml

在当前目录下新建config.toml文件,并参考下面的注释填充config.toml中对应字段的内容

frames = 30  # 跑几帧

[cases]
vtm_types = ["RA"]  # 填VTM编码模式,填什么跑什么
seqs = ["Boys", "ExampleSeq"]  # 填序列名称,填什么跑什么

[path]
input = "/path/to/input"  # 修改该路径字段以指向input文件夹。input文件夹下应有下载解压后的yuv文件
output = "/path/to/output"  # 输出位置,随便设

[app]
ffmpeg = "ffmpeg"  # 指向ffmpeg的可执行文件ffmpeg
encoder = "/path/to/EncoderApp"  # 指向VTM-11.0的编码器EncoderApp
rlc = "/path/to/RLC31"  # 指向RLC3.1的可执行文件RLC31

[QP.anchor]
"Boys" = [48, 52]  # 序列名以及对应的需要跑的QP
"ExampleSeq" = [42, 44]  # 填什么跑什么,目前需要升序排序

配置input文件夹

在任意位置创建一个input文件夹,并将yuv转移进input文件夹

移入yuv后,input文件夹的目录结构应符合${input}/${sequence_name}/xxx.yuv的形式

例如:/path/to/input/Boys/Boys_4080x3068_30fps_8bit.yuv

yuv的文件名可随意设置

启动大全套渲染(含编解码与多视角转换)

执行前请确保output文件夹有几个TB的空闲空间

python cc-00-render-anchor.py

计算PSNR指标

python cc-10-compute.py

指标会输出到${output}/summary/tasks

导出csv

python cc-20-export-csv-anchor.py

包含Bitrate和PSNR的csv会输出到${output}/summary/csv

绘制RD-Curve

python cc-30-figure-anchor.py

RD-Curve会输出到${output}/summary/figure

输出格式

LVC-CC是一套以任务(Task)为单元的crosscheck框架,通过多个Task的串联来组织编码测试。

每个Task都有一个目标文件夹。这个目标文件夹位于${output}/tasks文件夹下。目标文件夹的名称包含了该任务链路上所有前置任务的重点信息。

以任务文件夹名compose-Boys-f1-anchor-RA-QP52-8f7e为例,compose是当前任务的类型,Boys为测试序列名,f1表明帧数量为1,anchor表明该任务链路仅包含VTM而不包含额外的编码工具(如MCA等),RA表明VVC编码使用random_access相关预设,QP48表明编码QP为48,8f7e为避免名称重复的hash。

各个yuv也使用了和目标文件夹相同的命名规则。