ffmpeg检测文件是否损坏_在FFmpeg中使用OpenVINO推理引擎

在2020年7月初,我把对OpenVINO(Open Visual Inference & Neural Network Optimization)推理引擎的调用加到了FFmpeg中,也就意味着现在FFmpeg深度学习模块的后端有三个了,分别是TensorFlow、OpenVINO和Native,如下图所示。之前已经对TensorFlow和Native后端有过一些介绍,本文对如何使用OpenVINO后端做个简单介绍。e2dd859ce3544b202379c4fca46cceea.png

  • 编译和安装OpenVINO

OpenVINO是Intel发布的一套深度学习框架,支持多种模型文件格式,包括Tensorflow、 Caffe、ONNX、MXNet、Kaldi和Torch(通过ONNX中转)等,也支持各种Intel硬件,包括CPU、GPU、FPGA、Movidius神经计算棒等。由于FFmpeg要求调用的库必须提供C API,而刚好OpenVINO在2020年发布版本中增加了这样的接口。再加上OpenVINO后端相对于TensorFlow后端可以提供更多的模型格式支持,而且可以更多更好的支持各种底层硬件。所以,FFmpeg社区接受了OpenVINO中的推理引擎作为一个新的深度学习后端。

编译OpenVINO推理引擎的具体操作如下所示,我的所有操作都在Ubuntu 18.04上进行。也可以参考官方文档https://github.com/openvinotoolkit/openvino/blob/master/build-instruction.md

OpenVINO使用CMake的方法,要求cmake版本是3.11或以上,
而Ubuntu 18.04默认cmake版本是3.10.2,所以,需要先升级cmake
$ wget https://github.com/Kitware/CMake/releases/download/v3.15.3/cmake-3.15.3.tar.gz
$ tar zxvf cmake-3.15.3.tar.gz
$ cd cmake-3.15.3/
$ ./bootstrap
$ make
$ sudo make install
$ cmake --version
cmake version 3.15.3

然后下载OpenVINO源代码
$ git clone https://github.com/openvinotoolkit/openvino.git

由于openvino还用到了第三方库作为git的子模块,所以,还需要将这些子模块的代码也下载下来
$ cd openvino/
$ git submodule update --init --recursive

安装编译需要的依赖
$ ./install_dependencies.sh

准备编译需要的目录
$ mkdir build
$ cd build/

由于OpenVINO功能广泛,默认选项会打开所有的支持,
这里只启用CPU硬件(ENABLE_MKL_DNN=ON),其他的做关闭OFF处理。
如果要启用GPU的话,则需设置ENABLE_CLDNN=ON,同时确保OpenCL驱动已安装,可用clinfo来检验。
其他的选项介绍,这里不再展开。
$ cmake \
-DENABLE_MKL_DNN=ON \
-DENABLE_GNA=OFF \
-DENABLE_CLDNN=OFF \
-DENABLE_MYRIAD=OFF \
-DENABLE_VPU=OFF \
-DENABLE_OPENCV=OFF \
..

执行make开始编译。说明一下,在cmake和make阶段,都会自动下载需要的代码依赖,无需人工介入。
编译时间较长,请耐心等候。
$ make

我们可以看到默认被安装到/usr/local/deployment_tools/inference_engine/目录下,
记下这个位置,后面在编译FFmpeg的时候会用到。
$ sudo make install
...
-- Installing: /usr/local/lib/pkgconfig/gflags.pc
-- Installing: /usr/local/deployment_tools/inference_engine/lib/intel64/libinference_engine_c_api.so
-- Set runtime path of "/usr/local/deployment_tools/inference_engine/lib/intel64/libinference_engine_c_api.so" to ""
-- Up-to-date: /usr/local/deployment_tools/inference_engine/include/
-- Installing: /usr/local/deployment_tools/inference_engine/include//c_api
-- Installing: /usr/local/deployment_tools/inference_engine/include//c_api/ie_c_api.h
  • 重新编译FFmpeg

在默认编译选项下,FFmpeg不支持OpenVINO后端,所以,我们需要重新编译FFmpeg。具体过程如下。

首先获取源代码
$ git clone https://git.ffmpeg.org/ffmpeg.git

准备编译目录
$ cd ffmpeg/
$ mkdir build
$ cd build/

在ffmpeg的configure脚本中,
会生成、编译然后运行一个简单的程序来检测openvino在当前系统中是否存在,
所以,我们要先设置LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/usr/local/deployment_tools/inference_engine/lib/intel64/:/usr/local/deployment_tools/inference_engine/external/tbb/lib/

由于openvino的默认安装位置不在系统目录中,所以还需要为configure指出头文件和库文件的位置
$ ../configure --enable-libopenvino --extra-cflags=-I/usr/local/deployment_tools/inference_engine/include/ --extra-ldflags=-L/usr/local/deployment_tools/inference_engine/lib/intel64
$ make

可以看到编译结果如下
$ ls
config.asm doc ffmpeg ffprobe fftools libavdevice libavformat libswresample Makefile tests
config.h ffbuild ffmpeg_g ffprobe_g libavcodec libavfilter libavutil libswscale src

再提一句,FFmpeg中无法同时支持tensorflow后端和openvino后端,因为tensorflow c库将静态连接的hwloc的一些symbol也暴露出来了,和openvino的动态链接放在一起后,会在运行时产生混乱,详见https://github.com/tensorflow/tensorflow/issues/40830

  • 准备模型

在OpenVINO的model zoo中,和图像处理的模型文件有三个,分别是两种分辨率下的图像超分和一个文字超分模型,详见https://docs.openvinotoolkit.org/2020.3/usergroup9.html。我们只关注图像处理相关模型,是因为目前FFmpeg中没有基于深度学习模型的图像分析的filter,只有图像处理的通用filter,即dnn_processing,也因此我们使用dnn_processing作为演示的例子。

但是,这三个模型要求的输入,和目前dnn_processing支持的输入有点区别,比如,现在dnn_processing假设每个模型只有一个输入,而这两个图像超分模型要求有两个输入,另外,dnn_processing假设float类型的范围是[0.0, 1.0],而这三个模型则要求用[0.0, 255.0]来表示。所以,这三个模型都无法直接使用。当然,我也在考虑,如何为dnn_processing增加更多输入输出支持的灵活性,这是后话。

由于dnn_processing一开始对于输入输出的设计是基于tensorflow模型文件,所以,我们就选择使用tensorflow格式模型,然后将其转换为openvino格式,再来使用。我们选择之前介绍过的srcnn模型,此模型的输入输出图片的分辨率是相同的,模型的生成方法见之前介绍点击进入,也可以直接从https://github.com/guoyejun/dnn_processing/tree/master/models下载得到srcnn.pb模型文件。

我们知道,卷积层的一个特点是对输入图像size没有要求,所以,我们往往能够训练出适合多种分辨率的模型文件。比如srcnn.pb文件,其输入的shape是[ 1 -1 -1 1],第一个1表示一张图片,最后一个1表示一个通道,即灰度图,而中间的-1,-1表示图片的高宽尺寸是任意可选的。但是,在openvino格式中,必须要指定输入shape,不可以用-1表示size可变,而必须要用一个具体的数值。那么,openvino还支持可变size吗?答案是支持的,虽然模型文件中要指定具体size数值,但是,在推理运行时,还可以动态的修改这个size值,达到可变的效果,详见https://github.com/openvinotoolkit/openvino/issues/522中的讨论。

现在,让我们回到之前git clone到的openvino代码树下,执行以下操作,将srcnn.pb模型文件,转换为openvino支持的模型文件,会得到两个文件,srcnn.xml和srcnn.bin。实际上,这两个模型文件我也已经放在刚才的网址中了,和srcnn.pb文件放在一起。

$cd your_path_to_openvino/model-optimizer

如前所述,我们必须要给定一个输入shape,
具体数值和我们后面的ffmpeg命令行参数相关
$ python3 mo_tf.py --input_model /yourpath/srcnn.pb --data_type=FP32 --input_shape [1,960,1440,1] --keep_shape_ops

查看生成结果
$ ls -s srcnn.xml srcnn.bin
32 srcnn.bin 12 srcnn.xml

模型转换后,输入的变量名保持不变,还叫x,输出变量名则变成了srcnn/Maximum。

  • 执行模型

然后,回到ffmpeg的编译目录,使用dnn_processing调用openvino进行超分模型的推理,命令如下所示。

$ cd /your_path_to_ffmpeg/build/

输入图片480p.jpg的size是720*480,
用到了3个filter,分别是format,scale和dnn_processing,
其中format用来将图片格式转换为yuv420p,这也是这个超分模型所需要的,因为它只处理Y通道。
scale则将图片放到2倍,到1440*960,这个数字对应着我们之前做模型转换使用的input_shape参数。
dnn_processing的参数,其中dnn_backend表示调用openvino推理引擎,model则指出模型文件(.bin文件要在同个目录下),input和output则分别是模型的输入输出的变量名。
$ ./ffmpeg -i 480p.jpg -vf format=yuv420p,scale=w=iw*2:h=ih*2,dnn_processing=dnn_backend=openvino:model=/your_path/srcnn.xml:input=x:output=srcnn/Maximum -y srcnn.ov.jpg

OpenVINO还有很多优化选项,将在后续持续启用,后续也将增加更多的基于深度学习的视频分析用的filter,比如目标检测,车牌识别等。

  • 做个广告

之前参与写了一本书,《OpenCV深度学习应用与性能优化实践》,已由机械工业出版社在2020年6月出版。在成书过程中,我提了无数的意见和一些建议,算是本书主要架构的贡献者。另外,主写了 1.2 机器学习的数学视角,2.4 DNN引擎层(部分内容),第3章 并行计算与GPU架构(包括并行计算浅谈,Intel GPU硬件计算架构,AOS和SOA两种思路,以及cl_intel_subgroups在Intel GPU上的参考实现等),6.2 Halide后端的实现,7.2 TensorBoard:助力TensorFlow程序的理解和调试。下面是宣传海报,欢迎转发,感谢支持。

ac4f64a2cc95f0338aa7f493a841824d.png

以上内容是本人业余时间兴趣之作,限于水平,差错难免,仅代表个人观点,和本人任职公司无关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值