Welcome to TengineFactory’s documentation!¶
介绍¶

关于¶
随着人工智能的普及,深度学习算法的越来越规整,一套可以低代码并且快速落地并且有定制化解决方案的框架就是一种趋势。为了缩短算法落地周期,降低算法落地门槛是一个必然的方向。
TengineFactory是由 OPEN AI LAB 自主研发的一套快速,低代码的算法落地框架。我们致力于打造一个完全开源的易用的算法落地框架,通过配置json文件的方式,可以以最简洁的接口来获取你所需要的结果。此外,你也可以插入你自己特有的代码,完成算法的落地工程
轻量级¶
唯一依赖库Tengine-Lite,Tengine-Lite是框架的核心推理框架。
x86平台 : so大小为1.5M左右。
易用性¶
针对通用的前处理,后处理框架内均已包含,无须再code。
如模型拥有独有的前处理、后处理,插件化的方式,可以很快的新增你的算法。
License¶
Apache 2.0
架构设计¶
TengineFactory采用Json + Pipeline的设计方式。
Json文件用于配置算法的参数以及如何运行整体落地算法。TengineFactory内部提供了多个前处理,后处理的方式,你可以通过配置选择你所需的前处理、后处理、输入输出,来完成整体算法的落地。
Pipeline是管道方式运行算法的流,包含create、preprocess、run、postprocess、destory,每个pipeline都继承base,所以按照如此方式,方便插入个性化的pipeline。我们也会补充各种统一化的算法的pipeline进去。
具体结构如下图:
Framework¶
framework
PipeLine¶
pipeline
编译Tengine¶
环境要求¶
opencv >= 3.4
cmake >= 3.10
protobuf >= 3.0
gcc >= 4.9
ndk >= 15c (如果需要使用Android)
编译Linux版本¶
clone Tengine项目,
git clone https://github.com/OAID/Tengine.git
编译动态库。
cd Tengine
mkdir build && cd build
cmake .. && make -j4
make install
编译完成后build/install/lib目录会生成libtengine-lite.so
文件,如下所示:
install
├── bin
│ ├── tm_benchmark
│ ├── tm_classification
│ └── tm_mobilenet_ssd
├── include
│ └── tengine_c_api.h
└── lib
└── libtengine-lite.so
编译Androidv7/v8版本¶
下载ndk,http://developer.android.com/ndk/downloads/index.html(可选)删除debug参数,缩小二进制体积。android.toolchain.cmake 这个文件可以从 $ANDROID_NDK/build/cmake 找到
# vim $ANDROID_NDK/build/cmake/android.toolchain.cmake
# 删除 "-g" 这行
list(APPEND ANDROID_COMPILER_FLAGS
-g
-DANDROID
配置环境:
export $ANDROID_NDK=<NDK-path>
Android v7编译指令:
mkdir build-android-armv7
cd build-android-armv7
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON -DANDROID_PLATFORM=android-19 ..
make
make install
Android v8编译指令:
mkdir build-android-aarch64
cd build-android-aarch64
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build-android-aarch64/cmake/android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-21 ..
make
make install
编译成功后,把libtengine-lite.so 拷贝到<Tengine-Factory-path>/libs
下
编译TengineFactory¶
环境要求¶
opencv >= 3.4
cmake >= 3.10
protobuf >= 3.0
gcc >= 4.9
ndk >= 15c (如果需要使用Android)
编译Linux版本¶
clone TengineFactory项目,
git clone https://github.com/OAID/TengineFactory.git
编译动态库。
./build.sh
编译后目录结构,如下所示:
TengineFactory
├── build
│ └── libTFactory.so
└── include
└── TFactoryComponent.hpp
└── TFactoryProcess.hpp
编译Androidv7/v8版本¶
下载ndk,http://developer.android.com/ndk/downloads/index.html(可选)删除debug参数,缩小二进制体积。android.toolchain.cmake 这个文件可以从 $ANDROID_NDK/build/cmake 找到
# vim $ANDROID_NDK/build/cmake/android.toolchain.cmake
# 删除 "-g" 这行
list(APPEND ANDROID_COMPILER_FLAGS
-g
-DANDROID
配置环境:
export $ANDROID_NDK=<NDK-path>
Android v7编译指令:
mkdir build-android-armv7
cd build-android-armv7
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON -DANDROID_PLATFORM=android-19 ..
make
Android v8编译指令:
mkdir build-android-aarch64
cd build-android-aarch64
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build-android-aarch64/cmake/android.toolchain.cmake -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-21 ..
make
执行算法¶
/**
* @brief Create Tengine Factory handler.
* @return handler.
*/
static TFactoryProcess* create();
必须先进行create操作,api都是基于这个handler的。建议只创建一次多次使用。
初始化¶
/**
* @brief Initialize Tengine Factory.
* @param jsonPath json config file path.
* @return None.
*/
void init(const char* jsonPath);
运行¶
有两种方式进行输入的传入:
通过json配置,配置文件路径或者视频流。参数为第几张图片。
/**
* @brief Run Tengine Factory by read json file sources.
* @param index image file index, if is video you should not set the index.
* @return None.
*/
void run(int index = -1);
通过传入输入参数的方式。
/**
* @brief Run Tengine Factory by bytes.
* @param input_data image or video bytes.
* @param input_data image or video width.
* @param input_data image or video height.
* @return None.
*/
void runWithData(uint8_t* input_data, int width, int height);
获取输出¶
/**
* @brief Get Tengine Factory Output.
* @return memory of TFactoryComponent data.
*/
TFactoryComponent* getComponents();
对于每个图像的输入,都会输出一个TFactoryComponent
。
TFactoryComponent
通过下面的方式获取输入图像的宽、高、通道、以及数据。
TFactory::TFactoryComponent *com = interProcess->getComponents();
int image_w = com->width();
int image_h = com->height();
int channel = com->channel();
uint8_t *input_data = com->buffer();
获取每个算法的输出:
有两种方式:传入算法的名称,也就是json文件里面配置的。
/**
* @brief get function component by functionName ,function name is configured in the json file.
* @param functionName function name.
* @return function output.
*/
FunctionComponent* componentOutput(std::string functionName);
获取所有的算法输出。
/**
* @brief get function components.
* @return function outputs.
*/
std::vector<FunctionComponent*> getComponentsOutput();
输出为FunctionComponent
为一个数据结构。
struct FunctionComponent
{
// function Name
std::string functionName;
// how many outputs in function
int function_output_count;
// outputs buffer
std::vector<float*> output_buffers;
};
获取图像数量¶
/**
* @brief Get image count in folder.
* @return image count.
*/
int imageCount();
配置¶
参数表格¶
参数名 | 参数类型 | 参数功能 | 注意事项 |
---|---|---|---|
Function | StringArray | 算法名称 | - |
Thread | Integer | 线程数 | <=4 |
Sources | String | 资源目录 | 可填单个图片,文件夹。如果为视频流则不填 |
pipelineMode | String | 算法模式 | - |
ModelPath | String | 模型路径 | - |
mean | FloatArray | 均值 | - |
normal | FloatArray | 方差 | - |
min_sizes | FloatArrayArray | 最小尺寸 | 可不填,不填则需要配置base_sizes,ratios参数 |
scales | FloatArrayArray | 缩放系数 | - |
base_sizes | FloatArrayArray | 基础尺寸 | - |
ratios | FloatArray | anchor比率 | - |
clip | Boolean | 是否裁剪 | - |
input_w | Integer | 模型输入宽 | - |
input_h | Integer | 模型输入高 | - |
input_type | String | 模型输入类型 | - |
strides | FloatArray | 跨度 | - |
score_threshold | Float | 分数阈值 | - |
iou_threshold | Float | IOU阈值 | - |
variance | FloatArray | 方差 | 生成检测框时使用 |
preprocess | String | 前处理模式 | - |
postprocess | String | 后处理模型 | - |
TensorOuputString | StringArray | 算法输出字符串 | “含义”:“字符串名” |
input_stream | StringArray | 取某算法的结果作为输入流 | “算法名”:“流的含义” |
output_stream | StringArray | 只取输出的一部分 | “含义”:“取的部分” |
示例配置¶
{
"Function" : ["FaceDetect", "FaceLandmark"],
"Thread" : 2,
"Sources" : "./images/",
"FaceDetect" : {
"pipelineMode" : "Standard",
"ModelPath" : "",
"mean" : [127.0, 127.0, 127.0],
"normal" : [0.0078125, 0.0078125, 0.0078125],
"min_sizes" : [
[10.0, 16.0, 24.0],
[32.0, 48.0],
[64.0, 96.0],
[128.0, 192.0, 256.0]],
"scales" : [
[8.0, 4.0, 2.0, 1.0],
[8.0, 4.0, 2.0, 1.0],
[32.0, 16.0, 8.0, 4.0]],
"base_sizes" : [[16], [16], [16]],
"ratios" : [2.5],
"clip" : false,
"input_w" : 160,
"input_h" : 120,
"input_type" : "RGB",
"strides" : [8.0, 16.0, 32.0, 64.0],
"score_threshold" : 0.6,
"iou_threshold" : 0.3,
"variance" : [0.1, 0.2],
"preprocess" : "CreateAnchor",
"postprocess" : "NMS",
"TensorOuputString" : ["scores:score", "boxes:box"]
},
"FaceLandmark" : {
"ModelPath" : "./model/landmark.tmfile",
"pipelineMode" : "MutiInput",
"mean" : [127.0, 127.0, 127.0],
"normal" : [0.007874, 0.007874, 0.007874],
"input_w" : 160,
"input_h" : 160,
"input_type" : "RGB",
"input_stream" : ["FaceDetect:rect"],
"output_stream" : ["points:212"]
}
}