-
Notifications
You must be signed in to change notification settings - Fork 63
立即开发
taotianran edited this page Dec 5, 2022
·
6 revisions
English | 简体中文
- 确认赞同FlyCV的授权协议:Apache 2.0 license。
- 为了可以提交代码,你需要通过 FlyCV Contributor License Agreement(CLA)验证。
- 需要先了解我们的工作流 以及 编码规范.
- 在开发一个新的能力之前先检查是否已经存在或者在开发之中。
- 如果打算修复bug,先确认最新版本是否已经修复。
现在让我们来看看如何开发一个模块:
首先,我们需要理解FlyCV的代码组织方式。
benchmark // 性能测试
cmake // cmake配置文件夹
├── external // 依赖库cmake配置文件夹
├── platform // 平台相关cmake配置文件夹
└── ......
docs
└── assets // 资源文件夹
include
├── flycv.h.in // 面向用户的接口头文件
├── flycv_namespace.h.in // 命名空间记录头文件
└── version.h.in // 版本记录头文件
modules // 功能模块文件夹
├── img_transform // 一级模块A文件夹
│ ├── color_convert // 功能 ①
│ ├── resize // 功能 ②
│ ├── warp_affine // 功能 ③
│ └── ...... // 其他功能
├── fusion_api // 一级模块B文件夹
├── img_calculation // 一级模块C文件夹
└── ...... // 其他一级模块
scripts // 不同平台编译脚本
samples // 不同平台demo
tests // 单测文件夹
third_party // 依赖库文件夹
tools // 辅助开发工具文件夹
└── add_module // 快速模块模板生成工具
为了方便每一个人开发,我们提供了一个快速模块生成工具可以生成模块模板,你可以使用它去快速新增一个功能模块。
脚本位置 tools/add_module/add_module.py
。
按照下面步骤调用该脚本:
1. 安装python依赖
sudo pip3 install Jinja2
2. 添加新功能
python3 tools/add_module.py modules/<parent_module>/<child_module> <ON|OFF>
parent_module: 对应一级模块文件夹名称。
child_module: 对应具体功能文件夹名称。
ON|OFF: 指定新增模块默认是开启还是关闭。
举例:
python3 tools/add_module/add_module.py modules/img_transform/blur OFF
执行完上述命令之后,可以通过 git status
查看文件变化。
On branch my-work
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: cmake/FCVBuildList.cmake
modified: include/flycv.h.in
Untracked files:
(use "git add <file>..." to include in what will be committed)
benchmark/modules/img_transform/blur_bench.cpp
modules/img_transform/blur/
tests/modules/img_transform/blur_test.cpp
下面简单介绍一下上述文件:
-
cmake/FalconCVBuildList.cmake
: 自动将新增模块添加到cmake配置中。
option(WITH_FCV_BLUR "Build module blur" OFF)
-
include/falconcv.h.in
: 对外头文件自动添加引用。
#cmakedefine WITH_FCV_BLUR
#ifdef WITH_FCV_BLUR
#include "modules/img_transform/blur/interface/blur.h"
#endif
- 查看生成的功能目录结构。
modules/img_transform/blur
├── include
│ └── blur_common.h
├── interface
│ └── blur.h
└── src
├── blur.cpp
└── blur_common.cpp
interface: 面向用户的接口文件
include: 内部的接口文件
src: 接口定义文件
-
tests/modules/img_transform/blur_test.cpp
: 单测文件。 -
benchmark/modules/img_transform/blur_bench.cpp
: 性能测试文件。
接下来你就可以专注于具体功能开发,不需要修改任何cmake配置
请参考 编译手册,我们提供了不同平台的编译方式。
和很多其他开源项目一样,我们使用 GoogleTest
作为单测框架, 聊几句 GoogleTest。
模块新增工具生成了一个简单的单测,下面是一个例子:
class BlurTest : public ::testing::Test {
void SetUp() override {
// (optional) prepare test data for every case
}
};
TEST_F(BlurTest, PositiveInput) {
// add your test code here
}
只需要添加一下调用代码就可以跑通一个单测了。
我们使用 googlebenchmakr作为性能测试框架,了解 benchmark。
模块新增工具生成了一个简单的benchmark case,下面是一个例子:
class BlurBench : public benchmark::Fixture {
public:
void SetUp(const ::benchmark::State& state) {
set_thread_num(G_THREAD_NUM);
// (optional) prepare test data for every case
}
};
BENCHMARK_DEFINE_F(BlurBench, PlaceHolder)
(benchmark::State& state) {
// add your code here
// don't forget to replace the PlaceHolder with a meaningful one
};
// don't forget to replace the PlaceHolder with a meaningful one
BENCHMARK_REGISTER_F(BlurBench, PlaceHolder)
->Unit(benchmark::kMicrosecond)
->Iterations(100)
->DenseRange(55, 255, 200);
只需要添加一下调用代码就可以跑通性能单测。