美文网首页
在FFmpeg中使用OpenVINO推理引擎

在FFmpeg中使用OpenVINO推理引擎

作者: 郭叶军 | 来源:发表于2020-07-11 09:54 被阅读0次

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


    file
    • 编译和安装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程序的理解和调试。下面是宣传海报,欢迎转发,感谢支持。

    file

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

    本文首发于微信公众号:那遁去的一

    相关文章

      网友评论

          本文标题:在FFmpeg中使用OpenVINO推理引擎

          本文链接:https://www.haomeiwen.com/subject/umvbcktx.html