/eagleeye

EAGLEEYE图像应用开发框架

Primary LanguageC++Apache License 2.0Apache-2.0

#EAGLEEYE图像应用开发框架

####简介 EAGLEEYE图像应用开发框架针对于快速将图像算法推向落地而设计。依靠统一通用的模块接口定义和数据流管线架构设计,极度简化团队协同开发。

####EAGLEEYE核心库编译 编译移动端EAGLEEYE库

mkdir ./build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_STL=c++_shared -DANDROID_NATIVE_API_LEVEL=android-23 ..

make

注意: 如果需要支持SNPE,OPENCL,则需要在编译eagleeye核心库时指定相关参数。 支持SNPE,需要添加 -DNN_ENGINE=snpe -DSNPE_PATH=SNPE_PATH 支持OPENCL,需要添加 -DOPENCL=OPENCL_PATH

注意:需要提前安装Android NDK。

####EAGLEEYE项目脚手架 安装脚手架

cd scripts
pip3 install -r requirements.txt
python3 setup.py install

####创建第一个项目

eagleeye-cli project --project=PLUGIN_NAME      \\ 定义要生成的插件名字
            --version=1.0.0.0                   \\ 定义插件版本
            --signature=xxxxx                   \\ 定义插件签名(目前未启用)
            --build_type=Release                \\ 定义编译版本
            --opencv=OPENCV_PATH                \\ 定义opencv路径(选择性设置)
            --abi=arm64-v8a                     \\ 定义abi
            --eagleeye=EAGLEEYE_PATH            \\ 定义eagleeye路径
            --opencl=OPENCL_PATH                \\ 定义OPENCL路径(选择性设置)
            --neon=true                         \\ 定义NEON加速(true/false)
            --host_platform=MACOS               \\ 设置主机平台(MACOS/LINUX)

运行后将生成模板工程。如果您使用的是VSCODE编辑器,那么脚手架将生成工程配置信息。

工程目录结构如下

PLUGIN_NAME
    - .vscode
        - c_cpp_properties.json
        - cmake-kits.json
        - settings.json
        - tasks.json
    - PLUGIN_NAME_plugin.h              // 插件头文件
    - PLUGIN_NAME_plugin.cpp            // 插件源文件
    - PLUGIN_NAME_demo.cpp              // 可执行程序,用于测试插件
    - CMakeLists.txt
    - build.sh                          // 构建&编译 插件和可执行程序
    - run.sh                            // 运行可执行程序

####编写第一个管线插件 实现c=a+b功能,在PLUGIN_NAME_plugin.cpp文件中

#include "eagleeye/processnode/Placeholder.h"
#include "eagleeye/processnode/Add.h"
#include "eagleeye/framework/pipeline/SignalFactory.h"

namespace eagleeye{
// 注册算法管线
EAGLEEYE_PIPELINE_REGISTER(PLUGIN_NAME, 1.0.0.0, xxxxx);

// 初始换算法管线
EAGLEEYE_BEGIN_PIPELINE_INITIALIZE(PLUGIN_NAME)
// 第一步:建立占位符节点
Placeholder<ImageSignal<float>>* placeholder_a = 
                    new Placeholder<ImageSignal<float>>();
Placeholder<ImageSignal<float>>* placeholder_b = 
                    new Placeholder<ImageSignal<float>>();

// 第二步:建立加操作节点
Add<ImageSignal<float>,ImageSignal<float>>* add = 
    new Add<ImageSignal<float>,ImageSignal<float>>();

// 第三步:将节点加入管线
PLUGIN_NAME->add(placeholder_a,"placeholder_a", SOURCE_NODE);
PLUGIN_NAME->add(placeholder_b,"placeholder_b", SOURCE_NODE);
PLUGIN_NAME->add(add,"add", SINK_NODE);

// 第四步:建立节点间的关系(a->c,b->c)
// 实现 c=a+b
PLUGIN_NAME->bind("placeholder_a",0,"add",0);
PLUGIN_NAME->bind("placeholder_b",0,"add",1);
EAGLEEYE_END_PIPELINE_INITIALIZE

####编写第一个测试代码 在PLUGIN_NAME_demo.cpp文件中

    // 1.step initialize PLUGIN_NAME module
    const char *config_folder = NULL;   // PLUGIN_NAME module configure folder
    eagleeye_PLUGIN_NAME_initialize(config_folder);

    // 2.step set input of pipeline
    float *a_data = (float*)malloc(sizeof(float)*10*10);
    for(int i=0; i<10*10; ++i){
        a_data[i] = 1.0f;
    }
    int a_data_size[] = {10, 10, 1};
    eagleeye_PLUGIN_NAME_set_input("placeholder_a/0", (void*)a_data, a_data_size, 3, 6);

    float *b_data = (float*)malloc(sizeof(float)*10*10);
    for(int i=0; i<10*10; ++i){
        b_data[i] = 2.0f;
    }
    int b_data_size[] = {10, 10, 1};
    eagleeye_PLUGIN_NAME_set_input("placeholder_b/0", (void*)b_data, b_data_size, 3, 6);

    // 3.step run pipeline
    eagleeye_PLUGIN_NAME_run();

    // 4.step get output from pipeline
    void *out_data;
    int out_data_size[3];
    int out_data_dims = 3;
    int out_data_type = 6;
    eagleeye_PLUGIN_NAME_get_output("add/0", out_data, out_data_size, out_data_dims, out_data_type);
    float* out_data_float = (float*)out_data;
    for(int i=0; i<10; ++i){
        for(int j=0; j<10; ++j){
            std::cout<<out_data_float[i*10+j]<<'\t';
        }
        std::cout<<std::endl;
    }

    // 5.step release PLUGIN_NAME module
    eagleeye_PLUGIN_NAME_release();

####编译

  • VSCODE开发环境
    • 按下SHIFT + COMMAND + P,选择CMAKE: Configure。 如果提示Select a kit for ...,则选择Android Clang。然后继续进行CMAKE: Configure。
    • 按下SHIFT + COMMAND + P,选择CMAKE: Build。
  • 控制台 运行 bash ./build.sh

####运行 运行前,确保手机已经连接,并开启USB调试状态

  • VSCODE开发环境
    • 按下SHIFT + COMMAND + P,选择Tasks: Run Task。
    • 在弹出的任务列表中,选择 PLUGIN_NAME run,便可执行。
  • 控制台 运行 bash ./run.sh

注意:如果需要使用SNPE等神经网络推断引擎,则需要手动将相关库放入手机项目文件夹下。 项目文件夹,由运行脚本自动生成,位于 /data/local/tmp/PLUGIN_NAME 所有依赖库和可执行程序均自动放置于此文件夹下。