介绍
在这里记录了在视频增强与超分辨率挑战赛中的操作记录,包括:
- 测试集下载
- y4m生成png
- lr转hr
- png生成y4m
- 计算VMAF值
准备数据
-
下载数据并解压:在数据列表中下载指定数据,数据以zip的形式保存;解压数据,生成一个文件夹hr,其中有很多y4m;
-
安装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
-
转换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)
-
目前文件夹结构为:
hr xxxx1.y4m xxxx2.y4m y4m_to_png.py
-
运行代码
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
提交结果
-
比赛要求的提交为:测试集前10%数据需要提交完整的超分辨率结果视频,后90%的视频需要提交抽帧结果,每25帧抽1帧,依次取0,25,50,75帧,得到一个新视频。
-
测试集是50个100帧的视频,一个完整结果视频约300MB,一个抽帧视频约为12MB,故总共需要提交约的数据。
-
命名规则为Youku_视频序号(%05d)_h/l_Sub抽帧频率(%2d)_GT/Res.y4m,例如 Youku_00100_h_Res.y4m或者Youku_00100_h_Sub25_Res.y4m
-
在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])
-
运行代码
python png_to_y4m.py
-
进入result_zip文件夹
cd result_zip
,压缩文件zip result.zip *.y4m
-
提交结果,将zip文件在比赛页面上传。
使用VMAF计算评价指标
配置环境
- 配置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
- 克隆仓库
git clone https://github.com/Netflix/vmaf.git
- 进入仓库
cd vmaf
,然后编译make
- 导入环境变量
# 一次性导入 export PYTHONPATH="$(pwd)/python/src:$PYTHONPATH" # 永久导入 echo export PYTHONPATH="$(pwd)/python/src:$PYTHONPATH" >> ~/.bashrc source ~/.bashrc
- 测试
./unittest
,全部正常输出则代表成功。
测试 参考 Testing
-
对测试集单个测试
./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
-
对验证集单个测试
./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
- (待续)批量测试
写一个脚本用来批量测试,在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
网友评论