美文网首页目标检测从入门到入土
SR_ESRGAN生成、提交、上传等操作记录

SR_ESRGAN生成、提交、上传等操作记录

作者: zestloveheart | 来源:发表于2019-05-29 18:03 被阅读0次

介绍

在这里记录了在视频增强与超分辨率挑战赛中的操作记录,包括:

  • 测试集下载
  • y4m生成png
  • lr转hr
  • png生成y4m
  • 计算VMAF值

准备数据

  1. 下载数据并解压:在数据列表中下载指定数据,数据以zip的形式保存;解压数据,生成一个文件夹hr,其中有很多y4m;

  2. 安装ffmpeg,参考这里

    # 由于官方yum源没有ffmpeg,先获取第三方yum源
    sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
    sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
    # 安装ffmpeg
    sudo yum install ffmpeg ffmpeg-devel -y
    # 测试是否安装成功
    ffmpeg -h
    
  3. 转换y4m成png:在hr里面新建一个python程序,y4m_to_png.py,代码如下:

    #coding=utf-8
    # 将该文件放到hr中,和y4m文件同级。
    # 运行后,每个y4m文件会在hr/test_temp中生成一个文件夹,文件夹中是各帧的png文件。
    from pathlib import Path
    import subprocess as sbp
    
    for p in Path('.').iterdir(): # 文件夹迭代器
        if p.suffix=='.y4m':   # 如果pp是y4m文件,则进行转换操作
            print(str(p))
            sbp.run(['mkdir',f'{p.stem}'])
            sbp.run(['ffmpeg', '-i', f'{p}', '-vsync', '0', f'{p.stem}/{p.stem}_%3d.png', '-y'])
    
    output_dir = 'test_temp'
    sbp.run(['mkdir','-p',output_dir])
    sbp.run([f'mv Y*l {output_dir}'],shell=True)
    
  4. 目前文件夹结构为:

    hr
        xxxx1.y4m
        xxxx2.y4m
        y4m_to_png.py
    
  5. 运行代码 python y4m_to_png.py,会将temp中的y4m转化成png并存到各自的文件夹中。文件夹结构如下所示即成功:

    hr
        xxxx1.y4m
        xxxx2.y4m
        y4m_to_png.py
        test_temp
            xxxx1
                xxxx1_0001.png
                xxxx1_0002.png
                xxxx1_0003.png
            xxxx2
                xxxx2_0001.png
                xxxx2_0002.png
                xxxx2_0003.png
    

使用ESRGAN

这一步使用ESRGAN将每组低像素的png图片生成高像素的png。先修改ESRGAN的test.py代码。然后运行 python /home/student_docker/zlh/ESRGAN/test.py /home/student_docker/zlh/ESRGAN/models/RRDB_ESRGAN_x4.pth

import sys
import glob
import cv2
import numpy as np
import torch
import architecture as arch
from pathlib import Path
import subprocess as sbp

model_path = sys.argv[1]  # models/RRDB_ESRGAN_x4.pth OR models/RRDB_PSNR_x4.pth
device = torch.device('cuda')  # if you want to run on CPU, change 'cuda' -> cpu
# device = torch.device('cpu')

base_folder = '/root/addition_store/youku_LR_y4m_valid/'
test_img_folder = f'{base_folder}/test_temp/'

model = arch.RRDB_Net(3, 3, 64, 23, gc=32, upscale=4, norm_type=None, act_type='leakyrelu', \
                        mode='CNA', res_scale=1, upsample_mode='upconv')
model.load_state_dict(torch.load(model_path), strict=True)
model.eval()
for k, v in model.named_parameters():
    v.requires_grad = False
model = model.to(device)
print('Model path {:s}. \nTesting...'.format(model_path))

output_dir =f'{base_folder}/results/'
print('start to loop')
dir_num = 0
for p in Path(test_img_folder).iterdir():
    if p.is_file(): continue
    print(dir_num)
    base = p.stem
    sbp.run(['mkdir','-p',f'{output_dir}/{base}'])

    idx = 0
    for pp in p.iterdir():
        output_img_name = f'{output_dir}/{base}/{pp.name}'
        print(output_img_name)
        # read image
        img = cv2.imread(str(pp), cv2.IMREAD_COLOR)
        img = img * 1.0 / 255
        img = torch.from_numpy(np.transpose(img[:, :, [2, 1, 0]], (2, 0, 1))).float()
        img_LR = img.unsqueeze(0)
        img_LR = img_LR.to(device)

        output = model(img_LR).data.squeeze().float().cpu().clamp_(0, 1).numpy()
        output = np.transpose(output[[2, 1, 0], :, :], (1, 2, 0))
        output = (output * 255.0).round()
        cv2.imwrite(output_img_name, output)
        idx+=1
    dir_num+=1

提交结果

  1. 比赛要求的提交为:测试集前10%数据需要提交完整的超分辨率结果视频,后90%的视频需要提交抽帧结果,每25帧抽1帧,依次取0,25,50,75帧,得到一个新视频。

  2. 测试集是50个100帧的视频,一个完整结果视频约300MB,一个抽帧视频约为12MB,故总共需要提交约300*5+12*45=2040MB的数据。

  3. 命名规则为Youku_视频序号(%05d)_h/l_Sub抽帧频率(%2d)_GT/Res.y4m,例如 Youku_00100_h_Res.y4m或者Youku_00100_h_Sub25_Res.y4m

  4. 在result中创建png_to_y4m.py,代码如下。将result中生成的文件夹中的图片转化成y4m文件。

    #coding=utf-8
    
    # 该文件放在最终结果生成的总目录results内,和各个存有的png的文件夹同级
    # 运行该代码,最终生成的结果会在output_dir内。
    from pathlib import Path
    import subprocess as sbp
    
    # 配置参数
    output_dir = 'result_zip'
    zip_name = 'result.zip'
    
    # 处理前10%的文件
    sbp.run(['mkdir',output_dir])
    for i in range(200, 205):
        sbp.run(['ffmpeg', '-i', f'Youku_{i:05d}_l/{i:05d}_l_%3d.png', '-pix_fmt', 'yuv420p', '-vsync', '0', f'{output_dir}/Youku_{i:05d}_h_Res.y4m', '-y'])
        # sbp.run(['ffmpeg', '-i', f'Youku_{i:05d}_h_Res.y4m', '-vsync', '0', f'Youku_{i:05d}_h_Res.yuv', '-y'])
    
    # 处理后90%的文件
    temp_dir = 'temp_dir'
    sbp.run(['mkdir',temp_dir])
    for i in range(205, 250):
        sbp.run(['ffmpeg', '-i', f'Youku_{i:05d}_l/{i:05d}_l_%3d.png', '-pix_fmt', 'yuv420p', '-vsync', '0', f'{temp_dir}/Youku_{i:05d}_h_Res.y4m', '-y'])
        sbp.run(['ffmpeg', '-i', f'{temp_dir}/Youku_{i:05d}_h_Res.y4m', '-vf', "select='not(mod(n\,25))'", '-vsync', '0',  '-y', f'{output_dir}/Youku_{i:05d}_h_Sub25_Res.y4m'])
        # sbp.run(['ffmpeg', '-i', f'Youku_{i:05d}_h_Sub25_Res.y4m', '-vsync', '0', f'Youku_{i:05d}_h_Sub25_Res.yuv', '-y'])
    sbp.run(['rm','-rf',temp_dir])
    
    
  5. 运行代码 python png_to_y4m.py

  6. 进入result_zip文件夹 cd result_zip,压缩文件 zip result.zip *.y4m

  7. 提交结果,将zip文件在比赛页面上传。

使用VMAF计算评价指标

参考VMAF github python说明

配置环境

  1. 配置python环境
    # VMAF需要python2.7,所以需要用conda安装一个python2.7的环境
    conda create -n py27 python=2.7
    conda activate py27
    # 安装相关的包
    conda install scipy matplotlib pandas scikit-learn scikit-image h5py
    pip install sureal
    
  2. 克隆仓库 git clone https://github.com/Netflix/vmaf.git
  3. 进入仓库 cd vmaf,然后编译 make
  4. 导入环境变量
    # 一次性导入
    export PYTHONPATH="$(pwd)/python/src:$PYTHONPATH"
    # 永久导入
    echo export PYTHONPATH="$(pwd)/python/src:$PYTHONPATH" >> ~/.bashrc
    source ~/.bashrc
    
  5. 测试 ./unittest,全部正常输出则代表成功。

测试 参考 Testing

  1. 对测试集单个测试
    ./run_vmaf yuv420p 1920 1080 /root/addition_store/youku_LR_y4m_test/results/result_zip/Youku_00200_h_Res.y4m/ /root/addition_store/youku_LR_y4m_test/results/result_zip/Youku_00200_h_Res.y4m --out-fmt json

  2. 对验证集单个测试
    ./run_vmaf yuv420p 1920 1080 /root/addition_store/youku_HR_y4m_valid/Youku_00150_h_GT.y4m /root/addition_store/youku_LR_y4m_valid/results/result_zip/Youku_00150_h_Res.y4m --out-fmt json

  1. (待续)批量测试
    写一个脚本用来批量测试,在vmaf文件夹内新建py文件。
    
    
    

其他

ffmpeg的相关指令
https://blog.csdn.net/caohang103215/article/details/72638751
https://www.cnblogs.com/tocy/p/ffmpeg-filter-intro.html
https://www.cnblogs.com/ruichenduo/p/7686139.html
https://www.cnblogs.com/frost-yen/p/5848781.html

相关文章

网友评论

    本文标题:SR_ESRGAN生成、提交、上传等操作记录

    本文链接:https://www.haomeiwen.com/subject/xlcutctx.html