人工智能在视频应用领域的探索

anrc9565 6年前
   <p style="text-align: center;"><img src="https://simg.open-open.com/show/f550be5cf35e1c39e153971d0ad35916.jpg"></p>    <p>人工智能热度很高,但泡沫也很大。人工智能在视频领域的应用已经走入寻常人的生活,人脸识别,视频自动抠像技术已经比较成熟。除此之外,人工智能还能为视频应用带来哪些变化呢?鲍金龙撰文,描述了人工智能在视频应用中的实践探索,涉及编解码器、超分辨率等。</p>    <p>文 / 鲍金龙</p>    <p>序:人工智能来生今世</p>    <p>人工智能是一个非常广泛的领域,当前人工智能涵盖很多大的学科,大致归纳为六个:</p>    <ol>     <li> <p>计算机视觉(暂且把模式识别,图像处理等问题归入其中);</p> </li>     <li> <p>自然语言理解与交流(暂且把语音识别、合成归入其中,包括对话);</p> </li>     <li> <p>认知与推理(包含各种物理和社会常识);</p> </li>     <li> <p>机器人学(机械、控制、设计、运动规划、任务规划等);</p> </li>     <li> <p>博弈与伦理(多代理人agents的交互、对抗与合作,机器人与社会融合等议题);</p> </li>     <li> <p>机器学习(各种统计的建模、分析工具和计算的方法)。</p> </li>    </ol>    <p>这里值得强调几点:</p>    <p>第一) 目前的人工智能都是属于弱人工智能的范围,在某一个专业领域内作为被人类使用的工具存在。 目前还不存在离开人类主体自行运行的人工智能,更不存在可以开发人工智能自我迭代进化的强人工智能。</p>    <p>第二) 机器学习在近几年取得了很大进展,有些人直接把机器学习当成了人工智能的代名词。这是不准确的。举例来说,不可否认机器学习在计算机视觉领域发挥着越来越大的作用,但是传统意义上,通过人工建模,分析取得的模式识别,图像识别,图像增强仍旧是很成功的人工智能技术,并且也是机器学习进一步发展的基础。</p>    <p>第三) 统计分析方法在1990年代就出现并在一定领域内使用了。统计分析方法也多种多样的,根据实际需要产生过很多成功的案例,不一定采用目前标准的建模和分析方法。这里面举个典型的例子,在1997年Intel推出mmx技术之前,程序员中流传着一个非常著名的查表IDCT(反余弦变换),实际上就是对MPEG1编解码过程的IDCT变换,做了统计分析后发现的,超过之前所有快速算法的实战案例。具体细节请点击『阅读原文』下载IDCT 8x8.DOC。</p>    <p>第四) 机器学习有这几个比较明显的缺陷,想要在实战中取得良好的效果,就必须做出合理的取舍和优化。这几个缺陷是:</p>    <ol>     <li> <p>严重依赖数据,训练方法和训练量非常关键。</p> </li>     <li> <p>计算量偏高。</p> </li>     <li> <p>虽然有时候取得了良好的效果,但是机器学习本身并不能理解这个过程,也不能给出合理的解释。</p> </li>     <li> <p>涉及自然科学常识和社会科学常识的问题,目前机器学习还不能在开放领域内取得良好的效果。</p> </li>    </ol>    <p>(一)人工智能对视频应用的渗透</p>    <p>传统视频应用的流程:</p>    <p><img src="https://simg.open-open.com/show/4efc6cb558191d422b88793742a79fea.png"></p>    <p>前面我们说过,目前的人工智能还处于工具阶段,也就是说还没有人工智能开发出来的任何的超越时代的编码方法、传输协议、解码、交互技术存在。目前人工智能渗透包括预处理和后处理,超分辨率,机器视觉等等,人们在这些过程中使用人工智能工具来提升开发效率或者处理效果。而编解码技术,则属于人类专家技术团队才能解决的问题,目前的人工智能还很难介入。</p>    <p><img src="https://simg.open-open.com/show/97f98b921c5da18e0dc501923a3220e3.png"></p>    <p>近年来网络直播应用的兴起,出现了跟以往广播电视编解码不太一样的需求。那就是:</p>    <ol>     <li> <p>编码端,保证编码实时性和码率的要求的同时,保证尽量高的图像质量。</p> </li>     <li> <p>发送,传输,缓冲,延时尽量小。</p> </li>     <li> <p>解码器尽量能输出最好的质量,最好能超分辨率。</p> </li>    </ol>    <p>这两年我一直在努力把人工智能(主要是机器学习)技术跟编解码做更深的融合,用来解决传统方法一直很难解决的这几个问题。</p>    <p>编码器遇到的问题: 硬件编码器性能好,但是图像质量差,码率高。软件编码器效率较低,遇到复杂视频,比如物体繁多,较大运动,闪光,旋转,既不能满足实时编码的需求,同时输出码率也出现较大抖动。对于网络应用来说是很大的障碍。</p>    <p>解码器需要增强的点: 大家都在构想能不能应用超分辨率技术,把较低分辨率的视频的播放质量提升一大块。目前有很多算法显示出巨大的潜力,比如谷歌的RAISR,处理图像时候效果很好。能不能实时用到视频上,或者硬件化,或者采用更快的能实时运行的算法。我们在后面会讨论一种折中方案,在牺牲一点质量的前提下,能够实时运行的超分辨率算法。</p>    <p><img src="https://simg.open-open.com/show/14205978f1efba247d3d2e228a512d3a.jpg"></p>    <p>(二)人工智能增强的编码器</p>    <p>(2.1)动态编码器</p>    <p>不同场景下编码保持恒定质量的码率:</p>    <p><img src="https://simg.open-open.com/show/339e84a4d5a362e5a624677e8fe74f51.jpg"></p>    <p>编码时间和码率是正相关的,在码率暴涨的同时,编码时间也剧烈延长。对于低延时需求强烈的直播应用,会造成严重的卡顿。</p>    <p>一般就只好使用绝对不变码率ABR. 不同场景下ABR的图像质量:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b24420303358623bf871ded4b426bf0f.jpg"></p>    <p>这样带来的结果就是图像质量不稳定。</p>    <p>我们希望是下图这样的曲线:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/aeed5301672640a73d3e0ecb050786df.jpg"></p>    <p>这就需要编码器能够提前判定大码率场景出现的可能性。 需要判定的几种情况:</p>    <ol>     <li> <p>物体繁多且有摄像机运动。</p> </li>     <li> <p>背景不动但是有大量物体的大范围运动,包括快速运动,旋转,仿射,蠕变等。</p> </li>     <li> <p>出现闪光,风沙,粒子系统。</p> </li>    </ol>    <p>这就需要开发一种适用于高清晰度直播应用的面向场景的智能编码技术。该技术通过监督学习将常见视频编码卡顿场景分类并快速识别,提前预判视频场景的编码复杂度和码率抖动,使用动态参数配置来编码,保证编码的实时性和限定码率下最好的图像质量。</p>    <p>(2.2)内容自动植入</p>    <p><img src="https://simg.open-open.com/show/71e6011ec79a5e9b19b792032b5872f6.jpg"></p>    <p>这里讨论广告的自动植入问题。一种是在编码前合成到视频里面,这个过程跟编码关系不大。但是直接合成到视频之后,所有的观众看到的内容就都一样。</p>    <p>要做到个性化,精准的广告投放,就只有在播放端解码后合成。要做到这点,服务器不仅要发送原始视频流,还要发送后期合成物体的定位方法和图像数据,以便客户端按照需求进行动态合成。</p>    <p>首先,自动植入的广告跟前贴片比起来优势很明显,可以植入的广告数量非常巨大,效果也更自然,用户也不会产生明显的反感。</p>    <p>其次,个性化精准投放,又进一步扩大了广告投放的总容量和效率。</p>    <p>(2.3)交互式视频</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1e5cfc80d195de8a13c733f02e278965.jpg"></p>    <p>目前基本做法是图像识别后,与搜索引擎连接,产生一个内容链接。</p>    <p><img src="https://simg.open-open.com/show/0cc6e5d7bab7fde341ca8c9b9418f8de.jpg"></p>    <p>(三)人工智能增强的解码器</p>    <p>(3.1)单个图像的超分辨率</p>    <p>自然图像基本上是平坦的纹理填充和显著的边缘(线条)组合形成的。</p>    <p>常规拉伸算法有双线性插值和双三次样条曲线差值。一般说来,三次曲线要比线性插值效果好。</p>    <p>然而在 15 年前,我在金山做 DVD 播放器的时候,正在研究去隔行技术。</p>    <p><img src="https://simg.open-open.com/show/0aeaee3c82ae18ce742624f472e7145b.jpg"></p>    <p>如上图所示,第一排和第三排是原图数据,第二排是需要插入的数据。普通的插值方法是在 B 方向上做一个三次插值。但是我这次计算了 A,B,C 三个方向的梯度,取方向梯度最小,像素梯度和最大的方向做简单的线性插值。</p>    <p>这时候我有一个惊奇的发现,简单的双线性插值的目视效果居然要好过三次曲线。这是为什么呢?</p>    <p>图像模糊的原因有以下几个:</p>    <ol>     <li> <p>低分辨率下线条会变得模糊。</p> </li>     <li> <p>低分辨率图像在拉伸到高分辨率时候会在线条上引入额外的模糊。</p> </li>     <li> <p>噪音的存在。</p> </li>    </ol>    <p>对于第2点我们具体说明:比如B样条,三次样条曲线有一个应用条件,那就是样本数据本身应该是光滑的,至少是分段光滑。但是在图像里面,物体的边界和背景的结合处,就不满足这个条件了。普通的三次样条曲线插值并没有考虑图像内部各个物体的不同,简单的把整个图像作为一个整体来计算。这样必然就在边界处引入了严重的模糊。</p>    <p>因此超分辨率主要从以上几个方面进行处理。噪音的处理技术已经比较成熟了。今天我们就不讨轮了。</p>    <p>第一个讨论点,如何降低线条的拉伸效应,也就是线条的锐度保持。</p>    <p>比如一个4x4的像素块,比较常见的是如下的形态:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/68565ab85673794a7ef494330f8943a0.png"></p>    <p>普通的三次b样条的滤波器参数矩阵为:</p>    <p><img src="https://simg.open-open.com/show/62e8fc2e5c0781119d2e68880d0983b2.png"></p>    <p>比如我们打算在4x4像素块中心插入一个点:</p>    <ul>     <li> <p>第一种情况,插入点在边界上。</p> </li>    </ul>    <p><img src="https://simg.open-open.com/show/8d3054bba7278170ef9933fbcd79af57.png"></p>    <p>使用标准滤波器:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/54fb5e98716387d6d68e6a85ac2d3d83.png"></p>    <p>使用改进滤波器:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3b023831b6acf75ca92a884c481cbfc2.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/68565ab85673794a7ef494330f8943a0.png"></p>    <ul>     <li> <p>第二种情况,插入点在边界内:</p> </li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ee00d8c18b9300a4407cdfb76f2e7d60.png"></p>    <p>标准滤波:</p>    <p><img src="https://simg.open-open.com/show/6066a2de0c7cd1a32c379479e972cf73.png"></p>    <p>效果可以接受。</p>    <ul>     <li> <p>第三种情况,插入点在边界外:</p> </li>    </ul>    <p><img src="https://simg.open-open.com/show/1e7d4d695652a59bb244801738a3038a.png"></p>    <p>使用标准滤波器:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a7ddb28aa657f0a366dc211b260b6215.png"></p>    <p>使用改进滤波器:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bdd6bb53caadef28a2488fd851065b4b.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/cffa07a02a2d0304e593152a9e36c9b5.png"></p>    <p>第三种情况实际上和第一种是一样的。所以我们只要考虑插入点在边界上的情况就可以了。</p>    <p>考虑到每个像素实际是8位的,一个4x4像素块的可能的组合基本就是128位整数。这是一个极其巨大的数字。然而实际上经常出现的可能远远少于理论上限,基本上考虑几千种组合就够用了。这种情况下需要使用统计方法,或者说是机器学习的办法来获得一个比较好的滤波器参数表。这是一个很稀疏的分布,需要设计比较好hash方法来构造和查找。</p>    <p>一般的机器学习过程都是类似的: 准备一些原始 HR 图象(2x2)和从采样生成的 LR(1x1)图象,作为配对数据。然后采用了几个优化操作:</p>    <ul>     <li> <p>第一步,将复杂 4x4 梯度图象点阵处理成为简单的码本图象(HASH)。</p> </li>     <li> <p>第二步,针对这个码本图象,使用考虑临近像素梯度权重的方法重构B样条滤波器参数,每次都和原始的 2x2 倍图象进行 SAD (COST函数)计算,寻找最接近的拟合曲线参数(下山法)。</p> </li>     <li> <p>第三步,对上一步获得的大量参数计算概率分布,取最大概率的参数作为该码本的最优解。</p> </li>     <li> <p>第四步,对近似的码本进行合并处理,以减小码本的数量。</p> </li>    </ul>    <p>还有一个讨论点,就是低分图像对边界造成的模糊,有没有办法来去除。有人提出了一个梯度变换的方法:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8bfd471089876a8f2616294325181e2c.jpg"></p>    <p>这种算法的思路就是计算出梯度的分布,然后适当把梯度收窄。不考虑实现速度的话,这个方法取得效果也是很惊人的。</p>    <p><img src="https://simg.open-open.com/show/dbb46b0a2fdbf09bc672238b6860435a.jpg"></p>    <p>这个算法的运算量太大了。我们只能是想办法把这个过程融合到寻找滤波器参数矩阵的过程中来。</p>    <p>在实际处理过程中,我们就使用上面过程获得的进行超分辨率计算。那么我们可以估计这样算法的大致运算量:4x4矩阵配准,查找滤波器,然后每个点16次乘加法。整个过程预估相当于40次乘法运算。因此以现在的cpu性能,使用avx256/512或者hvx充分优化,完全有可能实现1080p到4k的超分辨率上达到实时30fps。</p>    <p>这样某些时候得到的图象目视效果甚至要超过原始输入图象。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/dc0c91393d601d27ba4eca1f6a9afdea.jpg"></p>    <p>(3.2)视频的超分辨率</p>    <p>上面是单个图像的超分辨率。视频的超分辨率和单个图像是不同的。单个图像的超分辨率算法可以融合到视频超分辨率里面来。</p>    <p>视频的超分辨率基本思路是从连续的视频序列来重建高分辨率的图像,涉及到图像配准和子像素提取。研究方法和评价方法也存在很大差异。有些人用图像的超分辨率方法来套用的话就会出现一些疑惑:</p>    <p>首先视频编码是一个有损压缩过程,不同分辨率的序列压缩退化过程是不同的,因此找不到合适的HR/LR配对。视频质量的评估也是远比图像质量评估要复杂。因此目视质量是一个比较简易的评估标准。当然寻找一个HR/LR配对来计算PSNR也是可以的,但是说服力远不如图像配对的情况。</p>    <p>评估模型:</p>    <p><img src="https://simg.open-open.com/show/8e7c98fc9a649a93e0fef6540520f206.png"></p>    <p>比如这个过程,由于未经压缩的视频图像体积巨大,所以HR(0)不适合用来做原始分辨率参照。我们可以选取HR(1)和HSR来比较获取一个PSNR(0), 然后选取HR(1)和普通拉伸获得的HBR来比比较获取一个PSNR(1). 如果PSNR(0)比PSNR(1)要高的话,就说明超分辨取得了效果。</p>    <p>普通的视频序列物体配准和子像素提取是非常慢的。为了加快速度,我们把这个过程简化了一下,省去配准和空间预测的过程,参照解码生成分数运动向量,直接在解码过程中完成一部分像素块的子像素提取工作。</p>    <p>为了进一步提高处理速度,这里面的还采用了一些优化措施:</p>    <p>实验发现,在一个视频播放序列中,如果每间隔2帧清晰度稍差的图像,加入一帧相对高质量图像,和逐帧高质量图像对比起来,人眼的感觉不会造成太多差异。</p>    <p>因此在视频SR过程中,可以每隔两帧用普通 b 样条+降噪生成的基础图象HBR+,做一次HSR处理:</p>    <pre>  [HSR] ,[HBR+] ,[HBR+], [HSR], [HBR+], [HBR+], [HSR], [HBR+], [HBR+]  </pre>    <p>这个视频上面的快速超分辨率过程SR详细过程可以描述为:</p>    <p><img src="https://simg.open-open.com/show/9395385cf8d156f9c9f26db7a8af4bd1.png"></p>    <p>预估整个超分辨率过程输出的HSR视频图像质量提升1个dB左右。</p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s/4X1E6KcrLtaGSYtH5oBNtA</p>    <p> </p>