11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

机器学习在视频编解码中的探索(三)

  • 2019-11-30
  • 本文字数:3028 字

    阅读完需:约 10 分钟

机器学习在视频编解码中的探索(三)

第一步,从每一帧里提取 36 个 feature,5 个连续帧提取一共 180 个 feature 做训练。这里采用的是支持向量机方法作聚类,经过训练识别帧的质量。


第二步,判断出比较好的帧以后,利用神经网络来提升质量差帧的图像质量。先做运动补偿,即:找到质量比较低的帧,及其前后质量比较高的两帧(PQF),三帧之间做像素级的运动估计的过程。做完运动估计和运动补偿之后,再做质量提升。


大家都知道,在神经网训练的过程中我们需要 ground truth,motion vector 很难获取 ground truth,所以这里不是要去训练 motion vector,而是得到的重建帧和原有的帧之间能达到差异最小值,来训练神经网。这个神经网有两个部分,MC-subnet 和 quality enhancement subnet,对构成的 MSE 函数实现最小化,进而用训练出的神经网去重建质量比较低的图像帧,最终达到整体视频质量的一致性。


第三个工作也是用深度学习对视频编码效率的提高,它的想法是这样的,人眼看视频,会对某些区域比较敏感,对某些区域没那么敏感。


譬如我们看足球比赛,会对球的质量比较敏感,对草地的失真不那么敏感。不同的区域人眼的敏感度不同,那么那些区域我就可以不做压缩和传输,即在 encoder 端进行分析,识别出这些区域,在 decoder 端再进行合成,编码、解码的工作就是分析加合成的过程。


由于其中有内容的分析,而机器学习在这方面有比较大的优势,所以这个工作就是用学习的办法把每帧图像分割成两个区域,一部分区域是人眼不敏感的,另一部分区域就保留下来,对于那些保留下来的区域可以用传统的(比如 AV1 的办法)进行压缩,对于那些容错性比较大的区域,可以去合成。


我们的具体工作中,实际上是用 AV1 的 global motion 概念,首先识别这些区域相应的全局运动矢量,最终用参考帧和全局运动矢量重建在编码端省去的区域,等同于通过 motion warp 的方法来代替、合成某些区域。这个工作的神经网络主要用于前处理,分割图像。在编码的过程中,由于运用了 AV1 里的 global motion 工具,所以最终这个工作是 AV1 aligned 的编码过程。


右图是图像分割的实验结果,哪些是 texture 比较复杂的区域,哪些是人眼比较敏感的区域。在这个工作中我们发现,把一帧图像划分为两个区域- 纹理区和非纹理区,然后对纹理区做 warping 合成,效果相对比较好。


视频相比图像,由于引入了 temporal 这个第三维时间轴,如果每一帧做 motion warping,出来后帧与帧间效果不一致,那么人眼就很容易看到差别,主观感知效果比较差。


举个简单的例子,以前我们在做实时通信(比如 Facetime),在手机上,手机有两个 CPU 核,自然而然会想到并行。比如 H.264,可以采用编码器端 slice 并行的概念,每一个图像帧会分成上面一个 slice 和下面一个 slice。


譬如一帧图像一共 22 行,你可以对上下 11 行进行单独编码。但是在 QP 比较大,码率比较低的情况下,由于上下两个 slice 的独立编码,失真结果差异比较大,这样编出来的视频中间会有一条线被观测到。如果单独看每一帧,是看不到那条线的,但是如果播放视频,那条线就显现出来了。这就是视频和图像不一样的地方,有一个帧间 consistent 的问题。


我们当时分析,出现中间这条线,主要是两个 slice 的划分过于一致,每帧都是上面一半下面一半,过于齐整了。一个处理办法,是让上下两个 slice 的行数近似但又不完全固定,这样使得每一个 CPU 核的计算量基本等同,达到并行的目的,但同时引入了一个 random variable(随机变量),让上下两个 slice 的行数会稍有不同,而且不同的行数帧与帧之间是随机变换的,那条线就看不到了。


这个实例是进一步说明,在处理视频的时候,必须要考虑到视频播放在时间连续上的感知效果。这是视频相对图像在主观质量评估上,一个比较大的挑战。因此,我们在用视频纹理分析与合成提升视频压缩性能的方法中,并不是对每一帧都去做 motion warping,而是利用编码器中所采用的 hierarchical 结构,只对位于这个结构中最上面一层的图像帧(或者简单来讲,只针对 B 帧)采用 warping 的办法。这样所得到的视频其感知效果相对比较理想。


3 ML to Perceptual Coding

机器学习还可以用在视觉感知编码(perceptual coding)。我们做视频编码器的都有质量评估标准。质量评估是大概经历了三代的变迁:


第一代,更多的是采用 PSNR。信号在丢失的过程中,一般评测都是想知道信息到底丢失了多少,所以用 PSNR 来衡量。


第二代,当我们衡量视频质量时,想到视频是给人眼看的,人眼不敏感的区域就不需要花很大的力气,即使失真再大,人眼感知不到即可。所以视频编码的评测标准发展为用那些可以跟人的主观视觉更加匹配的指标去衡量。


第三代,随着机器学习或人工智能的发展,很多时候,比如大量的监控视频不再是给人眼看的,而是为机器分析所用。


举个例子,我们的编码一般来讲是一个低通的过程,通常人眼对低频的信号会更敏感,不管是 JPEG、MPEG 还是 AV1,当我们对块做码率分配的时候,之所以做 transform,是希望把 energy 更多的 conpress 到 lowpass 那端,而 highpass 那端很多时候我们会大量的丢弃掉,去掉人眼不敏感的信息。但机器在分析的过程中和人眼的观测不是完全一致的,比如在监控视频中,大部分时候视频都是稳定的,突然有一个人或者一个物体出现时,即高频的信息出现,这类信息对机器分析更加有用。


由于机器分析的引用,使得 quality matrics 会有不同的评判标准出现。


4 What’s Next

这是今年 CVPR 的一篇 paper,是从其网页上下载的视频,原文作 video translation。前面有提到,这是一个 video Analysis + Synthesis 的过程。


可以想像,视频这么大的量,从一个简洁的图形恢复出一个复杂的高清的视频内容,这时候你会看到它神奇的变换阈。这实际上是对视频压缩提供了新的视角。我们创业之初,投资人也会说,你们现在在做压缩,而机器学习 AI 发展到一定程度,所有图像、视频是否都可以用一个很复杂的深度学习神经网络来代替,最终就能在 decoder 端通过神经网络,再加上从码流中提取出来的信息作为神经网络的输入重建任一视频呢?


最后学习对我们的压缩到底产生什么样的影响?通常大家都会说“一图胜千言”,一帧图像可以表达那么多的内容,对于一个视频远远不止“千言”,那刚刚关于我提出的问题,是不是能用机器学习代替所有的压缩标准和以前采用的运动补偿+变换阈的传统做法呢?我今天的回答是否定的。


我们认为在可预见的未来 5 到 10 年,压缩还会按照现有的基本的 coding structure 的方向发展,但是每个模块都有可能被神经网络或者机器学习代替,但是基本的框架不会改变。


总结下来主要有两点:一是通过机器学习,视频的分析、理解和压缩之间的连接会更加紧密。举个例子,高速上很多视频作为交通监控,采用车牌识别,但对于一个视频,如果你关注的只有车牌的话,会把很大的高清视频压缩成一串数字。那么不同场景的压缩,需要对视频做一些前期的分析。二是通过机器学习,视频的重建技术会在视频编码流程中扮演越来越重要的角色。视频可以用一些神经网络的工具,重建出很复杂的信息。特别针对视频编码和解码,一些有助于解码端重建的信息可以在编码端生成,因为编码端是有源视频的。这些信息可以放在码流中传送到解码端,进一步辅助解码端重建出更高质量的视频。这样的方法可称作“编码器引导下的解码端重建”,比解码端的独立重建技术应该会有更大的潜力。机器学习在其中也会有更大的施展空间。


本文转载自公众号声网 Agora(ID:shengwang-agora)。


原文链接:


https://mp.weixin.qq.com/s/gA6KpXPRoxe9dm4KwLJL6A


2019-11-30 22:46486

评论

发布
暂无评论
发现更多内容

区块链产品走向普及之不完全指南

CECBC

比特币 区块链

ZEGO全新语音聊天解决方案,4步搭建爆火的语音聊天室

ZEGO即构

字节跳动,三面我败了!但是我把经验记录了下来,倒下了一个我,还有千千万万个程序员!

Java架构之路

Java 程序员 架构 面试 编程语言

【得物技术】Keep-alive 原理及业务解决方案

得物技术

大前端 标签 页面 得物技术 keepalive

产品经理问我:手动创建线程不香吗,为什么非要用线程池呢?

Java鱼仔

Java 线程池

实习记录:PB协议编写

YUKI0506

为什么 Python 的 f-string 可以连接字符串与数字?

Python猫

Python 开源 编程语言 后端 C语言

滴滴内部分享:如何提高代码的可读性,学习笔记

Java架构师迁哥

十年再出发,Dubbo 3.0 Preview 即将在 3 月发布

阿里巴巴云原生

Java 微服务 云原生 dubbo 应用服务中间件

阿里内部人手一份!P8大佬也叫好的 高性能MySQL系列文档

Java架构之路

Java 程序员 架构 面试 编程语言

都在说云原生,它的技术图谱你真的了解吗?

浪潮云

云原生

Spring Boot(一):入门篇

海鸥云

spring Boot Starter

话题讨论 | 每逢佳节胖三斤,过完年你胖了吗?

石云升

话题讨论 减肥 2月春节不断更

Linux 多线程详解 —— 什么是线程

赖猫

Linux 线程 Linux内核

区块链在医疗领域应用所要面临哪些挑战

CECBC

区块链 医疗

你真的了解什么是「暴力解法」吗 ...

宫水三叶的刷题日记

面试 算法 LeetCode 数据结构与算法 贪心算法

不服不行!阿里曝光内部高并发实战手册,Github星标98K

Java架构之路

Java 程序员 架构 面试 编程语言

场景化面试:在读多写少的情况下,如何优化 MySQL 的数据查询方案

面试官问

MySQL 数据库 面试 主从同步 读写分离

新手如何靠区块链赚钱?

CECBC

区块链

AI窥人(三):你想靠AI实现永生吗?

脑极体

Spring RSocket:基于服务注册发现的 RSocket 负载均衡

阿里巴巴云原生

Java 开发者 云原生 API 应用服务中间件

连Python都不熟也能跑通AI人脸识别?“隐藏Boss”竟是它!

华为云开发者联盟

Python AI OpenCV 人脸识别 图像检测

iOS进阶模块(逆向安防)

ios 逆向

架构师week13总结

Geek_xq

RPC框架-dubbo:架构及源码分析-初篇

程序员架构进阶

微服务 dubbo 七日更 28天写作 2月春节不断更

我要看 SICP 了!

十元

《TestNG》源码学习笔记

吴大山

阿里架构师道延:我对技术架构的理解与架构师角色的思考

阿里巴巴中间件

阿里云 架构 云原生 架构师

架构师week13作业

Geek_xq

机器学习在视频编解码中的探索(三)_文化 & 方法_声网_InfoQ精选文章