Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
1af084cb
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
1af084cb
编写于
4月 12, 2023
作者:
A
Alexander Smorkalov
提交者:
GitHub
4月 12, 2023
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #23477 from TolyaTalamanov:at/handle-multimeta-giebackend
[G-API] Handle meta from multiple inputs in IE backend
上级
136121f6
66abbf41
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
47 addition
and
15 deletion
+47
-15
modules/gapi/src/backends/ie/giebackend.cpp
modules/gapi/src/backends/ie/giebackend.cpp
+47
-15
未找到文件。
modules/gapi/src/backends/ie/giebackend.cpp
浏览文件 @
1af084cb
...
...
@@ -456,6 +456,7 @@ public:
cv
::
gimpl
::
GIslandExecutable
::
IOutput
&
output
,
const
cv
::
GArgs
&
args
,
const
std
::
vector
<
cv
::
gimpl
::
RcDesc
>
&
outs
,
cv
::
GRunArg
::
Meta
&&
meta
,
std
::
vector
<
cv
::
gimpl
::
GIslandExecutable
::
InObj
>
&&
input_objs
,
std
::
vector
<
cv
::
gimpl
::
GIslandExecutable
::
OutObj
>
&&
output_objs
);
...
...
@@ -477,7 +478,6 @@ public:
const
cv
::
Mat
&
inMat
(
std
::
size_t
input
)
const
;
const
cv
::
MediaFrame
&
inFrame
(
std
::
size_t
input
)
const
;
const
cv
::
GRunArg
&
input
(
std
::
size_t
idx
)
const
;
cv
::
GRunArgP
output
(
std
::
size_t
idx
);
cv
::
Mat
&
outMatR
(
std
::
size_t
idx
);
...
...
@@ -491,6 +491,8 @@ public:
// To store exception appeared in callback.
std
::
exception_ptr
eptr
;
const
cv
::
GRunArg
::
Meta
&
getMeta
()
{
return
m_meta
;
};
using
req_key_t
=
void
*
;
cv
::
MediaFrame
*
prepareKeepAliveFrameSlot
(
req_key_t
key
);
size_t
releaseKeepAliveFrame
(
req_key_t
key
);
...
...
@@ -499,6 +501,9 @@ private:
cv
::
GArg
packArg
(
const
cv
::
GArg
&
arg
);
// To propagate accumulated meta from all inputs to output.
cv
::
GRunArg
::
Meta
m_meta
;
// To store input/output data from frames
std
::
vector
<
cv
::
gimpl
::
GIslandExecutable
::
InObj
>
m_input_objs
;
std
::
vector
<
cv
::
gimpl
::
GIslandExecutable
::
OutObj
>
m_output_objs
;
...
...
@@ -525,9 +530,11 @@ IECallContext::IECallContext(const IEUnit &
cv
::
gimpl
::
GIslandExecutable
::
IOutput
&
output
,
const
cv
::
GArgs
&
args
,
const
std
::
vector
<
cv
::
gimpl
::
RcDesc
>
&
outs
,
cv
::
GRunArg
::
Meta
&&
meta
,
std
::
vector
<
cv
::
gimpl
::
GIslandExecutable
::
InObj
>
&&
input_objs
,
std
::
vector
<
cv
::
gimpl
::
GIslandExecutable
::
OutObj
>
&&
output_objs
)
:
uu
(
unit
),
out
(
output
),
m_input_objs
(
std
::
move
(
input_objs
)),
m_output_objs
(
std
::
move
(
output_objs
))
:
uu
(
unit
),
out
(
output
),
m_meta
(
std
::
move
(
meta
)),
m_input_objs
(
std
::
move
(
input_objs
)),
m_output_objs
(
std
::
move
(
output_objs
))
{
for
(
auto
&
it
:
m_input_objs
)
cv
::
gimpl
::
magazine
::
bindInArg
(
m_res
,
it
.
first
,
it
.
second
);
for
(
auto
&
it
:
m_output_objs
)
cv
::
gimpl
::
magazine
::
bindOutArg
(
m_res
,
it
.
first
,
it
.
second
);
...
...
@@ -575,10 +582,6 @@ cv::GRunArgP IECallContext::output(std::size_t idx) {
return
m_output_objs
[
idx
].
second
;
};
const
cv
::
GRunArg
&
IECallContext
::
input
(
std
::
size_t
idx
)
const
{
return
m_input_objs
[
idx
].
second
;
}
cv
::
detail
::
VectorRef
&
IECallContext
::
outVecRef
(
std
::
size_t
idx
)
{
return
cv
::
util
::
get
<
cv
::
detail
::
VectorRef
>
(
m_results
.
at
(
idx
));
}
...
...
@@ -1062,6 +1065,12 @@ void cv::gimpl::ie::GIEExecutable::run(cv::gimpl::GIslandExecutable::IInput &in
GAPI_Assert
(
cv
::
util
::
holds_alternative
<
cv
::
GRunArgs
>
(
in_msg
));
const
auto
in_vector
=
cv
::
util
::
get
<
cv
::
GRunArgs
>
(
in_msg
);
// NB: Collect meta from all inputs.
cv
::
GRunArg
::
Meta
stub_meta
;
for
(
auto
&&
in_arg
:
in_vector
)
{
stub_meta
.
insert
(
in_arg
.
meta
.
begin
(),
in_arg
.
meta
.
end
());
}
// (1) Collect island inputs/outputs
input_objs
.
reserve
(
in_desc
.
size
());
...
...
@@ -1084,7 +1093,7 @@ void cv::gimpl::ie::GIEExecutable::run(cv::gimpl::GIslandExecutable::IInput &in
const
auto
&
op
=
m_gm
.
metadata
(
this_nh
).
get
<
Op
>
();
// (2) Create kernel context
auto
ctx
=
std
::
make_shared
<
IECallContext
>
(
uu
,
out
,
op
.
args
,
op
.
outs
,
std
::
move
(
input_objs
),
std
::
move
(
output_objs
));
std
::
move
(
stub_meta
),
std
::
move
(
input_objs
),
std
::
move
(
output_objs
));
const
auto
&
kk
=
giem
.
metadata
(
this_nh
).
get
<
IECallable
>
();
...
...
@@ -1096,6 +1105,7 @@ void cv::gimpl::ie::GIEExecutable::run(cv::gimpl::GIslandExecutable::IInput &in
for
(
auto
i
:
ade
::
util
::
iota
(
ctx
->
uu
.
params
.
num_out
))
{
auto
output
=
ctx
->
output
(
i
);
ctx
->
out
.
meta
(
output
,
ctx
->
getMeta
());
ctx
->
out
.
post
(
std
::
move
(
output
),
eptr
);
}
return
;
...
...
@@ -1247,7 +1257,7 @@ static void PostOutputs(InferenceEngine::InferRequest &request,
IE
::
Blob
::
Ptr
this_blob
=
request
.
GetBlob
(
ctx
->
uu
.
params
.
output_names
[
i
]);
copyFromIE
(
this_blob
,
out_mat
);
auto
output
=
ctx
->
output
(
i
);
ctx
->
out
.
meta
(
output
,
ctx
->
input
(
0
).
meta
);
ctx
->
out
.
meta
(
output
,
ctx
->
getMeta
()
);
ctx
->
out
.
post
(
std
::
move
(
output
),
ctx
->
eptr
);
}
...
...
@@ -1314,7 +1324,7 @@ void PostOutputsList::operator()(InferenceEngine::InferRequest &req,
if
(
finished
==
size
)
{
for
(
auto
i
:
ade
::
util
::
iota
(
ctx
->
uu
.
params
.
num_out
))
{
auto
output
=
ctx
->
output
(
i
);
ctx
->
out
.
meta
(
output
,
ctx
->
input
(
0
).
meta
);
ctx
->
out
.
meta
(
output
,
ctx
->
getMeta
()
);
ctx
->
out
.
post
(
std
::
move
(
output
),
ctx
->
eptr
);
}
}
...
...
@@ -1374,6 +1384,11 @@ struct Infer: public cv::detail::KernelTag {
}
}
for
(
auto
&&
p
:
uu
.
params
.
const_inputs
)
{
const
auto
ii
=
inputs
.
at
(
p
.
first
);
ii
->
setPrecision
(
toIE
(
p
.
second
.
first
.
depth
()));
}
// FIXME: This isn't the best place to call reshape function.
// Сorrect solution would be to do this in compile() method of network,
// but now input meta isn't passed to compile() method.
...
...
@@ -1474,7 +1489,8 @@ struct InferROI: public cv::detail::KernelTag {
// only in the loadNetwork case.
if
(
uu
.
params
.
kind
==
cv
::
gapi
::
ie
::
detail
::
ParamDesc
::
Kind
::
Load
)
{
// 0th is ROI, 1st is input image
auto
ii
=
uu
.
net
.
getInputsInfo
().
at
(
input_name
);
auto
inputs
=
uu
.
net
.
getInputsInfo
();
auto
ii
=
inputs
.
at
(
input_name
);
configureInputInfo
(
ii
,
mm
);
if
(
uu
.
params
.
layer_names_to_reshape
.
find
(
input_name
)
!=
uu
.
params
.
layer_names_to_reshape
.
end
())
{
...
...
@@ -1496,6 +1512,11 @@ struct InferROI: public cv::detail::KernelTag {
const_cast
<
IEUnit
::
InputFramesDesc
&>
(
uu
.
net_input_params
)
.
set_param
(
input_name
,
ii
->
getTensorDesc
());
}
for
(
auto
&&
p
:
uu
.
params
.
const_inputs
)
{
inputs
.
at
(
p
.
first
)
->
setPrecision
(
toIE
(
p
.
second
.
first
.
depth
()));
}
configureOutputPrecision
(
uu
.
net
.
getOutputsInfo
(),
uu
.
params
.
output_precision
);
}
else
{
GAPI_Assert
(
uu
.
params
.
kind
==
cv
::
gapi
::
ie
::
detail
::
ParamDesc
::
Kind
::
Import
);
...
...
@@ -1614,6 +1635,12 @@ struct InferList: public cv::detail::KernelTag {
if
(
!
input_reshape_table
.
empty
())
{
const_cast
<
IE
::
CNNNetwork
*>
(
&
uu
.
net
)
->
reshape
(
input_reshape_table
);
}
for
(
auto
&&
p
:
uu
.
params
.
const_inputs
)
{
const
auto
ii
=
inputs
.
at
(
p
.
first
);
ii
->
setPrecision
(
toIE
(
p
.
second
.
first
.
depth
()));
}
configureOutputPrecision
(
uu
.
net
.
getOutputsInfo
(),
uu
.
params
.
output_precision
);
}
else
{
GAPI_Assert
(
uu
.
params
.
kind
==
cv
::
gapi
::
ie
::
detail
::
ParamDesc
::
Kind
::
Import
);
...
...
@@ -1642,7 +1669,7 @@ struct InferList: public cv::detail::KernelTag {
if
(
in_roi_vec
.
empty
())
{
for
(
auto
i
:
ade
::
util
::
iota
(
ctx
->
uu
.
params
.
num_out
))
{
auto
output
=
ctx
->
output
(
i
);
ctx
->
out
.
meta
(
output
,
ctx
->
input
(
0
).
meta
);
ctx
->
out
.
meta
(
output
,
ctx
->
getMeta
()
);
ctx
->
out
.
post
(
std
::
move
(
output
));
}
return
;
...
...
@@ -1751,8 +1778,9 @@ struct InferList2: public cv::detail::KernelTag {
// NB: Configuring input precision and network reshape must be done
// only in the loadNetwork case.
if
(
uu
.
params
.
kind
==
cv
::
gapi
::
ie
::
detail
::
ParamDesc
::
Kind
::
Load
)
{
auto
inputs
=
uu
.
net
.
getInputsInfo
();
// This is a cv::Rect -- configure the IE preprocessing
auto
ii
=
uu
.
net
.
getInputsInfo
()
.
at
(
input_name
);
auto
ii
=
inputs
.
at
(
input_name
);
configureInputInfo
(
ii
,
mm_0
);
if
(
uu
.
params
.
layer_names_to_reshape
.
find
(
input_name
)
!=
uu
.
params
.
layer_names_to_reshape
.
end
())
{
...
...
@@ -1762,6 +1790,10 @@ struct InferList2: public cv::detail::KernelTag {
ii
->
getPreProcess
().
setResizeAlgorithm
(
IE
::
RESIZE_BILINEAR
);
}
for
(
auto
&&
p
:
uu
.
params
.
const_inputs
)
{
inputs
.
at
(
p
.
first
)
->
setPrecision
(
toIE
(
p
.
second
.
first
.
depth
()));
}
// FIXME: This isn't the best place to call reshape function.
// Сorrect solution would be to do this in compile() method of network,
// but now input meta isn't passed to compile() method.
...
...
@@ -1806,7 +1838,7 @@ struct InferList2: public cv::detail::KernelTag {
if
(
list_size
==
0u
)
{
for
(
auto
i
:
ade
::
util
::
iota
(
ctx
->
uu
.
params
.
num_out
))
{
auto
output
=
ctx
->
output
(
i
);
ctx
->
out
.
meta
(
output
,
ctx
->
input
(
0
).
meta
);
ctx
->
out
.
meta
(
output
,
ctx
->
getMeta
()
);
ctx
->
out
.
post
(
std
::
move
(
output
));
}
return
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录