一. 研发进展
工程链接:
- https://github.com/riverlight/qn-enh-sdk 算法封装成 ffmpeg filter 的工程
- https://github.com/riverlight/ImageRestoration_CNN deblock 模型
截止本周,deblock filter 的优化大约花费了5-6周时间,算法效果简单总结如下:
- psnr 提升
在显著的块效应图片上,经过deblock处理后,psnr 约提升了 1.8db
在 32*32 的小样本图片上,普遍也取得了超过 1db 的psnr 改善 - 主观视觉提升
对压缩块效应比较显著的视频,这种情况因为没有原始的清晰视频,故无法计算改善的psnr
但 deblock 处理后,主观视觉改善是比较显著的
这种case 是当前 deblock filter 在dora的典型应用场景,部分点播视频经过转码后,主观视觉体验可以得到提升
当然,如果原始视频本身质量比较好,块效应不是很显著,则该 filter 改善效果会不显著 - 算法性能提升
原始算法,对1280*720的单帧image,处理速度(cpu) 使用MNN框架跑约 9秒(单线程)
目前在TRT 框架下,单帧处理速度约 45ms (GPU,GTX1060),提升还是比较显著的 - 演示图片及视频
v-merge-deblock.mp4 这个是 deblock 的效果
v-merge-low-deb.mp4 这个是 deblock + 暗光增强的效果这是图片演示效果,左边是原始图片,中间是过压缩的图片,最右边是deblock后的效果,该sample psnr 提升约 1.9db
二 过程总结
2.1 概述
这是我们的第一个把深度学习技术应用于 dora 转码的项目,核心工作主要包括了数据集准备、算法模型设计、推理框架实践和性能优化等工作,这里都简要介绍下
2.2 算法介绍
最终选择的模型结构是比较简单,如下图:
过程中借鉴了微信扫码超分的模型(https://mp.weixin.qq.com/s/ZEthIoGsIm1KsHheWUviZg),但最终综合考虑TRT的推理性能,选择了一个最简化的模型,效果也还行
数据集使用的是 VOC2012 图片集,然后对原始图片进行 jpg 高损伤压缩作为 噪声样本,数据集准备的脚本见 prepare.py
损失函数比较简单,就测试了 L2 和 L1 loss,最终的结果是 L1 psnr 略高,最终选择的也是 L1 Loss
2.3 模型性能优化
首先是推理引擎选择,测试了 阿里的MNN 和 nvidia的 TRT,最终选择的是 TRT,总的来说,这两个引擎感觉都不是很完美,MNN 现阶段还不算很完善,文档等方面都比较粗糙,TRT 比较适合 N卡,使用受限制,虽然对dora这个问题不大,另一个缺陷是 他不是开源的,在 windows10+mingw64 下似乎有bug(已提交nvidia),逼得我最后用的是 vs2019 把ffmpeg给编译出来了,MNN 也发现了一个类似bug,但因为开源,我就可以自己修复绕过去
从dora的场景而言,应该是TRT或者 pytorch 更合适,未来如果应用到移动端,则应该是还是要用 MNN
TRT 还有个问题就是对 ONNX 格式解析很慢,导致算法启动比较慢,大约20秒+
三 意外的收获
这次有个意外的收获,就是使用 vs2019 把 ffmpeg 给编译出来了,这个对 windows 开发的同学意义还是很大的,参考的链接如下: https://my.oschina.net/u/4398200/blog/3336484 和 https://github.com/ShiftMediaProject/FFmpeg