Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
0d117312
Commit
0d117312
authored
Nov 16, 2018
by
Dmitry Kurtaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
DNN_TARGET_FPGA using Intel's Inference Engine
parent
183bc5c2
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
63 additions
and
36 deletions
+63
-36
dnn.hpp
modules/dnn/include/opencv2/dnn/dnn.hpp
+4
-1
perf_net.cpp
modules/dnn/perf/perf_net.cpp
+1
-1
dnn.cpp
modules/dnn/src/dnn.cpp
+5
-2
convolution_layer.cpp
modules/dnn/src/layers/convolution_layer.cpp
+6
-1
op_inf_engine.cpp
modules/dnn/src/op_inf_engine.cpp
+16
-4
test_common.hpp
modules/dnn/test/test_common.hpp
+5
-4
test_ie_models.cpp
modules/dnn/test/test_ie_models.cpp
+24
-21
test_layers.cpp
modules/dnn/test/test_layers.cpp
+1
-1
test_misc.cpp
modules/dnn/test/test_misc.cpp
+1
-1
No files found.
modules/dnn/include/opencv2/dnn/dnn.hpp
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
(
""
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment