2022年了,将深度学习模型部署到手机上有什么成熟的解决方案吗?
10 个回答
最近更新:FastDeploy来啦 ~
前言
大家好,我是DefTruth, 一枚平平无奇的代码仔 ~ 所谓好记性不如烂笔头,写点技术水文,既是输出,也是一种输入。之前一直在写些和模型部署相关的水文,业余时间也会去维护一下自己的开源项目 lite.ai.toolkit 。不过最近有段时间没有更新文章了,这是为什么呢?哈哈哈,不卖关子,这是由于最近几个月,高密度地参与到了 FastDeploy 的开发当中。那么 FastDeploy 又是一个怎样的工具呢?他能帮助大家解决什么样的问题呢?接下来就和大家来分享一下这个部署利器。
这篇文章是【FastDeploy技术分享】专栏第一弹,后续还会和大家分享FastDeploy更多的使用技巧,欢迎关注 ~
正文内容
以下内容转载于微信公众号: 飞桨PaddlePaddle ,更多精彩内容,请关注 飞桨PaddlePaddle
人工智能产业应用发展的越来越快,开发者需要面对的适配部署工作也越来越复杂。层出不穷的算法模型、各种架构的AI硬件、不同场景的部署需求(服务器、服务化、嵌入式、移动端等)、不同操作系统和开发语言,为AI开发者项目落地带来不小的挑战。
为了解决AI部署落地难题,我们发起了FastDeploy项目。FastDeploy针对产业落地场景中的重要AI模型,将模型API标准化,提供下载即可运行的Demo示例。相比传统推理引擎,做到端到端的推理性能优化。FastDeploy还支持在线(服务化部署)和离线部署形态,满足不同开发者的部署需求。 经过为期一年的高密度打磨,FastDeploy目前具备3类特色能力:
- 全场景 :支持GPU、CPU、Jetson、ARM CPU、瑞芯微NPU、晶晨NPU、恩智浦NPU等多类硬件,支持本地部署、服务化部署、Web端部署、移动端部署等,支持CV、NLP、Speech三大领域,支持图像分类、图像分割、语义分割、物体检测、字符识别(OCR)、人脸检测识别、人像扣图、姿态估计、文本分类、信息抽取、行人跟踪、语音合成等16大主流算法场景。
- 易用灵活 :3行代码完成AI模型的部署,1行代码快速切换后端推理引擎和部署硬件,统一API实现不同部署场景的零成本迁移。提供了150+热门AI模型的部署Demo。
- 极致高效 :相比传统深度学习推理引擎只关注模型的推理时间,FastDeploy则关注模型任务的端到端部署性能。通过高性能前后处理、整合高性能推理引擎、一键自动压缩等技术,实现了AI模型推理部署的极致性能优化。 项目传送门
以下将对该3大特性做进一步技术解读,全文大约2100字,预计阅读时长3分钟。
一. 3大特性篇 二. 3步部署实战篇,抢先看
- CPU/GPU部署实战
- Jetson部署实战
- RK3588部署实战(RV1126、晶晨A311D等NPU类似)
3大特性解读
- 全场景:1套代码云边端多平台多硬件一网打尽,覆盖CV、NLP、Speech支持Paddle Inference、TensorRT、OpenVINO、ONNX Runtime、Paddle Lite、RKNN等后端,覆盖常见的NVIDIA GPU、x86 CPU 、ARM CPU(移动端、ARM开发板)、瑞芯微NPU(RK3588、RK3568、RV1126、RV1109、RK1808)、晶晨NPU(A311D、S905D)等云边端场景的多类几十款AI硬件部署。同时支持服务化部署、离线CPU/GPU部署、端侧和移动端部署方式。针对不同硬件,统一API保证1套代码在数据中心、边缘部署和端侧部署无缝切换。
FastDeploy支持CV、NLP、Speech三大AI领域,覆盖16大类算法(图像分类、图像分割、语义分割、物体检测、字符识别(OCR) 、人脸检测、人脸关键点检测、人脸识别、人像扣图、视频扣图、姿态估计、文本分类 信息抽取 文图生成、行人跟踪、语音合成)。支持飞桨PaddleClas、PaddleDetection、PaddleSeg、PaddleOCR、PaddleNLP、PaddleSpeech 6大热门AI套件的主流模型,同时也支持生态(如PyTorch、ONNX等)热门模型的部署。
- 易用灵活3行代码完成模型部署,1行命令切换推理后端和硬件,快速体验150+热门模型部署 FastDeploy三行代码可完成AI模型在不同硬件上的部署,极大降低了AI模型部署难度和工作量。一行命令切换TensorRT、OpenVINO、Paddle Inference、Paddle Lite、ONNX Runtime、RKNN等不同推理后端和对应硬件。低门槛的推理引擎后端集成方案,平均一周即可完成任意硬件推理引擎的接入使用,解耦前后端架构设计,简单编译测试即可体验FastDeploy支持的AI模型。开发者可以根据模型API实现相应模型部署,也可以选择git clone一键获取150+热门AI模型的部署示例Demo,快速体验不同模型的推理部署。
- FastDeploy部署不同模型
# PP-YOLOE的部署
import fastdeploy as fd
import cv2
model = fd.vision.detection.PPYOLOE("model.pdmodel",
"model.pdiparams",
"infer_cfg.yml")
im = cv2.imread("test.jpg")
result = model.predict(im)# YOLOv7的部署
import fastdeploy as fd
import cv2
model = fd.vision.detection.YOLOv7("model.onnx")
im = cv2.imread("test.jpg")
result = model.predict(im)
- FastDeploy切换后端和硬件
# PP-YOLOE的部署
import fastdeploy as fd
import cv2
option = fd.RuntimeOption()
option.use_cpu()
option.use_openvino_backend() # 一行命令切换使用 OpenVINO部署
model = fd.vision.detection.PPYOLOE("model.pdmodel",
"model.pdiparams",
"infer_cfg.yml",
runtime_option=option)
im = cv2.imread("test.jpg")
result = model.predict(im)
- 极致高效一键压缩提速,预处理加速,端到端性能优化,提升AI算法产业落地 FastDeploy在吸收TensorRT、OpenVINO、Paddle Inference、Paddle Lite、ONNX Runtime、RKNN等高性能推理优势的同时,通过端到端的推理优化解决了传统推理引擎仅关心模型推理速度的问题,提升整体推理速度和性能。集成自动压缩工具,在参数量大大减小的同时(精度几乎无损),推理速度大幅提升。使用CUDA加速优化预处理和后处理模块,将YOLO系列的模型推理加速整体从41ms优化到25ms。端到端的优化策略,彻底解决AI部署落地中的性能难题。 更多性能优化,欢迎关注GitHub了解详情
3步部署实战篇 CPU/GPU部署实战(以YOLOv7为例)
- 安装FastDeploy部署包,下载部署示例(可选,也可3行API实现部署代码)
pip install fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
git clone https://github.com/PaddlePaddle/FastDeploy.git
cd examples/vision/detection/yolov7/python/
- 准备模型文件和测试图片
wget https://bj.bcebos.com/paddlehub/fastdeploy/yolov7.onnx
wget https://gitee.com/paddlepaddle/PaddleDetection/raw/release/2.4/demo/000000014439.jpg
- CPU/GPU推理模型
# CPU推理
python infer.py --model yolov7.onnx --image 000000014439.jpg --device cpu
# GPU推理
python infer.py --model yolov7.onnx --image 000000014439.jpg --device gpu
# GPU上使用TensorRT推理
python infer.py --model yolov7.onnx --image 000000014439.jpg --device gpu --use_trt True
- 推理结果示例
Jetson部署实战(以YOLOv7为例)
- 安装FastDeploy部署包,配置环境变量
git clone https://github.com/PaddlePaddle/FastDeploy cd FastDeploy
mkdir build && cd build
cmake .. DBUILD_ON_JETSON=ON DENABLE_VISION=ON DCMAKE_INSTALL_PREFIX=${PWD}/install make j8
make install
cd FastDeploy/build/install
source fastdeploy_init.sh
- 准备模型文件和测试图片
wget https://bj.bcebos.com/paddlehub/fastdeploy/yolov7.onnx
wget https://gitee.com/paddlepaddle/PaddleDetection/raw/release/2.4/demo/000000014439.jpg
- 编译推理模型
cd examples/vision/detection/yolov7/cpp
cmake .. DFASTDEPLOY_INSTALL_DIR=${FASTDEPOLY_DIR}
mkdir build && cd build
make j
# 使用TensorRT推理(当模型不支持TensorRT时会自动转成使用CPU推理)
./infer_demo yolov7s.onnx 000000014439.jpg 2
- 推理结果示例
RK3588部署实战 以轻量化检测网络PicoDet为例
- 安装FastDeploy部署包,下载部署示例(可选,也可3行API实现部署代码)
# 参考编译文档,完成FastDeploy编译安装
# 参考文档链接:https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/rknpu2.md
# 下载部署示例代码
git clone https://github.com/PaddlePaddle/FastDeploy.git
cd examples/vision/detection/paddledetection/rknpu2/python
- 准备模型文件和测试图片
wget https://bj.bcebos.com/fastdeploy/models/rknn2/picodet_s_416_coco_npu.zip
unzip -qo picodet_s_416_coco_npu.zip
## 下载Paddle静态图模型并解压
wget https://bj.bcebos.com/fastdeploy/models/rknn2/picodet_s_416_coco_npu.zip
unzip -qo picodet_s_416_coco_npu.zip
# 静态图转ONNX模型,注意,这里的save_file请和压缩包名对齐
paddle2onnx --model_dir picodet_s_416_coco_npu \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--save_file picodet_s_416_coco_npu/picodet_s_416_coco_npu.onnx \
--enable_dev_version True
python -m paddle2onnx.optimize --input_model picodet_s_416_coco_npu/picodet_s_416_coco_npu.onnx \
--output_model picodet_s_416_coco_npu/picodet_s_416_coco_npu.onnx \
--input_shape_dict "{'image':[1,3,416,416]}"
# ONNX模型转RKNN模型
# 转换模型,模型将生成在picodet_s_320_coco_lcnet_non_postprocess目录下
python tools/rknpu2/export.py --config_path tools/rknpu2/config/RK3588/picodet_s_416_coco_npu.yaml
# 下载图片
wget https://gitee.com/paddlepaddle/PaddleDetection/raw/release/2.4/demo/000000014439.jpg
- 推理模型
python3 infer.py --model_file ./picodet _3588/picodet_3588.rknn \
--config_file ./picodet_3588/deploy.yaml \
--image images/000000014439.jpg
- 加入FastDeploy技术交流群
- 入群福利 FastDeploy: 除了本次更新外,硬件能力还在持续扩展中,包括Graphcore、飞腾、ARM CPU(安卓、iOS、ARMLinux)、高通、昇腾、地平线、昆仑、爱芯元智等;服务化部署、Jetson上基于硬解码的系统方案(即将发布)、端到端的高性能优化等。真正解决部署落地中大家关心的速度、性能、系统等问题。入群获取产品发新最新资讯。为了让开发者进一步了解FastDeploy的部署能力,更快速的使用到项目当中,
- GitHub传送门:
- 文章传送:
深度学习模型部署综述(ONNX/NCNN/OpenVINO/TensorRT)
费尽心血训练好的深度学习模型如何给别人展示?只在服务器上运行demo怎么吸引别人的目光?怎么才能让自己的成果落地?这篇文章带你进入模型部署的大门。
作者:汽车人 | 原文出处: 公众号【自动驾驶之心】
自动驾驶之心->: 【模型部署】技术交流群
点击关注 @自动驾驶之心 ,第一时间看到最前沿与价值的CV/自动驾驶/AI类工作~
强烈推荐!自动驾驶与AI学习社区: 欢迎加入国内首个自动驾驶开发者社区!这里有最全面有效的自动驾驶与AI学习路线(感知/定位/融合)和自动驾驶与AI公司内推机会!
0 前言
模型部署的步骤:
- 训练一个深度学习模型;
- 使用不同的推理框架对模型进行推理转换;
- 在应用平台运行转换好的模型。
步骤看起来比较简单,但是牵扯的到的知识还是比较多。在实际应用过程中,我们使用的模型通常不会太简单,因为要确保模型的精度。但是,实际应用场景往往需要模型速度与精度能达到一个较好的平衡。因此这就需要在算法(剪枝,压缩等)与底层(手写加速算作)去优化模型。但是,我们现在可以站在巨人的肩膀上去眺望世界,因此,该文章会给大家介绍一些常用的开源推理框架,大家一起参考学习。毕竟大牛团队做出来的好用一些。。。
1 ONNX、NCNN、OpenVINO、 TensorRT、Mediapipe模型部署那家强?
1.1 ONNX
简介:
开放神经网络交换ONNX(Open Neural Network Exchange)是一套表示深度神经网络模型的开放格式,由微软和Facebook于2017推出,然后迅速得到了各大厂商和框架的支持。通过短短几年的发展,已经成为表示深度学习模型的实际标准,并且通过ONNX-ML,可以支持传统非神经网络机器学习模型,大有一统整个AI模型交换标准。ONNX定义了一组与环境和平台无关的标准格式,为AI模型的互操作性提供了基础,使AI模型可以在不同框架和环境下交互使用。硬件和软件厂商可以基于ONNX标准优化模型性能,让所有兼容ONNX标准的框架受益,简单来说,ONNX就是 模型转换的中间人 。
使用场景:
无论你使用什么样的训练框架来训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),你都可以在训练后将这些框架的模型统一转为ONNX存储。 ONNX文件不仅存储了神经网络模型的权重,还存储了模型的结构信息、网络中各层的输入输出等一些信息。目前,ONNX主要关注在模型预测方面(inferring),将转换后的ONNX模型,转换成我们需要使用不同框架部署的类型,可以很容易的部署在兼容ONNX的运行环境中。
使用方法:
[ 代码示例 ]在 ONNX 模型上运行形状推理: https:// github.com/onnx/onnx
import onnx
from onnx import helper, shape_inference
from onnx import TensorProto
# 预处理:创建一个包含两个节点的模型,Y是未知的
node1 = helper.make_node("Transpose", ["X"], ["Y"], perm=[1, 0, 2])
node2 = helper.make_node("Trans
pose", ["Y"], ["Z"], perm=[1, 0, 2])
graph = helper.make_graph(
[node1, node2],
"two-transposes",
[helper.make_tensor_value_info("X", TensorProto.FLOAT, (2, 3, 4))],
[helper.make_tensor_value_info("Z", TensorProto.FLOAT, (2, 3, 4))],
original_model = helper.make_model(graph, producer_name="onnx-examples")
# 检查模型并打印Y的信息
onnx.checker.check_model(original_model)
print(f"Before shape inference, the shape info of Y is:\n{original_model.graph.value_info}")
# 在模型上进行推理
inferred_model = shape_inference.infer_shapes(original_model)
# 检查模型并打印Y的信息
onnx.checker.check_model(inferred_model)
print(f"After shape inference, the shape info of Y is:\n{inferred_model.graph.value_info}")
1.2 NCNN
简介:
ncnn 是一个为 手机端 极致优化的高性能神经网络前向计算框架,也是腾讯优图实验室成立以来的第一个开源项目。ncnn 从设计之初深刻考虑手机端的部署和使用,无第三方依赖,跨平台,手机端 CPU 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 App。ncnn 目前已在腾讯多款应用中使用,如 QQ、Qzone、微信、天天P图等。
使用场景:
从NCNN的发展矩阵可以看出,NCNN覆盖了几乎所有常用的系统平台,尤其是在移动平台上的适用性更好,在Linux、Windows和Android、以及iOS、macOS平台上都可以使用GPU来部署模型。
框架特点:
- 支持卷积神经网络,支持多输入和多分支结构,可计算部分分支
- 无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架
- 纯 C++ 实现,跨平台,支持 Android / iOS 等
- ARM Neon 汇编级良心优化,计算速度极快
- 精细的内存管理和数据结构设计,内存占用极低
- 支持多核并行计算加速,ARM big.LITTLE CPU 调度优化
- 支持基于全新低消耗的 Vulkan API GPU 加速
- 可扩展的模型设计,支持 8bit 量化和半精度浮点存储,可导入 caffe/pytorch/mxnet/onnx/darknet/keras/tensorflow(mlir) 模型
- 支持直接内存零拷贝引用加载网络模型
- 可注册自定义层实现并扩展
使用方法:
[ 代码示例 ]输入数据并推理输出: https:// github.com/Tencent/ncnn /wiki
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "net.h"
int main()
// opencv读取输入图片
cv::Mat img = cv::imread("image.ppm", CV_LOAD_IMAGE_GRAYSCALE);
int w = img.cols;
int h = img.rows;
// 减均值以及缩放操作,最后输入数据的值域为[-1,1]
ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_GRAY, w, h, 60, 60);
float mean[1] = { 128.f };
float norm[1] = { 1/128.f };
in.substract_mean_normalize(mean, norm);
// 构建NCNN的net,并加载转换好的模型
ncnn::Net net;
net.load_param("model.param");
net.load_model("model.bin");
// 创建网络提取器,设置网络输入,线程数,light模式等等
ncnn::Extractor ex = net.create_extractor();
ex.set_light_mode(true);
ex.set_num_threads(4);
ex.input("data", in);
// 调用extract接口,完成网络推理,获得输出结果
ncnn::Mat feat;
ex.extract("output", feat);
return 0;
1.3 OpenVINO
简介:
OpenVINO是一种可以加快高性能计算机视觉和深度学习视觉应用开发速度的工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行。OpenVINO™工具包是用于快速开发应用程序和解决方案的综合工具包,可解决各种任务,包括模拟人类视觉,自动语音识别,自然语言处理,推荐系统等。该工具包基于最新一代的人工神经网络,包括卷积神经网络(CNN),循环和基于注意力的网络,可在英特尔®硬件上扩展计算机视觉和非视觉工作负载,从而最大限度地提高性能。它通过从边缘到云的高性能,人工智能和深度学习推理来加速应用程序。
使用场景:
框架特点:
OpenVINO在模型部署前,首先会对模型进行优化,模型优化器会对模型的拓扑结构进行优化,去掉不需要的层,对相同的运算进行融合、合并以加快运算效率,减少内存拷贝;FP16、INT8量化也可以在保证精度损失很小的前提下减小模型体积,提高模型的性能。在部署方面,OpenVIVO的开发也是相对比较简单的,提供了C、C++和python3种语言编程接口。它最大的优势呢,其实还是在Intel的不同硬件平台上进行部署的时候,移植会很方便。推理引擎对不同的硬件提供统一的接口,底层实现直接调用硬件指令集的加速库,应用程序开发人员不需要关心底层的硬件实现,即可在不同的硬件平台上加速模型推理。
- 在边缘启用基于CNN的深度学习推理
- 支持通过英特尔®Movidius™VPU在英特尔®CPU,英特尔®集成显卡,英特尔®神经计算棒2和英特尔®视觉加速器设计之间进行异构执行
- 通过易于使用的计算机视觉功能库和预先优化的内核加快上市时间
- 包括对计算机视觉标准(包括OpenCV *和OpenCL™)的优化调用
使用方法:
[ 代码示例 ]在应用程序中实现典型的 OpenVINO™ 运行推理: https:// docs.openvino.ai/latest /openvino_docs_OV_UG_Integrate_OV_with_your_application.html
#include <openvino/openvino.hpp>
// 1.创建 OpenVINO™ 核心以管理可用设备和读取模型对象
ov::Core core;
// 2.为特定设备编译模型
ov::CompiledModel compiled_model = core.compile_model("model.onnx", "AUTO");
// 3.创建推理请求
ov::InferRequest infer_request = compiled_model.create_infer_request();
// 4.设置输入
// 获取模型的输入端口
auto input_port = compiled_model.input();
// 从外部存储器创建张量
ov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), memory_ptr);
// 为模型设置一个输入张量
infer_request.set_input_tensor(input_tensor);
// 5.开始推理
infer_request.start_async();
infer_request.wait();
// 6.处理推理结果
// 通过tensor_name获取输出张量
auto output = infer_request.get_tensor("tensor_name");
const float \*output_buffer = output.data<const float>();
// output_buffer[] - 访问输出张量数据
// 7.释放分配的对象(仅适用于C)
ov_shape_free(&input_shape);
ov_tensor_free(output_tensor);
ov_output_const_port_free(input_port);
ov_tensor_free(tensor);
ov_infer_request_free(infer_request);
ov_compiled_model_free(compiled_model);
ov_model_free(model);
ov_core_free(core);
// 为项目创建结构
project/
├── CMakeLists.txt - CMake file to build
├── ... - Additional folders like includes/
└── src/ - source folder
└── main.cpp
build/ - build directory
// 创建 Cmake 脚本
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenVINO REQUIRED)
add_executable(${TARGET_NAME} src/main.cpp)
target_link_libraries(${TARGET_NAME} PRIVATE openvino::runtime)
// 构建项目
cd build/
cmake ../project
cmake --build .
1.4 TensorRT
简介:
NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高吞吐量。
在推理过程中,基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快 40 倍。借助 TensorRT,您可以优化在所有主要框架中训练的神经网络模型,精确校正低精度,并最终将模型部署到超大规模数据中心、嵌入式或汽车产品平台中。
TensorRT 以 NVIDIA 的并行编程模型 CUDA 为基础构建而成,可帮助您利用 CUDA-X 中的库、开发工具和技术,针对人工智能、自主机器、高性能计算和图形优化所有深度学习框架中的推理。
TensorRT 针对多种深度学习推理应用的生产部署提供 INT8 和 FP16 优化,例如视频流式传输、语音识别、推荐和自然语言处理。推理精度降低后可显著减少应用延迟,这恰巧满足了许多实时服务、自动和嵌入式应用的要求。
使用场景:
框架特点:
1. 权重与激活精度校准
通过将模型量化为 INT8 来更大限度地提高吞吐量,同时保持高准确度
2. 层与张量融合
通过融合内核中的节点,优化 GPU 显存和带宽的使用
3. 内核自动调整
基于目标 GPU 平台选择最佳数据层和算法
4. 动态张量显存
更大限度减少显存占用,并高效地为张量重复利用内存
5. 多流执行
用于并行处理多个输入流的可扩展设计
图片取自TensorRT的官网,里面列出了TensorRT使用的一些技术。可以看到模型量化、动态内存优化、层的融合等技术均已经在TensorRT中集成了,这也是它能够极大提高模型推断速度的原因。总体来说TensorRT将训练好的模型通过一系列的优化技术转化为了能够在特定平台(GPU)上以高性能运行的代码,也就是最后图中生成的Inference Engine。
使用方法:
1.导出模型
2.选择批次大小
3.选择精度
4.转换模型:
- 使用 TF-TRT
- 从文件自动 转换 ONNX
- 使用 TensorRT API 手动构建网络(C++或python)
5.部署模型:
- 在 TensorFlow 中部署
- 使用独立的 TensorRT 运行时 API
- 使用 NVIDIA Triton 推理服务器
具体模型转换部署方法详见:[Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation]: https:// docs.nvidia.com/deeplea rning/tensorrt/quick-start-guide/index.html
1.5 Mediapipe
简介:
MediaPipe是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。作为一款跨平台框架,MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。
除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。
使用场景:
框架特点:
- 端到端加速 :内置快速 ML 推理和处理,即使在普通硬件上也能加速
- 一次构建,随处部署 :统一解决方案适用于安卓、iOS、桌面/云、Web 和物联网
- 即用型解决方案 :展示框架全部功能的尖端 ML 解决方案
- 免费和开源 :Apache 2.0下的框架和解决方案,完全可扩展和可定制
使用方法:
[代码示例]以人脸检测为例: https:// google.github.io/mediap ipe/solutions/face_detection
import cv2
import mediapipe as mp
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
# 对于静态图像:
IMAGE_FILES = []
with mp_face_detection.FaceDetection(
model_selection=1, min_detection_confidence=0.5) as face_detection:
for idx, file in enumerate(IMAGE_FILES):
image = cv2.imread(file)
# 将BGR图像转换为RGB并使用MediaPipe人脸检测对其进行处理.
results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 绘制每张人脸的人脸检测.
if not results.detections:
continue
annotated_image = image.copy()
for detection in results.detections:
print('Nose tip:')
print(mp_face_detection.get_key_point(
detection, mp_face_detection.FaceKeyPoint.NOSE_TIP))
mp_drawing.draw_detection(annotated_image, detection)
cv2.imwrite('/tmp/annotated_image' + str(idx) + '.png', annotated_image)
# 用于网络摄像头输入:
cap = cv2.VideoCapture(0)
with mp_face_detection.FaceDetection(
model_selection=0, min_detection_confidence=0.5) as face_detection:
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
# 如果加载视频,请使用“中断”而不是“继续”.
continue
# 若要提高性能,可以选择将图像标记为不可写以通过引用传递.
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = face_detection.process(image)
# 在图像上绘制人脸检测注释.
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detections:
for detection in results.detections:
mp_drawing.draw_detection(image, detection)
# 水平翻转图像以获得自拍视图显示.
cv2.imshow('MediaPipe Face Detection', cv2.flip(image, 1))