美文网首页目标检测从入门到入土
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