Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenCV
opencv
提交
0d117312
O
opencv
项目概览
OpenCV
/
opencv
上一次同步 9 个月
通知
992
Star
71100
Fork
55581
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0d117312
编写于
11月 16, 2018
作者:
D
Dmitry Kurtaev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
DNN_TARGET_FPGA using Intel's Inference Engine
上级
183bc5c2
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
63 addition
and
36 deletion
+63
-36
modules/dnn/include/opencv2/dnn/dnn.hpp
modules/dnn/include/opencv2/dnn/dnn.hpp
+4
-1
modules/dnn/perf/perf_net.cpp
modules/dnn/perf/perf_net.cpp
+1
-1
modules/dnn/src/dnn.cpp
modules/dnn/src/dnn.cpp
+5
-2
modules/dnn/src/layers/convolution_layer.cpp
modules/dnn/src/layers/convolution_layer.cpp
+6
-1
modules/dnn/src/op_inf_engine.cpp
modules/dnn/src/op_inf_engine.cpp
+16
-4
modules/dnn/test/test_common.hpp
modules/dnn/test/test_common.hpp
+5
-4
modules/dnn/test/test_ie_models.cpp
modules/dnn/test/test_ie_models.cpp
+24
-21
modules/dnn/test/test_layers.cpp
modules/dnn/test/test_layers.cpp
+1
-1
modules/dnn/test/test_misc.cpp
modules/dnn/test/test_misc.cpp
+1
-1
未找到文件。
modules/dnn/include/opencv2/dnn/dnn.hpp
浏览文件 @
0d117312
...
...
@@ -88,7 +88,9 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
DNN_TARGET_CPU
,
DNN_TARGET_OPENCL
,
DNN_TARGET_OPENCL_FP16
,
DNN_TARGET_MYRIAD
DNN_TARGET_MYRIAD
,
//! FPGA device with CPU fallbacks using Inference Engine's Heterogeneous plugin.
DNN_TARGET_FPGA
};
/** @brief This class provides all data needed to initialize layer.
...
...
@@ -501,6 +503,7 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
* | DNN_TARGET_OPENCL | + | + | + |
* | DNN_TARGET_OPENCL_FP16 | + | + | |
* | DNN_TARGET_MYRIAD | | + | |
* | DNN_TARGET_FPGA | | + | |
*/
CV_WRAP
void
setPreferableTarget
(
int
targetId
);
...
...
modules/dnn/perf/perf_net.cpp
浏览文件 @
0d117312
...
...
@@ -42,7 +42,7 @@ public:
}
if
(
backend
==
DNN_BACKEND_INFERENCE_ENGINE
&&
target
==
DNN_TARGET_MYRIAD
)
{
if
(
!
check
MyriadTarget
(
))
if
(
!
check
IETarget
(
DNN_TARGET_MYRIAD
))
{
throw
SkipTestException
(
"Myriad is not available/disabled in OpenCV"
);
}
...
...
modules/dnn/src/dnn.cpp
浏览文件 @
0d117312
...
...
@@ -1077,7 +1077,8 @@ struct Net::Impl
preferableTarget
==
DNN_TARGET_CPU
||
preferableTarget
==
DNN_TARGET_OPENCL
||
preferableTarget
==
DNN_TARGET_OPENCL_FP16
||
preferableTarget
==
DNN_TARGET_MYRIAD
);
preferableTarget
==
DNN_TARGET_MYRIAD
||
preferableTarget
==
DNN_TARGET_FPGA
);
if
(
!
netWasAllocated
||
this
->
blobsToKeep
!=
blobsToKeep_
)
{
if
(
preferableBackend
==
DNN_BACKEND_OPENCV
&&
IS_DNN_OPENCL_TARGET
(
preferableTarget
))
...
...
@@ -1512,7 +1513,9 @@ struct Net::Impl
ieNode
->
net
=
net
;
auto
weightableLayer
=
std
::
dynamic_pointer_cast
<
InferenceEngine
::
WeightableLayer
>
(
ieNode
->
layer
);
if
((
preferableTarget
==
DNN_TARGET_OPENCL_FP16
||
preferableTarget
==
DNN_TARGET_MYRIAD
)
&&
!
fused
)
if
((
preferableTarget
==
DNN_TARGET_OPENCL_FP16
||
preferableTarget
==
DNN_TARGET_MYRIAD
||
preferableTarget
==
DNN_TARGET_FPGA
)
&&
!
fused
)
{
ieNode
->
layer
->
precision
=
InferenceEngine
::
Precision
::
FP16
;
if
(
weightableLayer
)
...
...
modules/dnn/src/layers/convolution_layer.cpp
浏览文件 @
0d117312
...
...
@@ -219,9 +219,14 @@ public:
virtual
bool
supportBackend
(
int
backendId
)
CV_OVERRIDE
{
#ifdef HAVE_INF_ENGINE
if
(
backendId
==
DNN_BACKEND_INFERENCE_ENGINE
)
return
preferableTarget
!=
DNN_TARGET_MYRIAD
||
dilation
.
width
==
dilation
.
height
;
{
return
INF_ENGINE_VER_MAJOR_GE
(
INF_ENGINE_RELEASE_2018R4
)
||
(
preferableTarget
!=
DNN_TARGET_MYRIAD
||
dilation
.
width
==
dilation
.
height
);
}
else
#endif
return
backendId
==
DNN_BACKEND_OPENCV
||
backendId
==
DNN_BACKEND_HALIDE
;
}
...
...
modules/dnn/src/op_inf_engine.cpp
浏览文件 @
0d117312
...
...
@@ -302,7 +302,8 @@ void InfEngineBackendNet::setTargetDevice(InferenceEngine::TargetDevice device)
{
if
(
device
!=
InferenceEngine
::
TargetDevice
::
eCPU
&&
device
!=
InferenceEngine
::
TargetDevice
::
eGPU
&&
device
!=
InferenceEngine
::
TargetDevice
::
eMYRIAD
)
device
!=
InferenceEngine
::
TargetDevice
::
eMYRIAD
&&
device
!=
InferenceEngine
::
TargetDevice
::
eFPGA
)
CV_Error
(
Error
::
StsNotImplemented
,
""
);
targetDevice
=
device
;
}
...
...
@@ -314,7 +315,8 @@ InferenceEngine::TargetDevice InfEngineBackendNet::getTargetDevice() noexcept
InferenceEngine
::
TargetDevice
InfEngineBackendNet
::
getTargetDevice
()
const
noexcept
{
return
targetDevice
;
return
targetDevice
==
InferenceEngine
::
TargetDevice
::
eFPGA
?
InferenceEngine
::
TargetDevice
::
eHETERO
:
targetDevice
;
}
InferenceEngine
::
StatusCode
InfEngineBackendNet
::
setBatchSize
(
const
size_t
)
noexcept
...
...
@@ -466,6 +468,11 @@ void InfEngineBackendNet::init(int targetId)
setPrecision
(
InferenceEngine
::
Precision
::
FP16
);
setTargetDevice
(
InferenceEngine
::
TargetDevice
::
eMYRIAD
);
break
;
}
case
DNN_TARGET_FPGA
:
{
setPrecision
(
InferenceEngine
::
Precision
::
FP16
);
setTargetDevice
(
InferenceEngine
::
TargetDevice
::
eFPGA
);
break
;
}
default:
CV_Error
(
Error
::
StsError
,
format
(
"Unknown target identifier: %d"
,
targetId
));
}
...
...
@@ -489,10 +496,15 @@ void InfEngineBackendNet::initPlugin(InferenceEngine::ICNNNetwork& net)
}
else
{
enginePtr
=
InferenceEngine
::
PluginDispatcher
({
""
}).
getSuitablePlugin
(
targetDevice
);
auto
dispatcher
=
InferenceEngine
::
PluginDispatcher
({
""
});
if
(
targetDevice
==
InferenceEngine
::
TargetDevice
::
eFPGA
)
enginePtr
=
dispatcher
.
getPluginByDevice
(
"HETERO:FPGA,CPU"
);
else
enginePtr
=
dispatcher
.
getSuitablePlugin
(
targetDevice
);
sharedPlugins
[
targetDevice
]
=
enginePtr
;
if
(
targetDevice
==
InferenceEngine
::
TargetDevice
::
eCPU
)
if
(
targetDevice
==
InferenceEngine
::
TargetDevice
::
eCPU
||
targetDevice
==
InferenceEngine
::
TargetDevice
::
eFPGA
)
{
std
::
string
suffixes
[]
=
{
"_avx2"
,
"_sse4"
,
""
};
bool
haveFeature
[]
=
{
...
...
modules/dnn/test/test_common.hpp
浏览文件 @
0d117312
...
...
@@ -66,6 +66,7 @@ static inline void PrintTo(const cv::dnn::Target& v, std::ostream* os)
case
DNN_TARGET_OPENCL
:
*
os
<<
"OCL"
;
return
;
case
DNN_TARGET_OPENCL_FP16
:
*
os
<<
"OCL_FP16"
;
return
;
case
DNN_TARGET_MYRIAD
:
*
os
<<
"MYRIAD"
;
return
;
case
DNN_TARGET_FPGA
:
*
os
<<
"FPGA"
;
return
;
}
// don't use "default:" to emit compiler warnings
*
os
<<
"DNN_TARGET_UNKNOWN("
<<
(
int
)
v
<<
")"
;
}
...
...
@@ -188,7 +189,7 @@ static inline void normAssertDetections(cv::Mat ref, cv::Mat out, const char *co
testBoxes
,
comment
,
confThreshold
,
scores_diff
,
boxes_iou_diff
);
}
static
inline
bool
check
MyriadTarget
(
)
static
inline
bool
check
IETarget
(
int
target
)
{
#ifndef HAVE_INF_ENGINE
return
false
;
...
...
@@ -197,7 +198,7 @@ static inline bool checkMyriadTarget()
cv
::
dnn
::
LayerParams
lp
;
net
.
addLayerToPrev
(
"testLayer"
,
"Identity"
,
lp
);
net
.
setPreferableBackend
(
cv
::
dnn
::
DNN_BACKEND_INFERENCE_ENGINE
);
net
.
setPreferableTarget
(
cv
::
dnn
::
DNN_TARGET_MYRIAD
);
net
.
setPreferableTarget
(
target
);
static
int
inpDims
[]
=
{
1
,
2
,
3
,
4
};
net
.
setInput
(
cv
::
Mat
(
4
,
&
inpDims
[
0
],
CV_32FC1
,
cv
::
Scalar
(
0
)));
try
...
...
@@ -264,7 +265,7 @@ testing::internal::ParamGenerator<tuple<Backend, Target> > dnnBackendsAndTargets
targets
.
push_back
(
make_tuple
(
DNN_BACKEND_INFERENCE_ENGINE
,
DNN_TARGET_OPENCL_FP16
));
}
#endif
if
(
check
MyriadTarget
(
))
if
(
check
IETarget
(
DNN_TARGET_MYRIAD
))
targets
.
push_back
(
make_tuple
(
DNN_BACKEND_INFERENCE_ENGINE
,
DNN_TARGET_MYRIAD
));
}
#endif
...
...
@@ -344,7 +345,7 @@ public:
}
if
(
backend
==
DNN_BACKEND_INFERENCE_ENGINE
&&
target
==
DNN_TARGET_MYRIAD
)
{
if
(
!
check
MyriadTarget
(
))
if
(
!
check
IETarget
(
DNN_TARGET_MYRIAD
))
{
throw
SkipTestException
(
"Myriad is not available/disabled in OpenCV"
);
}
...
...
modules/dnn/test/test_ie_models.cpp
浏览文件 @
0d117312
...
...
@@ -57,28 +57,29 @@ void runIE(Target target, const std::string& xmlPath, const std::string& binPath
InferencePlugin
plugin
;
ExecutableNetwork
netExec
;
InferRequest
infRequest
;
TargetDevice
targetDevice
;
switch
(
target
)
{
case
DNN_TARGET_CPU
:
targetDevice
=
TargetDevice
::
eCPU
;
break
;
case
DNN_TARGET_OPENCL
:
case
DNN_TARGET_OPENCL_FP16
:
targetDevice
=
TargetDevice
::
eGPU
;
break
;
case
DNN_TARGET_MYRIAD
:
targetDevice
=
TargetDevice
::
eMYRIAD
;
break
;
default:
CV_Error
(
Error
::
StsNotImplemented
,
"Unknown target"
);
};
try
{
enginePtr
=
PluginDispatcher
({
""
}).
getSuitablePlugin
(
targetDevice
);
if
(
targetDevice
==
TargetDevice
::
eCPU
)
auto
dispatcher
=
InferenceEngine
::
PluginDispatcher
({
""
});
switch
(
target
)
{
case
DNN_TARGET_CPU
:
enginePtr
=
dispatcher
.
getSuitablePlugin
(
TargetDevice
::
eCPU
);
break
;
case
DNN_TARGET_OPENCL
:
case
DNN_TARGET_OPENCL_FP16
:
enginePtr
=
dispatcher
.
getSuitablePlugin
(
TargetDevice
::
eGPU
);
break
;
case
DNN_TARGET_MYRIAD
:
enginePtr
=
dispatcher
.
getSuitablePlugin
(
TargetDevice
::
eMYRIAD
);
break
;
case
DNN_TARGET_FPGA
:
enginePtr
=
dispatcher
.
getPluginByDevice
(
"HETERO:FPGA,CPU"
);
break
;
default:
CV_Error
(
Error
::
StsNotImplemented
,
"Unknown target"
);
};
if
(
target
==
DNN_TARGET_CPU
||
target
==
DNN_TARGET_FPGA
)
{
std
::
string
suffixes
[]
=
{
"_avx2"
,
"_sse4"
,
""
};
bool
haveFeature
[]
=
{
...
...
@@ -255,8 +256,10 @@ static testing::internal::ParamGenerator<Target> dnnDLIETargets()
targets
.
push_back
(
DNN_TARGET_OPENCL_FP16
);
}
#endif
if
(
check
MyriadTarget
(
))
if
(
check
IETarget
(
DNN_TARGET_MYRIAD
))
targets
.
push_back
(
DNN_TARGET_MYRIAD
);
if
(
checkIETarget
(
DNN_TARGET_FPGA
))
targets
.
push_back
(
DNN_TARGET_FPGA
);
return
testing
::
ValuesIn
(
targets
);
}
...
...
modules/dnn/test/test_layers.cpp
浏览文件 @
0d117312
...
...
@@ -351,7 +351,7 @@ TEST_P(Test_Caffe_layers, Conv_Elu)
{
if
(
backend
==
DNN_BACKEND_INFERENCE_ENGINE
&&
target
==
DNN_TARGET_MYRIAD
)
{
if
(
!
check
MyriadTarget
(
))
if
(
!
check
IETarget
(
DNN_TARGET_MYRIAD
))
throw
SkipTestException
(
"Myriad is not available/disabled in OpenCV"
);
}
...
...
modules/dnn/test/test_misc.cpp
浏览文件 @
0d117312
...
...
@@ -157,7 +157,7 @@ TEST_P(setInput, normalization)
const
int
target
=
get
<
1
>
(
get
<
3
>
(
GetParam
()));
const
bool
kSwapRB
=
true
;
if
(
backend
==
DNN_BACKEND_INFERENCE_ENGINE
&&
target
==
DNN_TARGET_MYRIAD
&&
!
check
MyriadTarget
(
))
if
(
backend
==
DNN_BACKEND_INFERENCE_ENGINE
&&
target
==
DNN_TARGET_MYRIAD
&&
!
check
IETarget
(
DNN_TARGET_MYRIAD
))
throw
SkipTestException
(
"Myriad is not available/disabled in OpenCV"
);
if
(
backend
==
DNN_BACKEND_OPENCV
&&
target
==
DNN_TARGET_OPENCL_FP16
&&
dtype
!=
CV_32F
)
throw
SkipTestException
(
""
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录