feat: 切换后端至PaddleOCR-NCNN,切换工程为CMake
1.项目后端整体迁移至PaddleOCR-NCNN算法,已通过基本的兼容性测试 2.工程改为使用CMake组织,后续为了更好地兼容第三方库,不再提供QMake工程 3.重整权利声明文件,重整代码工程,确保最小化侵权风险 Log: 切换后端至PaddleOCR-NCNN,切换工程为CMake Change-Id: I4d5d2c5d37505a4a24b389b1a4c5d12f17bfa38c
This commit is contained in:
76
3rdparty/opencv-4.5.4/modules/gapi/doc/01-background.markdown
vendored
Normal file
76
3rdparty/opencv-4.5.4/modules/gapi/doc/01-background.markdown
vendored
Normal file
@ -0,0 +1,76 @@
|
||||
# Why Graph API? {#gapi_purposes}
|
||||
|
||||
# Motivation behind G-API {#gapi_intro_why}
|
||||
|
||||
G-API module brings graph-based model of execution to OpenCV. This
|
||||
chapter briefly describes how this new model can help software
|
||||
developers in two aspects: optimizing and porting image processing
|
||||
algorithms.
|
||||
|
||||
## Optimizing with Graph API {#gapi_intro_opt}
|
||||
|
||||
Traditionally OpenCV provided a lot of stand-alone image processing
|
||||
functions (see modules `core` and `imgproc`). Many of that functions
|
||||
are well-optimized (e.g. vectorized for specific CPUs, parallel, etc)
|
||||
but still the out-of-box optimization scope has been limited to a
|
||||
single function only -- optimizing the whole algorithm built atop of that
|
||||
functions was a responsibility of a programmer.
|
||||
|
||||
OpenCV 3.0 introduced _Transparent API_ (or _T-API_) which allowed to
|
||||
offload OpenCV function calls transparently to OpenCL devices and save
|
||||
on Host/Device data transfers with cv::UMat -- and it was a great step
|
||||
forward. However, T-API is a dynamic API -- user code still remains
|
||||
unconstrained and OpenCL kernels are enqueued in arbitrary order, thus
|
||||
eliminating further pipeline-level optimization potential.
|
||||
|
||||
G-API brings implicit graph model to OpenCV 4.0. Graph model captures
|
||||
all operations and its data dependencies in a pipeline and so provides
|
||||
G-API framework with extra information to do pipeline-level
|
||||
optimizations.
|
||||
|
||||
The cornerstone of graph-based optimizations is _Tiling_. Tiling
|
||||
allows to break the processing into smaller parts and reorganize
|
||||
operations to enable data parallelism, improve data locality, and save
|
||||
memory footprint. Data locality is an especially important aspect of
|
||||
software optimization due to diffent costs of memory access on modern
|
||||
computer architectures -- the more data is reused in the first level
|
||||
cache, the more efficient pipeline is.
|
||||
|
||||
Definitely the aforementioned techniques can be applied manually --
|
||||
but it requires extra skills and knowledge of the target platform and
|
||||
the algorithm implementation changes irrevocably -- becoming more
|
||||
specific, less flexible, and harder to extend and maintain.
|
||||
|
||||
G-API takes this responsibility and complexity from user and does the
|
||||
majority of the work by itself, keeping the algorithm code clean from
|
||||
device or optimization details. This approach has its own limitations,
|
||||
though, as graph model is a _constrained_ model and not every
|
||||
algorithm can be represented as a graph, so the G-API scope is limited
|
||||
only to regular image processing -- various filters, arithmetic,
|
||||
binary operations, and well-defined geometrical transformations.
|
||||
|
||||
## Porting with Graph API {#gapi_intro_port}
|
||||
|
||||
The essence of G-API is declaring a sequence of operations to run, and
|
||||
then executing that sequence. G-API is a constrained API, so it puts a
|
||||
number of limitations on which operations can form a pipeline and
|
||||
which data these operations may exchange each other.
|
||||
|
||||
This formalization in fact helps to make an algorithm portable. G-API
|
||||
clearly separates operation _interfaces_ from its _implementations_.
|
||||
|
||||
One operation (_kernel_) may have multiple implementations even for a
|
||||
single device (e.g., OpenCV-based "reference" implementation and a
|
||||
tiled optimized implementation, both running on CPU). Graphs (or
|
||||
_Computations_ in G-API terms) are built only using operation
|
||||
interfaces, not implementations -- thus the same graph can be executed
|
||||
on different devices (and, of course, using different optimization
|
||||
techniques) with little-to-no changes in the graph itself.
|
||||
|
||||
G-API supports plugins (_Backends_) which aggregate logic and
|
||||
intelligence on what is the best way to execute on a particular
|
||||
platform. Once a pipeline is built with G-API, it can be parametrized
|
||||
to use either of the backends (or a combination of it) and so a graph
|
||||
can be ported easily to a new platform.
|
||||
|
||||
@sa @ref gapi_hld
|
Reference in New Issue
Block a user