Welcome to TengineFactory’s documentation!

介绍





关于

随着人工智能的普及,深度学习算法的越来越规整,一套可以低代码并且快速落地并且有定制化解决方案的框架就是一种趋势。为了缩短算法落地周期,降低算法落地门槛是一个必然的方向。

TengineFactory是由 OPEN AI LAB 自主研发的一套快速,低代码的算法落地框架。我们致力于打造一个完全开源的易用的算法落地框架,通过配置json文件的方式,可以以最简洁的接口来获取你所需要的结果。此外,你也可以插入你自己特有的代码,完成算法的落地工程

轻量级

  • 唯一依赖库Tengine-Lite,Tengine-Lite是框架的核心推理框架。

  • x86平台 : so大小为1.5M左右。

易用性

  • 针对通用的前处理,后处理框架内均已包含,无须再code。

  • 如模型拥有独有的前处理、后处理,插件化的方式,可以很快的新增你的算法。

致谢

Tengine Factory参考一下项目:

License

Apache 2.0

架构设计

TengineFactory采用Json + Pipeline的设计方式。

Json文件用于配置算法的参数以及如何运行整体落地算法。TengineFactory内部提供了多个前处理,后处理的方式,你可以通过配置选择你所需的前处理、后处理、输入输出,来完成整体算法的落地。

Pipeline是管道方式运行算法的流,包含create、preprocess、run、postprocess、destory,每个pipeline都继承base,所以按照如此方式,方便插入个性化的pipeline。我们也会补充各种统一化的算法的pipeline进去。

具体结构如下图:

Framework

https://openailab.oss-cn-shenzhen.aliyuncs.com/tenginefactory/framework.pngframework

PipeLine

https://openailab.oss-cn-shenzhen.aliyuncs.com/tenginefactory/pipeline.pngpipeline

示例展示

人脸检测&关键点

原始图片: _images/detect_0.jpgorigin

算法结果: _images/detect_1.jpgresult

编译Tengine

环境要求

  • opencv >= 3.4

  • cmake >= 3.10

  • protobuf >= 3.0

  • gcc >= 4.9

  • ndk >= 15c (如果需要使用Android)

编译Linux版本

  1. clone Tengine项目,git clone https://github.com/OAID/Tengine.git

  2. 编译动态库。

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版本

  1. clone TengineFactory项目,git clone https://github.com/OAID/TengineFactory.git

  2. 编译动态库。

./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

https://openailab.oss-cn-shenzhen.aliyuncs.com/tenginefactory/component.pngTFactoryComponent

通过下面的方式获取输入图像的宽、高、通道、以及数据。

    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 Release Tengine Factory.
     * @return None.
     */
    void release();

记得释放,否则会造成内存泄漏。

获取图像数量

    /**
     * @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"]
    }
}

贡献内容

反馈问题

  • Github issues

  • Email: Support@openailab.com

  • QQGroup: 787519516 (TengineFactory)

提交你的代码

  • 提交PR,你需要说明你修改了什么。

    • Fork it!

    • 创建你的分支: git checkout -b my-new-feature

    • 提交你的修改: git add . && git commit -m ‘Add some feature’

    • 推送这个分支: git push origin my-new-feature

    • 提交请求

Thanks a lot!!

ChangeLog

FAQ