在FFmpeg中,一开始增加了两个基于深度学习的video filter,分别是用来超分辨率的vf,和用来去除雨点的derain。它们都是对每帧中的内容进行的调整,包括对帧size的改变,用到的算法都是基于深度学习的模型。实际上,相比于这样为每一种功能算法增加一个filter的思路,我们还可以采用另外一种思路,即,设计一个通用的filter,可以用一个filter来普适所有基于深度学习模型的图像处理算法,此即我最近为FFmpeg增加dnn_processing的设想。本想做个全面的介绍,不过感觉缺少大块时间,就拆分介绍,也可以顺便增加篇数活跃一下。
本篇主要介绍如何使用dnn_processing来完成针对灰度图的sobel算子的调用,sobel算子主要用作边缘检测,通过对像素周围区域中的灰度值做加权相加,达到检测边缘的效果。我们首先要重新编译FFmpeg源代码,以增加对TensorFlow的支持,然后再要写出和Sobel算子等效的TensorFlow网络模型,最后dnn_processing会加载并执行此网络模型,对输入的frame逐一进行处理。为简化代码,我们只关注sobel算子水平方向的特性。
- 重新编译FFmpeg
FFmpeg对深度学习模型的支持有两个后端,一是调用TensorFlow C动态库来完成,二是调用内部C代码来实现。前者被称为tensorflow后端(将简写为tf后端),后者被称为native后端。要启用tf后端,必须在编译FFmpeg的机器上有tensorflow c开发库(包括.h文件和.so文件),而且在configure的时候需要传入相应的参数。而任何情况下的编译,native后端总是被自动启用。这两个后端本文都会涉及,所以,我们必须重新编译FFmpeg。
首先,我们下载libtensorflow c开发库,其官方下载链接是https://www.tensorflow.org/install/lang_c ,目前最新版本是1.15.0,顺便提一句,主页上还提到目前还不支持tensorflow 2(There is no libtensorflow support for TensorFlow 2 yet.)。但是,从1.14到1.15版本切换的时候,头文件发生了变化,而FFmpeg最早是在2018年引入对Tensorflow的支持,所以,我们目前还无法使用1.15版本,必须使用之