FFmpeg中基于深度学习模型的目标检测

从FFmpeg的代码提交记录lavfi: add filter dnn_detect for object detection中,我们发现,FFmpeg已经以滤镜的形式提供了基于DNN的目标检测能力。

dnn_detect滤镜

在FFmpeg中,基于DNN的目标检测能力由dnn_detect滤镜vf_dnn_detect.c)提供。根据该能力的作者所提供的资料目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能可知:

当前目标检测只支持OpenVINO后端,后续还将尽快加入更多功能,比如基于TensorFlow模型的目标检测、支持OpenVINO后端的目标识别、目标检测和识别结果的可视化等。

根据目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能一文提供的demo可知,在当前的版本中,检测结果是通过showinfo滤镜以日志的形式输出的。

1
2
3
4
5
6
7
root@9d26c3a57bc7:/workspace# ffmpeg -i cici.jpg -vf dnn_detect=dnn_backend=openvino:model=face-detection-adas-0001.xml:input=data:output=detection_out:confidence=0.6:labels=face-detection-adas-0001.label,showinfo -f null -
...
[Parsed_showinfo_1 @ 0x561cf20c1f40] side data - detection bounding boxes:
[Parsed_showinfo_1 @ 0x561cf20c1f40] source: face-detection-adas-0001.xml
[Parsed_showinfo_1 @ 0x561cf20c1f40] index: 0, region: (1005, 813) -> (1086, 905), label: face, confidence: 10000/10000.
[Parsed_showinfo_1 @ 0x561cf20c1f40] index: 1, region: (888, 839) -> (967, 926), label: face, confidence: 6917/10000.
...

日志格式的检测结果不利于直观的分析,因此我对该滤镜做了简单的修改,为其增加了检测结果框选的能力,以便可以更方便的评估dnn_detect的检测能力。具体效果如下所示:

dnn_detect滤镜的安装

安装libtensorflow

https://storage.googleapis.com/tensorflow/中选择适合的libtensorflow版本下载即可,由于我是在MacOS上进行的实验,因此我选择了libtensorflow/libtensorflow-cpu-darwin-x86_64-2.4.1.tar.gz

1
2
3
cd workspace
wget https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-darwin-x86_64-2.4.1.tar.gz --no-check-certificate
tar xzvf libtensorflow-cpu-darwin-x86_64-2.4.1.tar.gz

安装openvino_toolkit

进入openvino_toolkit的下载页面,根据提示选择对应的版本下载并安装即可。MacOS的openvino_toolkit安装比较简单,下载对应的dmg文件之后,一路点击默认,然后安装就可以。默认会将相关的库文件安装在/opt/intel/openvino_2021目录。

重新编译FFmpeg

  • 拉取FFmpeg的master分支代码。

  • 根据vf_dnn_detect.7a6ea6ce2a.patch修改dnn_detect的代码。

  • 设置相关的环境变量,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:\
    /opt/intel/openvino_2021/inference_engine/lib/intel64:\
    /opt/intel/openvino_2021/inference_engine/external/tbb/lib:\
    /opt/intel/openvino_2021/deployment_tools/ngraph/lib:\
    /workspace/tensorflow/lib:\
    /workspace/ffmpeg/outputs/lib

    export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:\
    /workspace/ffmpeg/outputs/lib
  • 编译FFmpeg

    1
    2
    3
    4
    5
    6
    7
    8
    ./configure --prefix=./outputs \
    ... \
    --enable-libtensorflow \
    --enable-libopenvino \
    --extra-cflags="-I/workspace/tensorflow/include -I/opt/intel/openvino_2021/inference_engine/include" \
    --extra-ldflags="-L/workspace/tensorflow/lib -L/opt/intel/openvino_2021/inference_engine/lib/intel64"

    make && make install
  • 根据目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能中的demo下载对应的模型和相关文件,并使用ffplay播放。

    1
    2
    cd outputs && ./bin/ffplay -i test.mp4 \
    -vf "dnn_detect=dnn_backend=openvino:model=model/face-detection-adas-0001.xml:input=data:output=detection_out:confidence=0.6:labels=model/face-detection-adas-0001.label"

dnn_detect滤镜参数

vf_dnn_detect.c可知,dnn_detect滤镜的参数主要有:

  • dnn_backend:控制dnn的后端,目前只支持openvivo
  • confidence:dnn目标检测时的置信阈值,可以根据实际情况来设置
  • labels:指定检测使用模型所对应的label文件路径
  • model:指定检测使用模型所对应的model文件路径
  • input:模型的输入
  • output:模型的输出
  • backend_configs, options:这两个参数都对应的是模型后端的相关配置
  • async:设置是否启用异步的DNN接口,默认为异步

在使用中,可以根据自己的需要来设置滤镜的相关参数,进而达到自己的目的。例如,通过设置async来启用同步DNN接口,具体如下:

1
2
./bin/ffplay -i test.mp4 \
-vf "dnn_detect=dnn_backend=openvino:model=model/face-detection-adas-0001.xml:input=data:output=detection_out:confidence=0.6:labels=model/face-detection-adas-0001.label:async=0"

dnn_detect的其他模型

在如上的例子中,我们用人脸检测模型作为例子演示了FFmpeg中的DNN目标检测。实际上,作为一个通用的滤镜,替换模型之后,我们也可以用来进行其他类型的目标检测。

openvinotoolkit/open_model_zoo中,介绍了很多预训练好的模型,我们可以拿来直接用。各预训练模型可以从download.01.org/opencv/下载。选择模型的时候,务必保证下载和所使用的OpenVINO版本对应的模型,否则,可能会导致加载模型失败的问题。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2024 Wang Wei
  • 本站访问人数: | 本站浏览次数:

请我喝杯咖啡吧~

微信