From a0ff53e2dea7af7e38f41019e666f8f0366b1ec6 Mon Sep 17 00:00:00 2001
From: leiqing <54695910+leiqing1@users.noreply.github.com>
Date: Mon, 5 Sep 2022 13:32:05 +0800
Subject: [PATCH] Delete docs/06_arm_cpu directory
---
docs/06_arm_cpu/android_sdk.md | 404 ------------------
.../06_arm_cpu/arm_linux_cpp_sdk_inference.md | 404 ------------------
docs/06_arm_cpu/arm_linux_cpp_sdk_serving.md | 318 --------------
.../arm_linux_python_sdk_inference.md | 371 ----------------
.../arm_linux_python_sdk_serving.md | 266 ------------
docs/06_arm_cpu/ios_sdk.md | 212 ---------
.../replace_model_with_another_one.md | 266 ------------
7 files changed, 2241 deletions(-)
delete mode 100644 docs/06_arm_cpu/android_sdk.md
delete mode 100644 docs/06_arm_cpu/arm_linux_cpp_sdk_inference.md
delete mode 100644 docs/06_arm_cpu/arm_linux_cpp_sdk_serving.md
delete mode 100644 docs/06_arm_cpu/arm_linux_python_sdk_inference.md
delete mode 100644 docs/06_arm_cpu/arm_linux_python_sdk_serving.md
delete mode 100644 docs/06_arm_cpu/ios_sdk.md
delete mode 100644 docs/06_arm_cpu/replace_model_with_another_one.md
diff --git a/docs/06_arm_cpu/android_sdk.md b/docs/06_arm_cpu/android_sdk.md
deleted file mode 100644
index 2a2abbc56..000000000
--- a/docs/06_arm_cpu/android_sdk.md
+++ /dev/null
@@ -1,404 +0,0 @@
-# 简介
-
-本文档介绍FastDeploy中的模型SDK,在Android环境下:(1)推理操作步骤;(2)介绍模型SDK使用说明,方便开发者了解项目后二次开发。
-
-
-
-* [简介](#简介)
-
-* [系统支持说明](#系统支持说明)
-
-* [快速开始](#快速开始)
-
- * [1. 项目结构说明](#1-项目结构说明)
- * [2. APP 标准版测试](#2-app-标准版测试)
- * [2.1 扫码体验](#21-扫码体验)
- * [2.2 源码运行](#22-源码运行)
- * [3. 精简版测试](#3-精简版测试)
-
-* [SDK使用说明](#sdk使用说明)
-
- * [1. 集成指南](#1-集成指南)
- * [1.1 依赖库集成](#11-依赖库集成)
- * [1.2 添加权限](#12-添加权限)
- * [1.3 混淆规则(可选)](#13-混淆规则可选)
- * [2. API调用流程示例](#2-api调用流程示例)
- * [2.1 初始化](#21-初始化)
- * [2.2 预测图像](#22-预测图像)
-
-* [错误码](#错误码)
-
-
-
-# 系统支持说明
-
-1. Android 版本支持范围:Android 5.0(API21)<= Android < Android 10(API 29)。
-
-2. 硬件支持情况:支持 arm64-v8a 和 armeabi-v7a,暂不支持模拟器。
-* 官网测试机型:红米k30,Vivo v1981a,华为oxp-an00,华为cdy-an90,华为pct-al10,荣耀yal-al00,OPPO Reno5 Pro 5G
-3. 其他说明
-* 【图像分割类算法】(1)图像分割类算法,暂未提供实时摄像头推理功能,开发者可根据自己需要,进行安卓开发;(2)PP-Humanseg-Lite模型设计初衷为横屏视频会议等场景,本次安卓SDK仅支持竖屏场景,开发者可根据自己需要,开发横屏功能。
-* 【OCR模型】OCR任务第一次启动任务,第一张推理时间久,属于正常情况(因为涉及到模型加载、预处理等工作)。
-
-> 预测图像时运行内存不能过小,一般大于模型资源文件夹大小的3倍。
-
-# 快速开始
-
-## 1. 项目结构说明
-
-根据开发者模型、部署芯片、操作系统需要,在图像界面[飞桨开源模型](https://ai.baidu.com/easyedge/app/openSource)或[GIthub](https://github.com/PaddlePaddle/FastDeploy)中选择对应的SDK进行下载。SDK目录结构如下:
-
-```
-.EasyEdge-Android-SDK
-├── app
-│ ├── src/main
-│ │ ├── assets
-│ │ │ ├── demo
-│ │ │ │ └── conf.json # APP名字
-│ │ │ ├── infer # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
-│ │ │ │ ├── model # 模型结构文件
-│ │ │ │ ├── params # 模型参数文件
-│ │ │ │ ├── label_list.txt # 模型标签文件
-│ │ │ │ └── infer_cfg.json # 模型前后处理等配置文件
-│ │ ├── java/com.baidu.ai.edge/demo
-│ │ │ ├── infertest # 通用ARM精简版测试
-│ │ │ │ ├── TestInferClassifyTask.java # 图像分类
-│ │ │ │ ├── TestInferDetectionTask.java # 物体检测
-│ │ │ │ ├── TestInferSegmentTask.java # 实例分割
-│ │ │ │ ├── TestInferPoseTask.java # 姿态估计
-│ │ │ │ ├── TestInferOcrTask.java # OCR
-│ │ │ │ └── MainActivity.java # 精简版启动 Activity
-│ │ │ ├── MainActivity.java # Demo APP 启动 Activity
-│ │ │ ├── CameraActivity.java # 摄像头UI逻辑
-│ │ │ └── ...
-│ │ └── ...
-│ ├── libs
-│ │ ├── armeabi-v7a # v7a的依赖库
-│ │ ├── arm64-v8a # v8a的依赖库
-│ │ └── easyedge-sdk.jar # jar文件
-│ └── ...
-├── camera_ui # UI模块,包含相机逻辑
-├── README.md
-└── ... # 其他 gradle 等工程文件
-```
-
-## 2. APP 标准版测试
-
-考虑部分Android开发板没有摄像头,因此本项目开发了标准版和精简版两种。标准版会调用Android系统的摄像头,采集摄像头来进行AI模型推理;精简版在没有摄像头的开发板上运行,需要开发者准备图像。开发者根据硬件情况,选择对应的版本。
-
-### 2.1 扫码体验
-
-扫描二维码(二维码见下载网页`体验Demo`),无需任何依赖,手机上下载即可直接体验。
-
-

-
-### 2.2 源码运行
-
-(1)下载对应的SDK,解压工程。
- 
-(2)打开Android Studio, 点击 "Import Project...",即:File->New-> "Import Project...", 选择解压后的目录。
-(3)手机链接Android Studio,并打开开发者模式。(不了解开发者模式的开发者,可浏览器搜索)
-(4)此时点击运行按钮,手机上会有新app安装完毕,运行效果和二维码扫描的一样。
-
- 
-
-## 3. 精简版测试
-
-* 考虑部分Android开发板没有摄像头,本项目提供了精简版本,精简版忽略摄像头等UI逻辑,可兼容如无摄像头的开发板测试。
-
-* 精简版对应的测试图像路径,在代码`src/main/java/com.baidu.ai.edge/demo/TestInfer*.java`中进行了设置,开发者可以准备图像到对应路径测试,也可以修改java代码测试。
-
-* 支持以下硬件环境的精简版测试:通用ARM:图像分类、物体检测、实例分割、姿态估计、文字识别。
-
-示例代码位于 app 模块下 infertest 目录,修改 app/src/main/AndroidManifest.xml 中的启动 Activity 开启测试。
-修改前:
-
-```
-
-
-
- infertest.MainActivity
-
-
-
-
-
-```
-
-修改后:
-
-```
-
-
-
-
-
-
-
-```
-
-注意:修改后,因为没有测试数据,需要开发者准备一张测试图像,放到 `app/src/main/asserts/` 路径下,并按照`app/src/main/java/com/baidu/ai/edge/demo/infertest/TestInfer*.java`中的图像命名要求对图像进行命名。
-
-
-
-| Demo APP 检测模型运行示例 | 精简版检测模型运行示例 |
-| --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
-|  |  |
-
-
-# SDK使用说明
-
-本节介绍如何将 SDK 接入开发者的项目中使用。
-
-## 1. 集成指南
-
-步骤一:依赖库集成
-步骤二:添加必要权限
-步骤三:混淆配置(可选)
-
-### 1.1 依赖库集成
-
-A. 项目中未集成其他 jar 包和 so 文件:
-
-```
-// 1. 复制 app/libs 至项目的 app/libs 目录
-// 2. 参考 app/build.gradle 配置 NDK 可用架构和 so 依赖库目录
-
-android {
- ...
- defaultConfig {
- ndk {
- abiFilters 'armeabi-v7a', 'arm64-v8a'
- }
- }
- sourceSets {
- main {
- jniLibs.srcDirs = ['libs']
- }
- }
-}
-```
-
-B. 项目中已集成其他 jar 包,未集成 so 文件:
-
-```
-// 1. 复制 app/libs/easyedge-sdk.jar 与其他 jar 包同目录
-// 2. 复制 app/libs 下 armeabi-v7a 和 arm64-v8a 目录至 app/src/main/jniLibs 目录下
-// 3. 参考 app/build.gradle 配置 NDK 可用架构
-
-android {
- ...
- defaultConfig {
- ndk {
- abiFilters 'armeabi-v7a', 'arm64-v8a'
- }
- }
-}
-```
-
-C. 项目中已集成其他 jar 包和 so 文件:
-
-```
-// 1. 复制 app/libs/easyedge-sdk.jar 与其他 jar 包同目录
-// 2. 融合 app/libs 下 armeabi-v7a 和 arm64-v8a 下的 so 文件与其他同架构 so 文件同目录
-// 3. 参考 app/build.gradle 配置 NDK 可用架构
-
-android {
- ...
- defaultConfig {
- ndk {
- abiFilters 'armeabi-v7a', 'arm64-v8a' // 只支持 v7a 和 v8a 两种架构,有其他架构需删除
- }
- }
-}
-```
-
-### 1.2 添加权限
-
-参考 app/src/main/AndroidManifest.xml 中配置的权限。
-
-```
-
-
-
-```
-
-### 1.3 混淆规则(可选)
-
-请不要混淆 jar 包文件,参考 app/proguard-rules.pro 配置。
-
-```
--keep class com.baidu.ai.edge.core.*.*{ *; }
-```
-
-## 2. API调用流程示例
-
-以通用ARM的图像分类预测流程为例,详细说明请参考后续章节:
-
-```
-try {
- // step 1-1: 准备配置类
- InferConfig config = new InferConfig(context.getAssets(), "infer");
-
- // step 1-2: 准备预测 Manager
- InferManager manager = new InferManager(context, config, "");
-
- // step 2-1: 准备待预测的图像,必须为 Bitmap.Config.ARGB_8888 格式,一般为默认格式
- Bitmap image = getFromSomeWhere();
-
- // step 2-2: 预测图像
- List results = manager.classify(image, 0.3f);
-
- // step 3: 解析结果
- for (ClassificationResultModel resultModel : results) {
- Log.i(TAG, "labelIndex=" + resultModel.getLabelIndex()
- + ", labelName=" + resultModel.getLabel()
- + ", confidence=" + resultModel.getConfidence());
- }
-
- // step 4: 释放资源。预测完毕请及时释放资源
- manager.destroy();
-} catch (Exception e) {
- Log.e(TAG, e.getMessage());
-}
-```
-
-### 2.1 初始化
-
-**准备配置类**
-芯片与配置类对应关系:
-
-- 通用ARM:InferConfig
-
-```
-// 示例
-// 参数二为芯片对应的模型资源文件夹名称
-InferConfig config = new InferConfig(context.getAssets(), "infer");
-```
-
-**准备预测 Manager**
-芯片与 Manager 对应关系:
-
-- 通用ARM:InferManager
-
-```
-// 示例
-// 参数二为配置类对象
-// 参数三保持空字符串即可
-InferManager manager = new InferManager(context, config, "");
-```
-
-> **注意**
->
-> 1. 同一时刻只能有且唯一有效的 Manager,若要新建一个 Manager,之前创建的 Manager 需先调用 destroy() 销毁;
-> 2. Manager 的任何方法都不能在 UI 线程调用;
-> 3. Manager 的任何成员变量及方法由于线程同步问题,都必须在同一个线程中执行;
-
-### 2.2 预测图像
-
-本节介绍各种模型类型的预测函数及结果解析。
-
-> **注意**
-> 预测函数可以多次调用,但必须在同一个线程中,不支持并发
-> 预测函数中的 confidence 非必需,默认使用模型推荐值。填 0 可返回所有结果
-> 待预测的图像必须为 Bitmap.Config.ARGB_8888 格式的 Bitmap
-
-**图像分类**
-
-```
-// 预测函数
-List classify(Bitmap bitmap) throws BaseException;
-List classify(Bitmap bitmap, float confidence) throws BaseException;
-
-// 返回结果
-ClassificationResultModel
-- label: 分类标签,定义在label_list.txt中
-- labelIndex: 分类标签对应的序号
-- confidence: 置信度,0-1
-```
-
-**物体检测**
-
-```
-// 预测函数
-List detect(Bitmap bitmap) throws BaseException;
-List detect(Bitmap bitmap, float confidence) throws BaseException;
-
-// 返回结果
-DetectionResultModel
-- label: 标签,定义在label_list.txt中
-- confidence: 置信度,0-1
-- bounds: Rect,包含左上角和右下角坐标,指示物体在图像中的位置
-```
-
-**实例分割**
-
-```
-// 预测函数
-List segment(Bitmap bitmap) throws BaseException;
-List segment(Bitmap bitmap, float confidence) throws BaseException;
-
-// 返回结果
-SegmentationResultModel
-- label: 标签,定义在label_list.txt中
-- confidence: 置信度,0-1
-- lableIndex: 标签对应的序号
-- box: Rect,指示物体在图像中的位置
-- mask: byte[],表示原图大小的0,1掩码,绘制1的像素即可得到当前对象区域
-- maskLEcode: mask的游程编码
-```
-
-> 关于 maskLEcode 的解析方式可参考 [http demo](https://github.com/Baidu-AIP/EasyDL-Segmentation-Demo)
-
-**姿态估计**
-
-```
-// 预测函数
-List pose(Bitmap bitmap) throws BaseException;
-
-// 返回结果
-PoseResultModel
-- label: 标签,定义在label_list.txt中
-- confidence: 置信度,0-1
-- points: Pair, 2个点构成一条线
-```
-
-**文字识别**
-
-```
-// 预测函数
-List ocr(Bitmap bitmap) throws BaseException;
-List ocr(Bitmap bitmap, float confidence) throws BaseException;
-
-// 返回结果
-OcrResultModel
-- label: 识别出的文字
-- confidence: 置信度,0-1
-- points: List, 文字所在区域的点位
-```
-
-# 错误码
-
-| 错误码 | 错误描述 | 详细描述及解决方法 |
-| ---- | ------------------------------ | ------------------------------------------------------------------------------------ |
-| 1001 | assets 目录下用户指定的配置文件不存在 | SDK可以使用assets目录下config.json作为配置文件。如果传入的config.json不在assets目录下,则有此报错 |
-| 1002 | 用户传入的配置文件作为json解析格式不准确,如缺少某些字段 | 正常情况下,demo中的config.json不要修改 |
-| 19xx | Sdk内部错误 | 请与百度人员联系 |
-| 2001 | XxxxMANAGER 只允许一个实例 | 如已有XxxxMANAGER对象,请调用destory方法 |
-| 2002 | XxxxMANAGER 已经调用过destory方法 | 在一个已经调用destory方法的DETECT_MANAGER对象上,不允许再调用任何方法 |
-| 2003 | 传入的assets下模型文件路径为null | XxxxConfig.getModelFileAssetPath() 返回为null。由setModelFileAssetPath(null)导致 |
-| 2011 | libedge-xxxx.so 加载失败 | System.loadLibrary("edge-xxxx"); libedge-xxxx.so 没有在apk中。CPU架构仅支持armeabi-v7a arm-v8a |
-| 2012 | JNI内存错误 | heap的内存不够 |
-| 2103 | license过期 | license失效或者系统时间有异常 |
-| 2601 | assets 目录下模型文件打开失败 | 请根据报错信息检查模型文件是否存在 |
-| 2611 | 检测图片时,传递至引擎的图片二进制与长宽不符合 | 具体见报错信息 |
-| 27xx | Sdk内部错误 | 请与百度人员联系 |
-| 28xx | 引擎内部错误 | 请与百度人员联系 |
-| 29xx | Sdk内部错误 | 请与百度人员联系 |
-| 3000 | so加载错误 | 请确认所有so文件存在于apk中 |
-| 3001 | 模型加载错误 | 请确认模型放置于能被加载到的合法路径中,并确保config.json配置正确 |
-| 3002 | 模型卸载错误 | 请与百度人员联系 |
-| 3003 | 调用模型错误 | 在模型未加载正确或者so库未加载正确的情况下调用了分类接口 |
-| 50xx | 在线模式调用异常 | 请与百度人员联系 |
diff --git a/docs/06_arm_cpu/arm_linux_cpp_sdk_inference.md b/docs/06_arm_cpu/arm_linux_cpp_sdk_inference.md
deleted file mode 100644
index bcd4128e5..000000000
--- a/docs/06_arm_cpu/arm_linux_cpp_sdk_inference.md
+++ /dev/null
@@ -1,404 +0,0 @@
-# 简介
-
-本文档介绍FastDeploy中的模型SDK,在ARM Linux C++环境下 : (1)推理部署步骤; (2)介绍模型推流全流程API,方便开发者了解项目后二次开发。
-其中ARM Linux Python请参考[ARM Linux Python环境下的推理部署](./ARM-Linux-Python-SDK-Inference.md)文档。
-
-**注意**:部分模型(如Tinypose、OCR等)仅支持图像推理,不支持视频推理。
-
-
-
-* [简介](#简介)
-
-* [环境准备](#环境准备)
-
- * [1. 硬件支持](#1-硬件支持)
- * [2. 软件环境](#2-软件环境)
-
-* [快速开始](#快速开始)
-
- * [1. 项目结构说明](#1-项目结构说明)
- * [2. 测试Demo](#2-测试demo)
- * [2.1 预测图像](#21-预测图像)
- * [2.2 预测视频流](#22-预测视频流)
-
-* [预测API流程详解](#预测api流程详解)
-
- * [1. SDK参数运行配置](#1-sdk参数运行配置)
- * [2. 初始化Predictor](#2-初始化predictor)
- * [3. 预测推理](#3-预测推理)
- * [3.1 预测图像](#31-预测图像)
- * [3.2 预测视频](#32-预测视频)
-
-* [FAQ](#faq)
-
-
-
-# 环境准备
-
-## 1. 硬件支持
-
-目前支持的ARM架构:aarch64 、armv7hf
-
-## 2. 软件环境
-
-1.运行二进制文件-环境要求
-
-* gcc: 5.4 以上 (GLIBCXX_3.4.22)
- * Linux下查看gcc版本命名(可能因系统差异命令会不同):`gcc --version`
- * Linux下C++基础库GLIBCXX的命令(因系统差异,库路径会有不同):`strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX`
-* glibc:2.23以上
- * Linux查看命令:`ldd --version`
-
-2.二次开发编译-环境要求
-
-编译源代码时,除gcc、GLIBCXX、glibc满足`1.运行二进制文件-环境要求`外,cmake需满足:
-
-* cmake: 3.0 以上
-
- * Linux查看命令:`cmake --version`
-
-# 快速开始
-
-## 1. 项目结构说明
-
-根据开发者模型、部署芯片、操作系统需要,在图像界面[飞桨开源模型](https://ai.baidu.com/easyedge/app/openSource)或[GIthub](https://github.com/PaddlePaddle/FastDeploy)中选择对应的SDK进行下载。SDK目录结构如下:
-
-```
-.EasyEdge-Linux-m43157-b97741-x86
-├── RES # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
-│ ├── conf.json # Android、iOS系统APP名字需要
-│ ├── model # 模型结构文件
-│ ├── params # 模型参数文件
-│ ├── label_list.txt # 模型标签文件
-│ ├── infer_cfg.json # 模型前后处理等配置文件
-├── ReadMe.txt
-├── cpp # C++ SDK 文件结构
- └── baidu_easyedge_ocr_linux_cpp_aarch64_ARM_gcc5.4_v1.5.1_20220530.tar.gz #armv8架构硬件的C++包,根据自己硬件,选择对应的压缩包解压即可
- ├── ReadMe.txt
- ├── bin # 可直接运行的二进制文件
- ├── include # 二次开发用的头文件
- ├── lib # 二次开发用的所依赖的库
- ├── src # 二次开发用的示例工程
- └── thirdparty # 第三方依赖
- └── baidu_easyedge_ocr_linux_cpp_armv7l_armv7hf_ARM_gcc5.4_v1.5.1_20220530.tar.gz #armv7架构硬件的C++包,根据自己硬件,选择对应的压缩包解压即可
-└── python # Python SDK 文件
-```
-
-**注意**:
-
-1. 【OCR需要编译】因为OCR任务的特殊性,本次SDK没有提供bin文件夹可执行文件。开发者根据需要,满足文档中gcc和cmake要求后,在`src/demo*`路径编译获取可执行文件,具体可参考。
-2. 【OCR仅支持图像推理,不支持视频流推理】
-3. ARM-Linux-Python的环境要求和使用,请参考[ARM Linux Python环境下的推理部署](./ARM-Linux-Python-SDK.md)文档。
-
-## 2. 测试Demo
-
-> 模型资源文件(即压缩包中的RES文件夹)默认已经打包在开发者下载的SDK包中,请先将tar包整体拷贝到具体运行的设备中,再解压缩使用。
-
-SDK中已经包含预先编译的二进制,可直接运行。以下运行示例均是`cd cpp/bin`路径下执行的结果。
-
-### 2.1 预测图像
-
-```bash
-./easyedge_image_inference {模型RES文件夹路径} {测试图片路径}
-```
-
-运行效果示例:
-
-
-
-```bash
- > ./easyedge_image_inference ../../../../RES 2.jpeg
-2019-02-13 16:46:12,659 INFO [EasyEdge] [easyedge.cpp:34] 140606189016192 Baidu EasyEdge Linux Development Kit 0.2.1(20190213)
-2019-02-13 16:46:14,083 INFO [EasyEdge] [paddlev2_edge_predictor.cpp:60] 140606189016192 Allocate graph success.
-2019-02-13 16:46:14,326 DEBUG [EasyEdge] [paddlev2_edge_predictor.cpp:143] 140606189016192 Inference costs 168 ms
-1, 1:txt_frame, p:0.994905 loc: 0.168161, 0.153654, 0.920856, 0.779621
-Done
-```
-
-### 2.2 预测视频流
-
-```
-./easyedge_video_inference {模型RES文件夹路径} {video_type} {video_src_path}
-```
-
-其中 video_type 支持三种:
-
-```
- video_type : 1 // 本地视频文件
- video_type : 2 // 摄像头的index
- video_type : 3 // 网络视频流
-```
-
-video_src_path: 为 video_type 数值所对应的本地视频路径 、本地摄像头id、网络视频流地址,如:
-
-```
- 本地视频文件: ./easyedge_video_inference {模型RES文件夹路径} 1 ~/my_video_file.mp4
- 本地摄像头: ./easyedge_video_inference {模型RES文件夹路径} 2 1 #/dev/video1
- 网络视频流: ./easyedge_video_inference {模型RES文件夹路径} 3 rtmp://192.168.x.x:8733/live/src
-```
-
-注:以上路径是假模拟路径,开发者需要根据自己实际图像/视频,准备测试图像,并填写正确的测试路径。
-
-# 预测API流程详解
-
-本章节主要结合[2.测试Demo](#4)的Demo示例介绍推理API,方便开发者学习后二次开发。更详细的API请参考`include/easyedge/easyedge*.h`文件。图像、视频的推理包含以下3个API,如下代码片段`step`注释所示。
-
-> ❗注意:
-> (1)`src`文件夹中包含完整可编译的cmake工程实例,建议开发者先行了解[cmake工程基本知识](https://cmake.org/cmake/help/latest/guide/tutorial/index.html)。
-> (2)请优先参考SDK中自带的Demo工程的使用流程和说明。遇到错误,请优先参考文件中的注释、解释、日志说明。
-
-```cpp
- // step 1: SDK配置运行参数
- EdgePredictorConfig config;
- config.model_dir = {模型文件目录};
-
- // step 2: 创建并初始化Predictor;这这里选择合适的引擎
- auto predictor = global_controller()->CreateEdgePredictor(config);
-
- // step 3-1: 预测图像
- auto img = cv::imread({图片路径});
- std::vector results;
- predictor->infer(img, results);
-
- // step 3-2: 预测视频
- std::vector results;
- FrameTensor frame_tensor;
- VideoConfig video_config;
- video_config.source_type = static_cast(video_type); // source_type 定义参考头文件 easyedge_video.h
- video_config.source_value = video_src;
- /*
- ... more video_configs, 根据需要配置video_config的各选项
- */
- auto video_decoding = CreateVideoDecoding(video_config);
- while (video_decoding->next(frame_tensor) == EDGE_OK) {
- results.clear();
- if (frame_tensor.is_needed) {
- predictor->infer(frame_tensor.frame, results);
- render(frame_tensor.frame, results, predictor->model_info().kind);
- }
- //video_decoding->display(frame_tensor); // 显示当前frame,需在video_config中开启配置
- //video_decoding->save(frame_tensor); // 存储当前frame到视频,需在video_config中开启配置
- }
-```
-
-若需自定义library search path或者gcc路径,修改对应Demo工程下的CMakeList.txt即可。
-
-## 1. SDK参数运行配置
-
-SDK的参数通过`EdgePredictorConfig::set_config`和`global_controller()->set_config`配置。本Demo 中设置了模型路径,其他参数保留默认参数。更详细的支持运行参数等,可以参考开发工具包中的头文件(`include/easyedge/easyedge_xxxx_config.h`)的详细说明。
-
-配置参数使用方法如下:
-
-```
-EdgePredictorConfig config;
-config.model_dir = {模型文件目录};
-```
-
-## 2. 初始化Predictor
-
-* 接口
-
- ```cpp
- auto predictor = global_controller()->CreateEdgePredictor(config);
- predictor->init();
- ```
-
-若返回非0,请查看输出日志排查错误原因。
-
-## 3. 预测推理
-
-### 3.1 预测图像
-
-> 在Demo中展示了预测接口infer()传入cv::Mat& image图像内容,并将推理结果赋值给std::vector& result。更多关于infer()的使用,可以根据参考`easyedge.h`头文件中的实际情况、参数说明自行传入需要的内容做推理
-
-* 接口输入
-
-```cpp
- /**
- * @brief
- * 通用接口
- * @param image: must be BGR , HWC format (opencv default)
- * @param result
- * @return
- */
- virtual int infer(cv::Mat& image, std::vector& result) = 0;
-```
-
- 图片的格式务必为opencv默认的BGR, HWC格式。
-
-* 接口返回
-
- `EdgeResultData`中可以获取对应的分类信息、位置信息。
-
-```cpp
-struct EdgeResultData {
- int index; // 分类结果的index
- std::string label; // 分类结果的label
- float prob; // 置信度
-
- // 物体检测 或 图像分割时使用:
- float x1, y1, x2, y2; // (x1, y1): 左上角, (x2, y2): 右下角; 均为0~1的长宽比例值。
-
- // 图像分割时使用:
- cv::Mat mask; // 0, 1 的mask
- std::string mask_rle; // Run Length Encoding,游程编码的mask
-};
-```
-
-*** 关于矩形坐标 ***
-
-x1 * 图片宽度 = 检测框的左上角的横坐标
-
-y1 * 图片高度 = 检测框的左上角的纵坐标
-
-x2 * 图片宽度 = 检测框的右下角的横坐标
-
-y2 * 图片高度 = 检测框的右下角的纵坐标
-
-*** 关于图像分割mask ***
-
-```
-cv::Mat mask为图像掩码的二维数组
-{
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-}
-其中1代表为目标区域,0代表非目标区域
-```
-
-*** 关于图像分割mask_rle ***
-
-该字段返回了mask的游程编码,解析方式可参考 [http demo](https://github.com/Baidu-AIP/EasyDL-Segmentation-Demo)
-
-以上字段可以参考demo文件中使用opencv绘制的逻辑进行解析
-
-### 3.2 预测视频
-
-SDK 提供了支持摄像头读取、视频文件和网络视频流的解析工具类`VideoDecoding`,此类提供了获取视频帧数据的便利函数。通过`VideoConfig`结构体可以控制视频/摄像头的解析策略、抽帧策略、分辨率调整、结果视频存储等功能。对于抽取到的视频帧可以直接作为SDK infer 接口的参数进行预测。
-
-* 接口输入
-
-class`VideoDecoding`:
-
-```
- /**
- * @brief 获取输入源的下一帧
- * @param frame_tensor
- * @return
- */
- virtual int next(FrameTensor &frame_tensor) = 0;
-
- /**
- * @brief 显示当前frame_tensor中的视频帧
- * @param frame_tensor
- * @return
- */
- virtual int display(const FrameTensor &frame_tensor) = 0;
-
- /**
- * @brief 将当前frame_tensor中的视频帧写为本地视频文件
- * @param frame_tensor
- * @return
- */
- virtual int save(FrameTensor &frame_tensor) = 0;
-
- /**
- * @brief 获取视频的fps属性
- * @return
- */
- virtual int get_fps() = 0;
- /**
- * @brief 获取视频的width属性
- * @return
- */
- virtual int get_width() = 0;
-
- /**
- * @brief 获取视频的height属性
- * @return
- */
- virtual int get_height() = 0;
-```
-
-struct `VideoConfig`
-
-```
-/**
- * @brief 视频源、抽帧策略、存储策略的设置选项
- */
-struct VideoConfig {
- SourceType source_type; // 输入源类型
- std::string source_value; // 输入源地址,如视频文件路径、摄像头index、网络流地址
- int skip_frames{0}; // 设置跳帧,每隔skip_frames帧抽取一帧,并把该抽取帧的is_needed置为true
- int retrieve_all{false}; // 是否抽取所有frame以便于作为显示和存储,对于不满足skip_frames策略的frame,把所抽取帧的is_needed置为false
- int input_fps{0}; // 在采取抽帧之前设置视频的fps
- Resolution resolution{Resolution::kAuto}; // 采样分辨率,只对camera有效
-
- bool enable_display{false}; // 默认不支持。
- std::string window_name{"EasyEdge"};
- bool display_all{false}; // 是否显示所有frame,若为false,仅显示根据skip_frames抽取的frame
-
- bool enable_save{false};
- std::string save_path; // frame存储为视频文件的路径
- bool save_all{false}; // 是否存储所有frame,若为false,仅存储根据skip_frames抽取的frame
-
- std::map conf;
-};
-```
-
-| 序号 | 字段 | 含义 |
-| --- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
-| 1 | `source_type` | 输入源类型,支持视频文件、摄像头、网络视频流三种,值分别为1、2、3 |
-| 2 | `source_value` | 若`source_type`为视频文件,该值为指向视频文件的完整路径;若`source_type`为摄像头,该值为摄像头的index,如对于`/dev/video0`的摄像头,则index为0;若`source_type`为网络视频流,则为该视频流的完整地址。 |
-| 3 | `skip_frames` | 设置跳帧,每隔skip_frames帧抽取一帧,并把该抽取帧的is_needed置为true,标记为is_needed的帧是用来做预测的帧。反之,直接跳过该帧,不经过预测。 |
-| 4 | `retrieve_all` | 若置该项为true,则无论是否设置跳帧,所有的帧都会被抽取返回,以作为显示或存储用。 |
-| 5 | `input_fps` | 用于抽帧前设置fps |
-| 6 | `resolution` | 设置摄像头采样的分辨率,其值请参考`easyedge_video.h`中的定义,注意该分辨率调整仅对输入源为摄像头时有效 |
-| 7 | `conf` | 高级选项。部分配置会通过该map来设置 |
-
-*** 注意:***
-
-1. `VideoConfig`不支持`display`功能。如果需要使用`VideoConfig`的`display`功能,需要自行编译带有GTK选项的OpenCV。
-
-2. 使用摄像头抽帧时,如果通过`resolution`设置了分辨率调整,但是不起作用,请添加如下选项:
-
- ```
- video_config.conf["backend"] = "2";
- ```
-
-3. 部分设备上的CSI摄像头尚未兼容,如遇到问题,可以通过工单、QQ交流群或微信交流群反馈。
-
-具体接口调用流程,可以参考SDK中的`demo_video_inference`。
-
-# FAQ
-
-1. 如何处理一些 undefined reference / error while loading shared libraries?
-
- > 如:./easyedge_demo: error while loading shared libraries: libeasyedge.so.1: cannot open shared object file: No such file or directory
-
- 遇到该问题时,请找到具体的库的位置,设置LD_LIBRARY_PATH;或者安装缺少的库。
-
- > 示例一:libverify.so.1: cannot open shared object file: No such file or directory
- > 链接找不到libveirfy.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../lib 解决(实际冒号后面添加的路径以libverify.so文件所在的路径为准)
-
- > 示例二:libopencv_videoio.so.4.5: cannot open shared object file: No such file or directory
- > 链接找不到libopencv_videoio.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../thirdparty/opencv/lib 解决(实际冒号后面添加的路径以libopencv_videoio.so所在路径为准)
-
- > 示例三:GLIBCXX_X.X.X not found
- > 链接无法找到glibc版本,请确保系统gcc版本>=SDK的gcc版本。升级gcc/glibc可以百度搜索相关文献。
-
-2. 运行二进制时,提示 libverify.so cannot open shared object file
-
- 可能cmake没有正确设置rpath, 可以设置LD_LIBRARY_PATH为sdk的lib文件夹后,再运行:
-
- ```bash
- LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./easyedge_demo
- ```
-
-3. 编译时报错:file format not recognized
-
- 可能是因为在复制SDK时文件信息丢失。请将整个压缩包复制到目标设备中,再解压缩、编译。
diff --git a/docs/06_arm_cpu/arm_linux_cpp_sdk_serving.md b/docs/06_arm_cpu/arm_linux_cpp_sdk_serving.md
deleted file mode 100644
index 9c6a215cf..000000000
--- a/docs/06_arm_cpu/arm_linux_cpp_sdk_serving.md
+++ /dev/null
@@ -1,318 +0,0 @@
-# 简介
-
-本文档介绍FastDeploy中的模型SDK,在ARM Linux C++环境下:(1)服务化推理部署步骤;(2)介绍模型推流全流程API,方便开发者了解项目后二次开发。
-其中ARM Linux Python请参考[ARM Linux Python环境下的HTTP推理部署](./ARM-Linux-Python-SDK-Serving.md)文档。
-
-**注意**:部分模型(如OCR等)不支持服务化推理。
-
-
-
-* [简介](#简介)
-
-* [安装准备](#安装准备)
-
- * [1. 硬件支持](#1-硬件支持)
- * [2. 软件环境](#2-软件环境)
-
-* [快速开始](#快速开始)
-
- * [1. 项目结构说明](#1-项目结构说明)
- * [2. 测试 HTTP Demo](#2-测试-http-demo)
- * [2.1 启动HTTP预测服务](#21-启动http预测服务)
-
-* [HTTP API流程详解](#http-api流程详解)
-
- * [1. 开启http服务](#1-开启http服务)
- * [2. 请求http服务](#2-请求http服务)
- * [2.1 http 请求方式一:不使用图片base64格式](#21-http-请求方式一不使用图片base64格式)
- * [2.2 http 请求方法二:使用图片base64格式](#22-http-请求方法二使用图片base64格式)
- * [3. http返回数据](#3-http返回数据)
-
-* [FAQ](#faq)
-
-
-
-# 安装准备
-
-## 1. 硬件支持
-
-目前支持的ARM架构:aarch64 、armv7hf
-
-## 2. 软件环境
-
-1.运行二进制文件-环境要求
-
-* gcc: 5.4 以上 (GLIBCXX_3.4.22)
- * Linux下查看gcc版本命名(可能因系统差异命令会不同):`gcc --version`;
- * Linux下C++基础库GLIBCXX的命令(可能因系统差异路径会有不同,可检测自己环境下的情况):`strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX`
-* glibc:2.23以上
- * Linux查看命令:`ldd --version`
-
-2.二次开发编译-环境要求
-
-编译源代码时,除了gcc、GLIBCXX、glibc满足`1.运行二进制文件-环境要求`外,还需要cmake满足要求。
-
-* cmake: 3.0 以上
-
- * Linux查看命令:`cmake --version`
-
-# 快速开始
-
-## 1. 项目结构说明
-
-根据开发者模型、部署芯片、操作系统需要,在图像界面[飞桨开源模型](https://ai.baidu.com/easyedge/app/openSource)或[GIthub](https://github.com/PaddlePaddle/FastDeploy)中选择对应的SDK进行下载。解压后SDK目录结构如下:
-
-```
-.EasyEdge-Linux-m43157-b97741-x86
-├── RES # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
-│ ├── conf.json # Android、iOS系统APP名字需要
-│ ├── model # 模型结构文件
-│ ├── params # 模型参数文件
-│ ├── label_list.txt # 模型标签文件
-│ ├── infer_cfg.json # 模型前后处理等配置文件
-├── ReadMe.txt
-├── cpp # C++ SDK 文件结构
- └── baidu_easyedge_linux_cpp_x86_64_CPU.Generic_gcc5.4_v1.4.0_20220325.tar.gz
- ├── bin # 可直接运行的二进制文件
- ├── include # 二次开发用的头文件
- ├── lib # 二次开发用的所依赖的库
- ├── src # 二次开发用的示例工程
- └── thirdparty # 第三方依赖
-└── python # Python SDK 文件
-```
-
-## 2. 测试 HTTP Demo
-
-> 模型资源文件(即压缩包中的RES文件夹)默认已经打包在开发者下载的SDK包中,请先将tar包整体拷贝到具体运行的设备中,再解压缩使用。
-
-SDK中已经包含预先编译的二进制,可直接运行。以下运行示例均是`cd cpp/bin`路径下执行的结果。
-
-### 2.1 启动HTTP预测服务
-
-```
-./easyedge_serving {模型RES文件夹路径}
-```
-
-启动后,日志中会显示如下设备IP和24401端口号信息:
-
-```
-HTTP is now serving at 0.0.0.0:24401
-```
-
-此时,开发者可以打开浏览器,输入链接地址`http://0.0.0.0:24401`(这里的`设备IP和24401端口号`根据开发者电脑显示修改),选择图片来进行测试。
-
-
-
-同时,可以调用HTTP接口来访问服务,具体参考下文的[二次开发](#10)接口说明。
-
-# HTTP API流程详解
-
-本章节主要结合[2.1 HTTP Demo]()的API介绍,方便开发者学习并将运行库嵌入到开发者的程序当中,更详细的API请参考`include/easyedge/easyedge*.h`文件。http服务包含服务端和客户端,目前支持的能力包括以下几种方式,Demo中提供了不使用图片base格式的`方式一:浏览器请求的方式`,其他几种方式开发者根据个人需要,选择开发。
-
-## 1. 开启http服务
-
-http服务的启动可直接使用`bin/easyedge_serving`,或参考`src/demo_serving.cpp`文件修改相关逻辑
-
-```cpp
- /**
- * @brief 开启一个简单的demo http服务。
- * 该方法会block直到收到sigint/sigterm。
- * http服务里,图片的解码运行在cpu之上,可能会降低推理速度。
- * @tparam ConfigT
- * @param config
- * @param host
- * @param port
- * @param service_id service_id user parameter, uri '/get/service_id' will respond this value with 'text/plain'
- * @param instance_num 实例数量,根据内存/显存/时延要求调整
- * @return
- */
- template
- int start_http_server(
- const ConfigT &config,
- const std::string &host,
- int port,
- const std::string &service_id,
- int instance_num = 1);
-```
-
-## 2. 请求http服务
-
-> 开发者可以打开浏览器,`http://{设备ip}:24401`,选择图片来进行测试。
-
-### 2.1 http 请求方式一:不使用图片base64格式
-
-URL中的get参数:
-
-| 参数 | 说明 | 默认值 |
-| --------- | --------- | ---------------- |
-| threshold | 阈值过滤, 0~1 | 如不提供,则会使用模型的推荐阈值 |
-
-HTTP POST Body即为图片的二进制内容(无需base64, 无需json)
-
-Python请求示例
-
-```Python
-import requests
-
-with open('./1.jpg', 'rb') as f:
- img = f.read()
- result = requests.post(
- 'http://127.0.0.1:24401/',
- params={'threshold': 0.1},
- data=img).json()
-```
-
-### 2.2 http 请求方法二:使用图片base64格式
-
-HTTP方法:POST
-Header如下:
-
-| 参数 | 值 |
-| ------------ | ---------------- |
-| Content-Type | application/json |
-
-**Body请求填写**:
-
-* 分类网络:
- body 中请求示例
-
- ```
- {
- "image": ""
- "top_num": 5
- }
- ```
-
- body中参数详情
-
-| 参数 | 是否必选 | 类型 | 可选值范围 | 说明 |
-| ------- | ---- | ------ | ----- | ----------------------------------------------------------------------------------- |
-| image | 是 | string | - | 图像数据,base64编码,要求base64图片编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式 **注意去掉头部** |
-| top_num | 否 | number | - | 返回分类数量,不填该参数,则默认返回全部分类结果 |
-
-* 检测和分割网络:
- Body请求示例:
-
- ```
- {
- "image": ""
- }
- ```
-
- body中参数详情:
-
-| 参数 | 是否必选 | 类型 | 可选值范围 | 说明 |
-| --------- | ---- | ------ | ----- | ----------------------------------------------------------------------------------- |
-| image | 是 | string | - | 图像数据,base64编码,要求base64图片编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式 **注意去掉头部** |
-| threshold | 否 | number | - | 默认为推荐阈值,也可自行根据需要进行设置 |
-
-Python请求示例:
-
-```Python
-import base64
-import requests
-def main():
- with open("图像路径", 'rb') as f:
- result = requests.post("http://{服务ip地址}:24401/", json={
- "image": base64.b64encode(f.read()).decode("utf8")
- })
- # print(result.request.body)
- # print(result.request.headers)
- print(result.content)
-
-if __name__ == '__main__':
- main()
-```
-
-## 3. http返回数据
-
-| 字段 | 类型说明 | 其他 |
-| ---------- | ------ | ------------------------------------ |
-| error_code | Number | 0为成功,非0参考message获得具体错误信息 |
-| results | Array | 内容为具体的识别结果。其中字段的具体含义请参考`预测图像-返回格式`一节 |
-| cost_ms | Number | 预测耗时ms,不含网络交互时间 |
-
-返回示例
-
-```json
-{
- "cost_ms": 52,
- "error_code": 0,
- "results": [
- {
- "confidence": 0.94482421875,
- "index": 1,
- "label": "IronMan",
- "x1": 0.059185408055782318,
- "x2": 0.18795496225357056,
- "y1": 0.14762254059314728,
- "y2": 0.52510076761245728,
- "mask": "...", // 图像分割模型字段
- "trackId": 0, // 目标追踪模型字段
- },
-
- ]
-}
-```
-
-*** 关于矩形坐标 ***
-
-x1 * 图片宽度 = 检测框的左上角的横坐标
-
-y1 * 图片高度 = 检测框的左上角的纵坐标
-
-x2 * 图片宽度 = 检测框的右下角的横坐标
-
-y2 * 图片高度 = 检测框的右下角的纵坐标
-
-*** 关于图像分割mask ***
-
-```
-cv::Mat mask为图像掩码的二维数组
-{
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-}
-其中1代表为目标区域,0代表非目标区域
-```
-
-# FAQ
-
-1. 如何处理一些 undefined reference / error while loading shared libraries?
-
- > 如:./easyedge_demo: error while loading shared libraries: libeasyedge.so.1: cannot open shared object file: No such file or directory
-
- 遇到该问题时,请找到具体的库的位置,设置LD_LIBRARY_PATH;或者安装缺少的库。
-
- > 示例一:libverify.so.1: cannot open shared object file: No such file or directory
- > 链接找不到libveirfy.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../lib 解决(实际冒号后面添加的路径以libverify.so文件所在的路径为准)
-
- > 示例二:libopencv_videoio.so.4.5: cannot open shared object file: No such file or directory
- > 链接找不到libopencv_videoio.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../thirdparty/opencv/lib 解决(实际冒号后面添加的路径以libopencv_videoio.so所在路径为准)
-
- > 示例三:GLIBCXX_X.X.X not found
- > 链接无法找到glibc版本,请确保系统gcc版本>=SDK的gcc版本。升级gcc/glibc可以百度搜索相关文献。
-
-2. 使用libcurl请求http服务时,速度明显变慢
-
- 这是因为libcurl请求continue导致server等待数据的问题,添加空的header即可
-
- ```bash
- headers = curl_slist_append(headers, "Expect:");
- ```
-
-3. 运行二进制时,提示 libverify.so cannot open shared object file
-
- 可能cmake没有正确设置rpath, 可以设置LD_LIBRARY_PATH为sdk的lib文件夹后,再运行:
-
- ```bash
- LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./easyedge_demo
- ```
-
-4. 编译时报错:file format not recognized
-
- 可能是因为在复制SDK时文件信息丢失。请将整个压缩包复制到目标设备中,再解压缩、编译。
diff --git a/docs/06_arm_cpu/arm_linux_python_sdk_inference.md b/docs/06_arm_cpu/arm_linux_python_sdk_inference.md
deleted file mode 100644
index 260be108d..000000000
--- a/docs/06_arm_cpu/arm_linux_python_sdk_inference.md
+++ /dev/null
@@ -1,371 +0,0 @@
-# 简介
-
-本文档以[千分类模型_MobileNetV3](https://ai.baidu.com/easyedge/app/openSource)为例,介绍FastDeploy中的模型SDK, 在**ARM Linux Python** 环境下:(1)图像推理部署步骤; (2)介绍模型推流全流程API,方便开发者了解项目后二次开发。其中ARM Linux C++请参考[ARM Linux C++环境下的推理部署](./ARM-Linux-CPP-SDK-Inference.md)文档。
-
-**注意**:部分模型(如Tinypose、OCR等)仅支持图像推理,不支持视频推理。
-
-
-
-* [简介](#简介)
-
-* [环境准备](#环境准备)
-
- * [1.SDK下载](#1sdk下载)
- * [2.硬件支持](#2硬件支持)
- * [3.python环境](#3python环境)
- * [4.安装依赖](#4安装依赖)
- * [4.1.安装paddlepaddle](#41安装paddlepaddle)
- * [4.2.安装EasyEdge Python Wheel 包](#42安装easyedge-python-wheel-包)
-
-* [快速开始](#快速开始)
-
- * [1.文件结构说明](#1文件结构说明)
- * [2.测试Demo](#2测试demo)
- * [2.1预测图像](#21预测图像)
-
-* [Demo API介绍](#demo-api介绍)
-
- * [1.基础流程](#1基础流程)
- * [2.初始化](#2初始化)
- * [3.SDK参数配置](#3sdk参数配置)
- * [4.预测图像](#4预测图像)
-
-* [FAQ](#faq)
-
-
-
-# 环境准备
-
-## 1.SDK下载
-
-根据开发者模型、部署芯片、操作系统需要,在图像界面[飞桨开源模型](https://ai.baidu.com/easyedge/app/openSource)或[GIthub](https://github.com/PaddlePaddle/FastDeploy)中选择对应的SDK进行下载。
-
-```shell
-EasyEdge-Linux-x86--[部署芯片]
-├──...
-├──python # Linux Python SDK
- ├── # 特定Python版本的EasyEdge Wheel包, 二次开发可使用
- ├── BaiduAI_EasyEdge_SDK-1.3.1-cp36-cp36m-linux_aarch64.whl
- ├── infer_demo # demo体验完整文件
- │ ├── demo_xxx.py # 包含前后处理的端到端推理demo文件
- │ └── demo_serving.py # 提供http服务的demo文件
- ├── tensor_demo # 学习自定义算法前后处理时使用
- │ └── demo_xxx.py
-```
-
-## 2.硬件支持
-
-目前支持的ARM架构:aarch64 、armv7hf
-
-## 3.python环境
-
-> ARM Linux SDK仅支持Python 3.6
-
-使用如下命令获取已安装的Python版本号。如果本机的版本不匹配,建议使用[pyenv](https://github.com/pyenv/pyenv)、[anaconda](https://www.anaconda.com/)等Python版本管理工具对SDK所在目录进行配置。
-
-```shell
-$python3 --version
-```
-
-接着使用如下命令确认pip的版本是否满足要求,要求pip版本为20.2.2或更高版本。详细的pip安装过程可以参考[官网教程](https://pip.pypa.io/en/stable/installation/)。
-
-```shell
-$python3 -m pip --version
-```
-
-## 4.安装依赖
-
-### 4.1.安装paddlepaddle
-
-根据具体的部署芯片(CPU/GPU)安装对应的PaddlePaddle的whl包。
-
-`armv8 CPU平台`可以使用如下命令进行安装:
-
-```shell
-python3 -m pip install http://aipe-easyedge-public.bj.bcebos.com/easydeploy/paddlelite-2.11-cp36-cp36m-linux_aarch64.whl
-```
-
-### 4.2.安装EasyEdge Python Wheel 包
-
-在`python`目录下,安装特定Python版本的EasyEdge Wheel包。`armv8 CPU平台`可以使用如下命令进行安装:
-
-```shell
-python3 -m pip install -U BaiduAI_EasyEdge_SDK-1.3.1-cp36-cp36m-linux_aarch64.whl
-```
-
-# 快速开始
-
-## 1.文件结构说明
-
-Python SDK文件结构如下:
-
-```shell
-.EasyEdge-Linux-x86--[部署芯片]
-├── RES # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
-│ ├── conf.json # Android、iOS系统APP名字需要
-│ ├── label_list.txt # 模型标签文件
-│ ├── model # 模型结构文件
-│ ├── params # 模型参数文件
-│ └── infer_cfg.json # 模型前后处理等配置文件
-├── ReadMe.txt
-├── cpp # C++ SDK 文件结构
-└── python # Python SDK 文件
- ├── BaiduAI_EasyEdge_SDK-1.3.1-cp36-cp36m-linux_aarch64.whl #EasyEdge Python Wheel 包
- ├── infer_demo
- ├── demo_armv8_cpu.py # 图像推理
- ├── demo_serving.py # HTTP服务化推理
- └── tensor_demo # 学习自定义算法前后处理时使用
- ├── demo_armv8_cpu.py
-```
-
-## 2.测试Demo
-
-> 模型资源文件默认已经打包在开发者下载的SDK包中, 默认为`RES`目录。
-
-### 2.1预测图像
-
-使用infer_demo文件夹下的demo文件。
-
-```bash
-python3 demo_x86_cpu.py {模型RES文件夹} {测试图片路径}
-```
-
-运行效果示例:
-
-
-
-```shell
-2022-06-14 14:40:16 INFO [EasyEdge] [demo_nvidia_gpu.py:38] 140518522509120: Init paddlefluid engine...
-2022-06-14 14:40:20 INFO [EasyEdge] [demo_nvidia_gpu.py:38] 140518522509120: Paddle version: 2.2.2
-{'confidence': 0.9012349843978882, 'index': 8, 'label': 'n01514859 hen'}
-```
-
-可以看到,运行结果为`index:8,label:hen`,通过imagenet [类别映射表](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a),可以找到对应的类别,即 'hen',由此说明我们的预测结果正确。
-
-# Demo API介绍
-
-本章节主要结合[测试Demo](#2测试Demo)的Demo示例介绍推理API,方便开发者学习后二次开发。
-
-## 1.基础流程
-
-> ❗注意,请优先参考SDK中自带demo的使用流程和说明。遇到错误,请优先参考文件中的注释、解释、日志说明。
-
-`infer_demo/demo_xx_xx.py`
-
-```python
-# 引入EasyEdge运行库
-import BaiduAI.EasyEdge as edge
-
-# 创建并初始化一个预测Progam;选择合适的引擎
-pred = edge.Program()
-pred.init(model_dir={RES文件夹路径}, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID) # x86_64 CPU
-# pred.init(model_dir=_model_dir, device=edge.Device.GPU, engine=edge.Engine.PADDLE_FLUID) # x86_64 Nvidia GPU
-# pred.init(model_dir=_model_dir, device=edge.Device.CPU, engine=edge.Engine.PADDLE_LITE) # armv8 CPU
-
-# 预测图像
-res = pred.infer_image({numpy.ndarray的图片})
-
-# 关闭结束预测Progam
-pred.close()
-```
-
-`infer_demo/demo_serving.py`
-
-```python
-import BaiduAI.EasyEdge as edge
-from BaiduAI.EasyEdge.serving import Serving
-
-# 创建并初始化Http服务
-server = Serving(model_dir={RES文件夹路径}, license=serial_key)
-
-# 运行Http服务
-# 请参考同级目录下demo_xx_xx.py里:
-# pred.init(model_dir=xx, device=xx, engine=xx, device_id=xx)
-# 对以下参数device\device_id和engine进行修改
-server.run(host=host, port=port, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID) # x86_64 CPU
-# server.run(host=host, port=port, device=edge.Device.GPU, engine=edge.Engine.PADDLE_FLUID) # x86_64 Nvidia GPU
-# server.run(host=host, port=port, device=edge.Device.CPU, engine=edge.Engine.PADDLE_LITE) # armv8 CPU
-```
-
-## 2.初始化
-
-* 接口
-
- ```python
- def init(self,
- model_dir,
- device=Device.CPU,
- engine=Engine.PADDLE_FLUID,
- config_file='conf.json',
- preprocess_file='preprocess_args.json',
- model_file='model',
- params_file='params',
- label_file='label_list.txt',
- infer_cfg_file='infer_cfg.json',
- device_id=0,
- thread_num=1
- ):
- """
- Args:
- model_dir: str
- device: BaiduAI.EasyEdge.Device,比如:Device.CPU
- engine: BaiduAI.EasyEdge.Engine, 比如: Engine.PADDLE_FLUID
- config_file: str
- preprocess_file: str
- model_file: str
- params_file: str
- label_file: str 标签文件
- infer_cfg_file: 包含预处理、后处理信息的文件
- device_id: int 设备ID
- thread_num: int CPU的线程数
-
- Raises:
- RuntimeError, IOError
- Returns:
- bool: True if success
- """
- ```
-
-若返回不是True,请查看输出日志排查错误原因。
-
-## 3.SDK参数配置
-
-使用 CPU 预测时,可以通过在 init 中设置 thread_num 使用多线程预测。如:
-
-```python
-pred.init(model_dir=_model_dir, device=edge.Device.CPU, engine=edge.Engine.PADDLE_FLUID, thread_num=4)
-```
-
-使用 GPU 预测时,可以通过在 init 中设置 device_id 指定需要的GPU device id。如:
-
-```python
-pred.init(model_dir=_model_dir, device=edge.Device.GPU, engine=edge.Engine.PADDLE_FLUID, device_id=0)
-```
-
-## 4.预测图像
-
-* 接口
-
- ```python
- def infer_image(self, img,
- threshold=0.3,
- channel_order='HWC',
- color_format='BGR',
- data_type='numpy'):
- """
-
- Args:
- img: np.ndarray or bytes
- threshold: float
- only return result with confidence larger than threshold
- channel_order: string
- channel order HWC or CHW
- color_format: string
- color format order RGB or BGR
- data_type: string
- 仅在图像分割时有意义。 'numpy' or 'string'
- 'numpy': 返回已解析的mask
- 'string': 返回未解析的mask游程编码
-
- Returns:
- list
-
- """
- ```
-
-* 返回格式: `[dict1, dict2, ...]`
-
-| 字段 | 类型 | 取值 | 说明 |
-| ---------- | -------------------- | --------- | ------------------------ |
-| confidence | float | 0~1 | 分类或检测的置信度 |
-| label | string | | 分类或检测的类别 |
-| index | number | | 分类或检测的类别 |
-| x1, y1 | float | 0~1 | 物体检测,矩形的左上角坐标 (相对长宽的比例值) |
-| x2, y2 | float | 0~1 | 物体检测,矩形的右下角坐标(相对长宽的比例值) |
-| mask | string/numpy.ndarray | 图像分割的mask | |
-
-***关于矩形坐标***
-
-x1 * 图片宽度 = 检测框的左上角的横坐标
-
-y1 * 图片高度 = 检测框的左上角的纵坐标
-
-x2 * 图片宽度 = 检测框的右下角的横坐标
-
-y2 * 图片高度 = 检测框的右下角的纵坐标
-
-可以参考 demo 文件中使用 opencv 绘制矩形的逻辑。
-
-***结果示例***
-
- i) 图像分类
-
-```json
-{
- "index": 736,
- "label": "table",
- "confidence": 0.9
-}
-```
-
- ii) 物体检测
-
-```json
-{
- "index": 8,
- "label": "cat",
- "confidence": 1.0,
- "x1": 0.21289,
- "y1": 0.12671,
- "x2": 0.91504,
- "y2": 0.91211,
-}
-```
-
- iii) 图像分割
-
-```json
-{
- "name": "cat",
- "score": 1.0,
- "location": {
- "left": ...,
- "top": ...,
- "width": ...,
- "height": ...,
- },
- "mask": ...
-}
-```
-
-mask字段中,data_type为`numpy`时,返回图像掩码的二维数组
-
-```
-{
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-}
-其中1代表为目标区域,0代表非目标区域
-```
-
-data_type为`string`时,mask的游程编码,解析方式可参考 [demo](https://github.com/Baidu-AIP/EasyDL-Segmentation-Demo)
-
-# FAQ
-
-1.执行infer_demo文件时,提示your generated code is out of date and must be regenerated with protoc >= 3.19.0
-
- 进入当前项目,首先卸载protobuf
-
- ```shell
- python3 -m pip uninstall protobuf
- ```
-
- 安装低版本protobuf
-
- ```shell
- python3 -m pip install protobuf==3.19.0
- ```
diff --git a/docs/06_arm_cpu/arm_linux_python_sdk_serving.md b/docs/06_arm_cpu/arm_linux_python_sdk_serving.md
deleted file mode 100644
index aa37e7e40..000000000
--- a/docs/06_arm_cpu/arm_linux_python_sdk_serving.md
+++ /dev/null
@@ -1,266 +0,0 @@
-# 简介
-
-本文档以[千分类模型_MobileNetV3](https://ai.baidu.com/easyedge/app/openSource)为例,介绍FastDeploy中的模型SDK, 在**ARM Linux Python** 环境下: (1)**服务化**推理部署步骤; (2)介绍模型推流全流程API,方便开发者了解项目后二次开发。其中ARM Linux Python请参考[ARM Linux C++环境下的HTTP推理部署](./ARM-Linux-CPP-SDK-Serving.md)文档。
-
-**注意**:部分模型(如OCR等)不支持服务化推理。
-
-
-
-* [简介](#简介)
-
-* [环境准备](#环境准备)
-
- * [1.SDK下载](#1sdk下载)
- * [2.硬件支持](#2硬件支持)
- * [3.Python环境](#3python环境)
- * [4.安装依赖](#4安装依赖)
- * [4.1.安装paddlepaddle](#41安装paddlepaddle)
- * [4.2.安装EasyEdge Python Wheel 包](#42安装easyedge-python-wheel-包)
-
-* [快速开始](#快速开始)
-
- * [1.文件结构说明](#1文件结构说明)
- * [2.测试Serving服务](#2测试serving服务)
- * [2.1 启动HTTP预测服务](#21-启动http预测服务)
-
-* [HTTP API流程详解](#http-api流程详解)
-
- * [1. 开启http服务](#1-开启http服务)
- * [2. 请求http服务](#2-请求http服务)
- * [2.1 http 请求方式:不使用图片base64格式](#21-http-请求方式不使用图片base64格式)
- * [3. http返回数据](#3-http返回数据)
-
-* [FAQ](#faq)
-
-
-
-# 环境准备
-
-## 1.SDK下载
-
-根据开发者模型、部署芯片、操作系统需要,在图像界面[飞桨开源模型](https://ai.baidu.com/easyedge/app/openSource)或[GIthub](https://github.com/PaddlePaddle/FastDeploy)中选择对应的SDK进行下载。解压缩后的文件结构如下。
-
-```shell
-EasyEdge-Linux-x86-[部署芯片]
-├── RES # 模型文件资源文件夹,可替换为其他模型
-├── README.md
-├── cpp # C++ SDK
-└── python # Python SDK
-```
-
-## 2.硬件支持
-
-目前支持的ARM架构:aarch64 、armv7hf
-
-## 3.Python环境
-
-> ARM Linux SDK仅支持Python 3.6
-
-使用如下命令获取已安装的Python版本号。如果本机的版本不匹配,需要根据ARM Linux下Python安装方式进行安装。(不建议在ARM Linux下使用conda,因为ARM Linux场景通常资源很有限)
-
-```shell
-$python3 --version
-```
-
-接着使用如下命令确认pip的版本是否满足要求,要求pip版本为20.2.2或更高版本。详细的pip安装过程可以参考[官网教程](https://pip.pypa.io/en/stable/installation/)。
-
-```shell
-$python3 -m pip --version
-```
-
-## 4.安装依赖
-
-### 4.1.安装paddlepaddle
-
-根据具体的部署芯片(CPU/GPU)安装对应的PaddlePaddle的whl包。
-
-`armv8 CPU平台`可以使用如下命令进行安装:
-
-```shell
-python3 -m pip install http://aipe-easyedge-public.bj.bcebos.com/easydeploy/paddlelite-2.11-cp36-cp36m-linux_aarch64.whl
-```
-
-### 4.2.安装EasyEdge Python Wheel 包
-
-在`python`目录下,安装特定Python版本的EasyEdge Wheel包。`armv8 CPU平台`可以使用如下命令进行安装:
-
-```shell
-python3 -m pip install -U BaiduAI_EasyEdge_SDK-1.3.1-cp36-cp36m-linux_aarch64.whl
-```
-
-# 二.快速开始
-
-## 1.文件结构说明
-
-Python SDK文件结构如下:
-
-```shell
-EasyEdge-Linux-x86--[部署芯片]
-├──...
-├──python # Linux Python SDK
- ├── # 特定Python版本的EasyEdge Wheel包, 二次开发可使用
- ├── BBaiduAI_EasyEdge_SDK-1.3.1-cp36-cp36m-linux_aarch64.whl
- ├── infer_demo # demo体验完整文件
- │ ├── demo_xxx.py # 包含前后处理的端到端推理demo文件
- │ └── demo_serving.py # 提供http服务的demo文件
- ├── tensor_demo # 学习自定义算法前后处理时使用
- │ └── demo_xxx.py
-```
-
-## 2.测试Serving服务
-
-> 模型资源文件默认已经打包在开发者下载的SDK包中, 默认为`RES`目录。
-
-### 2.1 启动HTTP预测服务
-
-指定对应的模型文件夹(默认为`RES`)、设备ip和指定端口号,运行如下命令。
-
-```shell
-python3 demo_serving.py {模型RES文件夹} {host, default 0.0.0.0} {port, default 24401}
-```
-
-成功启动后,终端中会显示如下字样。
-
-```shell
-...
-* Running on {host ip}:24401
-```
-
-如果是在局域网内的机器上部署,开发者此时可以打开浏览器,输入`http://{host ip}:24401`,选择图片来进行测试,运行效果如下。
-
-
-
-如果是在远程机器上部署,那么可以参考`demo_serving.py`中的 `http_client_test()函数`请求http服务来执行推理。
-
-# 三. HTTP API流程详解
-
-## 1. 开启http服务
-
-http服务的启动使用`demo_serving.py`文件
-
-```python
-class Serving(object):
- """
- SDK local serving
- """
-
- def __init__(self, model_dir, license='', model_filename='model', params_filename='params'):
-
- self.program = None
- self.model_dir = model_dir
- self.model_filename = model_filename
- self.params_filename = params_filename
- self.program_lock = threading.Lock()
- self.license_key = license
- # 只有ObjectTracking会初始化video_processor
- self.video_processor = None
-
- def run(self, host, port, device, engine=Engine.PADDLE_FLUID, service_id=0, device_id=0, **kwargs):
- """
- Args:
- host : str
- port : str
- device : BaiduAI.EasyEdge.Device,比如:Device.CPU
- engine : BaiduAI.EasyEdge.Engine, 比如: Engine.PADDLE_FLUID
- """
- self.run_serving_with_flask(host, port, device, engine, service_id, device_id, **kwargs)
-```
-
-## 2. 请求http服务
-
-> 开发者可以打开浏览器,`http://{设备ip}:24401`,选择图片来进行测试。
-
-### 2.1 http 请求方式:不使用图片base64格式
-
-URL中的get参数:
-
-| 参数 | 说明 | 默认值 |
-| --------- | --------- | ---------------- |
-| threshold | 阈值过滤, 0~1 | 如不提供,则会使用模型的推荐阈值 |
-
-HTTP POST Body即为图片的二进制内容
-
-Python请求示例
-
-```python
-import requests
-
-with open('./1.jpg', 'rb') as f:
- img = f.read()
- result = requests.post(
- 'http://127.0.0.1:24401/',
- params={'threshold': 0.1},
- data=img).json()
-```
-
-## 3. http返回数据
-
-| 字段 | 类型说明 | 其他 |
-| ---------- | ------ | ------------------------------------ |
-| error_code | Number | 0为成功,非0参考message获得具体错误信息 |
-| results | Array | 内容为具体的识别结果。其中字段的具体含义请参考`预测图像-返回格式`一节 |
-| cost_ms | Number | 预测耗时ms,不含网络交互时间 |
-
-返回示例
-
-```json
-{
- "cost_ms": 52,
- "error_code": 0,
- "results": [
- {
- "confidence": 0.94482421875,
- "index": 1,
- "label": "IronMan",
- "x1": 0.059185408055782318,
- "x2": 0.18795496225357056,
- "y1": 0.14762254059314728,
- "y2": 0.52510076761245728,
- "mask": "...", // 图像分割模型字段
- "trackId": 0, // 目标追踪模型字段
- },
-
- ]
-}
-```
-
-***关于矩形坐标***
-
-x1 * 图片宽度 = 检测框的左上角的横坐标
-
-y1 * 图片高度 = 检测框的左上角的纵坐标
-
-x2 * 图片宽度 = 检测框的右下角的横坐标
-
-y2 * 图片高度 = 检测框的右下角的纵坐标
-
-*** 关于图像分割mask ***
-
-```
-cv::Mat mask为图像掩码的二维数组
-{
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-}
-其中1代表为目标区域,0代表非目标区域
-```
-
-# FAQ
-
-1.执行infer_demo文件时,提示your generated code is out of date and must be regenerated with protoc >= 3.19.0
-
- 进入当前项目,首先卸载protobuf
-
- ```shell
- python3 -m pip uninstall protobuf
- ```
-
- 安装低版本protobuf
-
- ```shell
- python3 -m pip install protobuf==3.19.0
- ```
diff --git a/docs/06_arm_cpu/ios_sdk.md b/docs/06_arm_cpu/ios_sdk.md
deleted file mode 100644
index 5a1fa0ffc..000000000
--- a/docs/06_arm_cpu/ios_sdk.md
+++ /dev/null
@@ -1,212 +0,0 @@
-# 简介
-
-本文档介绍FastDeploy中的模型SDK,在iOS环境下:(1)推理部署步骤;(2)介绍SDK使用说明,方便开发者了解项目后二次开发。
-
-
-
-* [简介](#简介)
-
-* [系统支持说明](#系统支持说明)
-
- * [1. 系统支持说明](#1-系统支持说明)
- * [2. SDK大小说明](#2-sdk大小说明)
-
-* [快速开始](#快速开始)
-
- * [1. 项目结构说明](#1-项目结构说明)
- * [2. 测试Demo](#2-测试demo)
-
-* [SDK使用说明](#sdk使用说明)
-
- * [1. 集成指南](#1-集成指南)
- * [1.1 依赖库集成](#11-依赖库集成)
- * [2. 调用流程示例](#2-调用流程示例)
- * [2.1 初始化](#21-初始化)
- * [2.2 预测图像](#22-预测图像)
-
-* [FAQ](#faq)
-
-
-
-# 系统支持说明
-
-## 1. 系统支持说明
-
-1. 系统支持:iOS 9.0及以上。
-
-2. 硬件支持:支持 arm64 (Starndard architectures),暂不支持模拟器。
-
- * 官方验证过的手机机型:大部分ARM 架构的手机、平板及开发板。
-
-3.其他说明
-
- * 3.1 【图像分割类模型】(1)图像分割类Demo暂未提供实时摄像头录制拍摄的能力,开发者可根据自己需要,进行安卓开发完成;(2)PP-Humanseg-Lite模型设计初衷为横屏视频会议等场景,本次安卓开发仅支持述评场景,开发者可根据自己需要,开发横屏的Android功能。
-
- * 3.2 【OCR模型】OCR任务第一次启动任务,第一张推理时间久,属于正常情况(因为涉及到模型加载、预处理等工作)。
-
-## 2. SDK大小说明
-
-1. 模型资源文件大小影响 SDK 大小
-2. SDK 包及 IPA 安装包虽然比较大,但最终安装到设备后所占大小会缩小很多。这与 multi architechtures、bitcode 和 AppStore 的优化有关。
-
-# 快速开始
-
-## 1. 项目结构说明
-
-根据开发者模型、部署芯片、操作系统需要,在图像界面[飞桨开源模型](https://ai.baidu.com/easyedge/app/openSource)或[GIthub](https://github.com/PaddlePaddle/FastDeploy)中选择对应的SDK进行下载。SDK目录结构如下:
-
-```
-.EasyEdge-iOS-SDK
-├── EasyDLDemo # Demo工程文件
-├── LIB # 依赖库
-├── RES
-│ ├── easyedge # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
-│ ├── conf.json # Android、iOS系统APP名字需要
-│ ├── model # 模型结构文件
-│ ├── params # 模型参数文件
-│ ├── label_list.txt # 模型标签文件
-│ ├── infer_cfg.json # 模型前后处理等配置文件
-└── DOC # 文档
-```
-
-## 2. 测试Demo
-
-按如下步骤可直接运行 SDK 体验 Demo:
-步骤一:用 Xcode 打开 `EasyDLDemo/EasyDLDemo.xcodeproj`
-步骤二:配置开发者自己的签名(不了解签名机制的,可以看FAQ [iOS签名介绍](#100))
-步骤三:连接手机运行,不支持模拟器
-
-检测模型运行示例:
-
-
-
-# SDK使用说明
-
-本节介绍如何将 SDK 接入开发者的项目中使用。
-
-## 1. 集成指南
-
-步骤一:依赖库集成
-步骤二:`import `
-
-### 1.1 依赖库集成
-
-1. 复制 LIB 目录至项目合适的位置
-2. 配置 Build Settings 中 Search paths: 以 SDK 中 LIB 目录路径为例
-- Framework Search Paths:`${PROJECT_DIR}/../LIB/lib`
-- Header Search Paths:`${PROJECT_DIR}/../LIB/include`
-- Library Search Paths:`${PROJECT_DIR}/../LIB/lib`
-
-> 集成过程如出现错误,请参考 Demo 工程对依赖库的引用
-
-## 2. 调用流程示例
-
-以通用ARM的图像分类预测流程为例,详细说明请参考后续章节:
-
-```
-NSError *err;
-
-// step 1: 初始化模型
-EasyDLModel *model = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];
-
-// step 2: 准备待预测的图像
-UIImage *image = ...;
-
-// step 3: 预测图像
-NSArray *results = [model detectUIImage:image withFilterScore:0 andError:&err];
-
-// step 4: 解析结果
-for (id res in results) {
- EasyDLClassfiData *clsData = (EasyDLClassfiData *) res;
- NSLog(@"labelIndex=%d, labelName=%@, confidence=%f", clsData.category, clsData.label, clsData.accuracy);
-}
-```
-
-### 2.1 初始化
-
-```
-// 示例
-// 参数一为模型资源文件夹名称
-EasyDLModel *model = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];
-```
-
-> 模型资源文件夹需以 folder reference 方式加入 Xcode 工程,如 `RES/easyedge` 文件夹在 Demo 工程中表现为蓝色
-
-### 2.2 预测图像
-
-所有模型类型通过以下接口获取预测结果:
-
-```
-// 返回的数组类型不定
-NSArray *results = [model detectUIImage:image withFilterScore:0 andError:&err];
-```
-
-返回的数组类型如下,具体可参考 `EasyDLResultData.h` 中的定义:
-| 模型类型 | 类型 |
-| --- | ---- |
-| 图像分类 | EasyDLClassfiData |
-| 物体检测/人脸检测 | EasyDLObjectDetectionData |
-| 实例分割 | EasyDLObjSegmentationData |
-| 姿态估计 | EasyDLPoseData |
-| 文字识别 | EasyDLOcrData |
-
-# FAQ
-
-1. 如何多线程并发预测?
-
-SDK内部已经能充分利用多核的计算能力。不建议使用并发来预测。
-
-如果开发者想并发使用,请务必注意`EasyDLModel`所有的方法都不是线程安全的。请初始化多个实例进行并发使用,如
-
-```c
-- (void)testMultiThread {
- UIImage *img = [UIImage imageNamed:@"1.jpeg"];
- NSError *err;
- EasyDLModel * model1 = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];
- EasyDLModel * model2 = [[EasyDLModel alloc] initModelFromResourceDirectory:@"easyedge" withError:&err];
-
- dispatch_queue_t queue1 = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
- dispatch_queue_t queue2 = dispatch_queue_create("testQueue2", DISPATCH_QUEUE_CONCURRENT);
-
- dispatch_async(queue1, ^{
- NSError *detectErr;
- for(int i = 0; i < 1000; ++i) {
- NSArray * res = [model1 detectUIImage:img withFilterScore:0 andError:&detectErr];
- NSLog(@"1: %@", res[0]);
- }
- });
-
- dispatch_async(queue2, ^{
- NSError *detectErr;
- for(int i = 0; i < 1000; ++i) {
- NSArray * res = [model2 detectUIImage:img withFilterScore:0 andError:&detectErr];
- NSLog(@"2: %@", res[0]);
- }
- });
-}
-```
-
-2. 编译时出现 Undefined symbols for architecture arm64: ...
-* 出现 `cxx11, vtable` 字样:请引入 `libc++.tbd`
-* 出现 `cv::Mat` 字样:请引入 `opencv2.framework`
-* 出现 `CoreML`, `VNRequest` 字样:请引入`CoreML.framework` 并务必`#import `
-3. 运行时报错 Image not found: xxx ...
-
-请Embed具体报错的库。
-
-4. 编译时报错:Invalid bitcode version
-
-这个可能是开发者使用的 Xcode 低于12导致,可以升级至12版本。
-
-5. 错误说明
-
-SDK 的方法会返回 NSError,直接返回的 NSError 的错误码定义在 `EasyDLDefine.h - EEasyDLErrorCode` 中。NSError 附带 message (有时候会附带 NSUnderlyingError),开发者可根据 code 和 message 进行错误判断和处理。
-
-6. iOS签名说明
-
-iOS 签名是苹果生态对 APP 开发者做的限定,对于个人开发者是免费的,对于企业开发者(譬如APP要上架应用市场),是收费的。此处,仅简单说明作为普通开发者,第一次尝试使用 Xcode编译代码,需要进行的签名操作。
-(1)在Xcode/Preferences/Accounts 中添加个人Apple ID;
-(2)在对应的EasyDLDemo中做如下图设置:
-
-
-(3)(2)后会在手机上安装好对应APP,还需要在手机上`设置/通用/设备管理/开发者应用/信任appleID`,才能运行该 APP。
diff --git a/docs/06_arm_cpu/replace_model_with_another_one.md b/docs/06_arm_cpu/replace_model_with_another_one.md
deleted file mode 100644
index 1e6f7436a..000000000
--- a/docs/06_arm_cpu/replace_model_with_another_one.md
+++ /dev/null
@@ -1,266 +0,0 @@
-
-# 简介
-
-本文档介绍如何将FastDeploy的Demo模型,替换成开发者自己训练的AI模型。(**注意**:FastDeploy下载的SDK和Demo仅支持相同算法模型的替换)。本文档要求开发者已经将Demo和SDK运行跑通,如果要了解运行跑通Demo和SDK指导文档,可以参考[SDK使用文档](https://github.com/PaddlePaddle/FastDeploy/blob/develop/README.md#sdk使用)
-
-* [简介](#0)
-* [模型替换](#1)
- * [1.模型准备](#2)
- * [1.1 Paddle模型](#3)
- * [1.2 Paddle OCR模型增加一步特殊转换](#4)
- * [1.2.1 下载模型转换工具](#5)
- * [1.2.2 下载模型转换工具](#6)
- * [1.3 其他框架模型](#7)
- * [2.模型名修改和label文件准备](#8)
- * [2.1 非OCR模型名修改](#9)
- * [2.2 OCR模型名修改](#10)
- * [2.3 模型label文件](#11)
- * [3.修改配置文件](#12)
-* [测试效果](#13)
-* [完整配置文件说明](#14)
- * [1.配置文件字段含义](#15)
- * [2.预处理顺序](#16)
-* [FAQ](#17)
-
-**注意事项:**
-
-1. PP-PicoDet模型: 在FastDeploy中,支持PP-Picodet模型,是将后处理写到网络里面的方式(即后处理+NMS都在网络结构里面)。Paddle Detection导出静态模型时,有3种方法,选择将后处理和NMS导入到网络里面即可(参考[导出部分](https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.4/configs/picodet#%E5%AF%BC%E5%87%BA%E5%8F%8A%E8%BD%AC%E6%8D%A2%E6%A8%A1%E5%9E%8B))。详细网络区别,可以通过netron工具对比。
-
-2. PP-Picodet模型:在FastDeploy中,支持PP-Picodet模型,是将前处理写在网络外面的方式。Paddle Detection中的TinyPose算法中,会将PP-PicoDet模型的前处理写入网络中。如果要使用FastDeploy的SDK进行模型替换,需要将前处理写到网络外面。(参考[Detection中的导出命令](https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.4/configs/keypoint/tiny_pose#%E5%B0%86%E8%AE%AD%E7%BB%83%E7%9A%84%E6%A8%A1%E5%9E%8B%E5%AE%9E%E7%8E%B0%E7%AB%AF%E4%BE%A7%E9%83%A8%E7%BD%B2),将TestReader.fuse_normalize=False即可)。
-
-
-
-# 模型替换
-
-开发者从PaddleDetection、PaddleClas、PaddleOCR、PaddleSeg等飞桨开发套件导出来的对应模型,完成 [1.模型准备](#)、[1.模型名修改和模型label](#)、[3.修改配置文件](#) 3步操作(需要相同算法才可替换),可完成自定义模型的模型文件,运行时指定新的模型文件,即可在自己训练的模型上实现相应的预测推理任务。
-
-* Linux下模型资源文件夹路径:`EasyEdge-Linux-**/RES/` 。
-* Windows下模型资源文件夹路径:`EasyEdge-Windows-**/data/model/`。
-* Android下模型资源文件夹路径:`EasyEdge-Android-**/app/src/assets/infer/` 和 ` app/src/assets/demo/conf.json`
-* iOS下模型资源文件夹路径:`EasyEdge-iOS-**/RES/easyedge/`
-
-主要涉及到下面4个模型相关的文件(mode、params、label_list.txt、infer_cfg.json)和一个APP名相关的配置文件(仅Android、iOS、HTTP需要,APP名字,非必需。)
-
-* ```
- ├── RES、model、infer # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
- │ ├── conf.json # Android、iOS系统APP名字需要
- │ ├── model # 模型结构文件
- │ ├── params # 模型参数文件
- │ ├── label_list.txt # 模型标签文件
- │ ├── infer_cfg.json # 模型前后处理等配置文件
- ```
-
- > ❗注意:OCR模型在ARM CPU硬件上(包括Android、Linux、iOS 三款操作系统),因为任务的特殊性,替换在 [1.模型准备](#)、[1.模型名修改和模型label](#) 不同于其他任务模型,详细参考下面步骤。
-
-
-
-## 1.模型准备
-
-
-
-### 1.1 Paddle模型
-
-* 通过PaddleDetection、PaddleClas、PaddleOCR、PaddleSeg等导出来飞桨模型文件,包括如下文件(可能存在导出时修改了名字的情况,后缀`.pdmodel`为模型网络结构文件,后缀`.pdiparams`为模型权重文件):
-
-```
-model.pdmodel # 模型网络结构
-model.pdiparams # 模型权重
-model.yml # 模型的配置文件(包括预处理参数、模型定义等)
-```
-
-
-
-### 1.2 OCR模型特殊转换(仅在ARM CPU上需要)
-
-因为推理引擎版本的问题,OCR模型需要在[1.1 Paddle模型](#3)导出`.pdmodel`和`.pdiparams`模型后,多增加一步模型转换的特殊处理,主要执行下面2步:
-
-
-
-#### 1.2.1 下载模型转换工具
-
-Linux 模型转换工具下载链接:[opt_linux](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.11/opt_linux)
-M1 模型转换工具下载链接:[opt_m1](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.11/opt_m1)
-mac 模型转换工具下载链接:[opt_mac](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.11/opt_mac)
-
-
-
-#### 1.2.2 模型转换
-
-以下命令,以mac为例,完成模型转换。
-
-```
-* 转换 OCR 检测模型命名:
-./opt_mac --model_dir=./ch_PP-OCRv3_det_infer/ --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=./ocr_det
-
-* 转换 OCR 识别模型命名:
-./opt_mac --model_dir=./ch_PP-OCRv3_rec_infer/ --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=./ocr_rec
-```
-
-产出:
-
-
-
-
-
-### 1.3 其他框架模型
-
-* 如果开发着是PyTorch、TensorFLow、Caffe、ONNX等其他框架模型,可以参考[X2Paddle](https://github.com/PaddlePaddle/X2Paddle)官网完成模型转换,即可得到对应的`model.pdmodel`和`model.pdiparams`模型文件。
-
-
-
-## 2.模型名修改和label文件准备
-
-
-
-### 2.1 非OCR模型名修改
-
-按照下面的规则,修改套件导出来的模型名和标签文件,并替换到模型资源文件中。
-
-```
-1. model.pdmodel 修改成 model
-2. model.pdiparams 修改成 params
-```
-
-
-
-### 2.2 OCR模型名修改
-
-```
-1. ocr_det.nb 修改成 model # 将 检测模型 修改名称成 model
-2. ocr_rec.nb 修改成 params # 将 识别模型 修改名称成 model
-```
-
-
-
-### 2.3 模型label文件
-
-同时需要准备模型文件对应的label文件`label_list.txt`。label文件可以参考原Demo中`label_list.txt`的格式准备。
-
-
-
-## 3. 修改模型相关配置文件
-
-(1)infer_cfg.json 文件修改
-
-所有程序开发者都需要关注该配置文件。开发者在自己数据/任务中训练模型,可能会修改输入图像尺寸、修改阈值等操作,因此需要根据训练情况修改`Res文件夹下的infer_cfg.json`文件中的对应。CV任务涉及到的配置文件修改包括如下字段:
-
-```
-1. "best_threshold": 0.3, #网络输出的阈值,根据开发者模型实际情况修改
-2. "resize": [512, 512], #[w, h]网络输入图像尺寸,用户根据实际情况修改。
-```
-
-(2)conf.json 文件修改
-仅Android、iOS、HTTP服务应用开发者,需要关注该配置文件。开发者根据自己应用程序命名需要,参考已有`conf.json`即可。
-
-通常,开发者修改FastDeploy项目中的模型,涉及到主要是这几个配置信息的修改。FastDeploy详细的配置文件介绍参考[完整配置文件说明](#8)。
-
-
-
-# 测试效果
-
-将自定义准备的`RES`文件,按照第2、3步完成修改后,参考可以参考[SDK使用文档](https://github.com/PaddlePaddle/FastDeploy/blob/develop/README.md#sdk%E4%BD%BF%E7%94%A8)完成自己模型上的不同预测体验。
-
-
-
-# 完整配置文件说明
-
-
-
-## 1. 配置文件字段含义
-
-模型资源文件`infer_cfg.json`涉及到大量不同算法的前后处理等信息,下表是相关的字段介绍,通常开发者如果没有修改算法前出处理,不需要关心这些字段。非标记【必须】的可不填。
-
-```json
-{
- "version": 1,
- "model_info": {
- "best_threshold": 0.3, // 默认0.3
- "model_kind": 1, // 【必须】 1-分类,2-检测,6-实例分割,12-追踪,14-语义分割,401-人脸,402-姿态,10001-决策
- },
- "pre_process": { // 【必须】
- // 归一化, 预处理会把图像 (origin_img - mean) * scale
- "skip_norm": false, // 默认为false, 如果设置为true,不做mean scale处理
- "mean": [123, 123, 123], // 【必须,一般不需要动】图像均值,已经根据Paddle套件均值做了转换处理,开发者如果没有修改套件参数,可以不用关注。(X-mean)/ scale
- "scale": [0.017, 0.017, 0.017], // 【必须,一般不需要动】
- "color_format": "RGB", // BGR 【必须,一般不需要动】
- "channel_order": "CHW", // HWC
- // 大小相关
- "resize": [300, 300], // w, h 【必须】
- "rescale_mode": "keep_size", // 默认keep_size, keep_ratio, keep_ratio2, keep_raw_size, warp_affine
- "max_size": 1366, // keep_ratio 用。如果没有提供,则用 resize[0]
- "target_size": 800, // keep_ratio 用。如果没有提供,则用 resize[1]
- "raw_size_range": [100, 10000], // keep_raw_size 用
- "warp_affine_keep_res": // warp_affine模式使用,默认为false
- "center_crop_size": [224, 224], // w, h, 如果需要做center_crop,则提供,否则,无需提供该字段
- "padding": false,
- "padding_mode": "padding_align32", // 【非必须】默认padding_align32, 其他可指定:padding_fill_size
- "padding_fill_size": [416, 416], // 【非必须】仅padding_fill_size模式下需要提供, [fill_size_w, fill_size_h], 这里padding fill对齐paddle detection实现,在bottom和right方向实现补齐
- "padding_fill_value": [114, 114, 114] // 【非必须】仅padding_fill_size模式下需要提供
- // 其他
- "letterbox": true,
- },
- "post_process": {
- "box_normed": true, // 默认为true, 如果为false 则表示该模型的box坐标输出不是归一化的
- }
-}
-```
-
-
-
-## 2. 预处理顺序(没有的流程自动略过)
-
-1. 灰度图 -> rgb图变换
-2. resize 尺寸变换
-3. center_crop
-4. rgb/bgr变换
-5. padding_fill_size
-6. letterbox(画个厚边框,填上黑色)
-7. chw/hwc变换
-8. 归一化:mean, scale
-9. padding_align32
-
-rescale_mode说明:
-
-* keep_size: 将图片缩放到resize指定的大小
-* keep_ratio:将图片按比例缩放,长边不超过max_size,短边不超过target_size
-* keep_raw_size:保持原图尺寸,但必须在raw_size_range之间
-* warp_affine: 仿射变换,可以设置warp_affine_keep_res指定是否keep_res,在keep_res为false场景下,宽高通过resize字段指定
-
-
-
-# FAQ
-
-### 1. 如何处理一些 undefined reference / error while loading shared libraries?
-
-> 如:./easyedge_demo: error while loading shared libraries: libeasyedge.so.1: cannot open shared object file: No such file or directory
-
-遇到该问题时,请找到具体的库的位置,设置LD_LIBRARY_PATH;或者安装缺少的库。
-
-> 示例一:libverify.so.1: cannot open shared object file: No such file or directory
-> 链接找不到libveirfy.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../lib 解决(实际冒号后面添加的路径以libverify.so文件所在的路径为准)
-
-> 示例二:libopencv_videoio.so.4.5: cannot open shared object file: No such file or directory
-> 链接找不到libopencv_videoio.so文件,一般可通过 export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:../../thirdparty/opencv/lib 解决(实际冒号后面添加的路径以libopencv_videoio.so所在路径为准)
-
-> 示例三:GLIBCXX_X.X.X not found
-> 链接无法找到glibc版本,请确保系统gcc版本>=SDK的gcc版本。升级gcc/glibc可以百度搜索相关文献。
-
-### 2. 使用libcurl请求http服务时,速度明显变慢
-
-这是因为libcurl请求continue导致server等待数据的问题,添加空的header即可
-
-```bash
-headers = curl_slist_append(headers, "Expect:");
-```
-
-### 3. 运行二进制时,提示 libverify.so cannot open shared object file
-
-可能cmake没有正确设置rpath, 可以设置LD_LIBRARY_PATH为sdk的lib文件夹后,再运行:
-
-```bash
-LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../lib ./easyedge_demo
-```
-
-### 4. 编译时报错:file format not recognized
-
-可能是因为在复制SDK时文件信息丢失。请将整个压缩包复制到目标设备中,再解压缩、编译